1 function(core_link_library lib wraplib)
3 # Somewhere after cmake 3.21 the xcode generation moves this into its out intermediate folder
4 # ideally we want to use $<TARGET_OBJECTS:wrapper> instead of all this wrapper_obj stuff
5 # however as at 3.26.4, even with the XCODE_EMIT_EFFECTIVE_PLATFORM_NAME property
6 # the intermediate config dirs are the same as $(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
7 # but the generator expression only uses $(CONFIGURATION) in the paths returned.
8 # Somewhat similar to https://gitlab.kitware.com/cmake/cmake/-/issues/24024
9 if(CMAKE_XCODE_BUILD_SYSTEM STREQUAL 12)
10 set(wrapper_obj wrapper.build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Objects-$CURRENT_VARIANT/${CPU}/wrapper.o)
12 set(wrapper_obj wrapper.build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Objects-$(CURRENT_VARIANT)/${CPU}/wrapper.o)
15 set(export -bundle -undefined dynamic_lookup
16 -Wl,-alias_list,${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/cores/dll-loader/exports/wrapper.def
17 ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${wrapper_obj})
18 set(extension ${CMAKE_SHARED_MODULE_SUFFIX})
22 set(link_lib $<TARGET_FILE:${lib}>)
23 set(check_arg ${ARGV2})
24 set(data_arg ${ARGV3})
29 set(check_arg ${ARGV3})
30 set(data_arg ${ARGV4})
32 if(check_arg STREQUAL export)
34 -Wl,--version-script=${ARGV3})
35 elseif(check_arg STREQUAL extras)
36 foreach(arg ${data_arg})
37 list(APPEND export ${arg})
39 elseif(check_arg STREQUAL archives)
40 foreach(_data_arg ${data_arg})
41 if(TARGET ${_data_arg})
42 list(APPEND extra_libs $<TARGET_FILE:${_data_arg}>)
44 list(APPEND extra_libs ${_data_arg})
48 get_filename_component(dir ${wraplib} DIRECTORY)
50 # We can't simply pass the linker flags to the args section of the custom command
51 # because cmake will add quotes around it (and the linker will fail due to those).
52 # We need to do this handstand first ...
53 string(REPLACE " " ";" CUSTOM_COMMAND_ARGS_LDFLAGS ${CMAKE_SHARED_LINKER_FLAGS})
55 add_custom_command(OUTPUT ${wraplib}-${ARCH}${extension}
56 COMMAND ${CMAKE_COMMAND} -E make_directory ${dir}
57 COMMAND ${CMAKE_C_COMPILER}
58 ARGS ${CUSTOM_COMMAND_ARGS_LDFLAGS} ${export} -Wl,-force_load ${link_lib} ${extra_libs}
59 -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${extension}
60 DEPENDS ${target} wrapper.def wrapper)
62 get_filename_component(libname ${wraplib} NAME_WE)
63 add_custom_target(wrap_${libname} ALL DEPENDS ${wraplib}-${ARCH}${extension})
64 set_target_properties(wrap_${libname} PROPERTIES FOLDER lib/wrapped)
65 add_dependencies(${APP_NAME_LC}-libraries wrap_${libname})
67 set(LIBRARY_FILES ${LIBRARY_FILES} ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${extension} CACHE STRING "" FORCE)
70 function(find_soname lib)
71 cmake_parse_arguments(arg "REQUIRED" "" "" ${ARGN})
73 string(TOLOWER ${lib} liblow)
75 set(link_lib "${${lib}_LDFLAGS}")
77 set(link_lib "${${lib}_LIBRARIES}")
80 execute_process(COMMAND ${CMAKE_C_COMPILER} -print-search-dirs
81 COMMAND fgrep libraries:
82 COMMAND sed "s/[^=]*=\\(.*\\)/\\1/"
85 OUTPUT_VARIABLE cc_lib_path
86 OUTPUT_STRIP_TRAILING_WHITESPACE)
87 execute_process(COMMAND echo ${link_lib}
88 COMMAND sed "s/-L[ ]*//g"
89 COMMAND sed "s/-l[^ ]*//g"
91 OUTPUT_VARIABLE env_lib_path
92 OUTPUT_STRIP_TRAILING_WHITESPACE)
94 foreach(path ${cc_lib_path} ${env_lib_path})
95 if(IS_DIRECTORY ${path})
96 execute_process(COMMAND ls -- ${path}/lib${liblow}.dylib
98 OUTPUT_VARIABLE lib_file
99 OUTPUT_STRIP_TRAILING_WHITESPACE)
101 set(lib_file ${path})
104 # we want the path/name that is embedded in the dylib
105 execute_process(COMMAND otool -L ${lib_file}
106 COMMAND grep -v lib${liblow}.dylib
107 COMMAND grep ${liblow}
108 COMMAND awk "{V=1; print $V}"
110 OUTPUT_VARIABLE filename
111 OUTPUT_STRIP_TRAILING_WHITESPACE)
112 get_filename_component(${lib}_SONAME "${filename}" NAME)
114 message(STATUS "${lib} soname: ${${lib}_SONAME}")
118 if(arg_REQUIRED AND NOT ${lib}_SONAME)
119 message(FATAL_ERROR "Could not find dynamically loadable library ${lib}")
121 set(${lib}_SONAME ${${lib}_SONAME} PARENT_SCOPE)