Merge pull request #25883 from CrystalP/fix-slowscan
[xbmc.git] / cmake / scripts / darwin_embedded / Macros.cmake
blob1aee7a293961eaa1cd3ece7214ff4c85d45fe604
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)
11   else()
12     set(wrapper_obj wrapper.build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Objects-$(CURRENT_VARIANT)/${CPU}/wrapper.o)
13   endif()
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})
19   set(check_arg "")
20   if(TARGET ${lib})
21     set(target ${lib})
22     set(link_lib $<TARGET_FILE:${lib}>)
23     set(check_arg ${ARGV2})
24     set(data_arg  ${ARGV3})
26   else()
27     set(target ${ARGV2})
28     set(link_lib ${lib})
29     set(check_arg ${ARGV3})
30     set(data_arg ${ARGV4})
31   endif()
32   if(check_arg STREQUAL export)
33     set(export ${export}
34         -Wl,--version-script=${ARGV3})
35   elseif(check_arg STREQUAL extras)
36     foreach(arg ${data_arg})
37       list(APPEND export ${arg})
38     endforeach()
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}>)
43       else()
44         list(APPEND extra_libs ${_data_arg})
45       endif()
46     endforeach()
47   endif()
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)
68 endfunction()
70 function(find_soname lib)
71   cmake_parse_arguments(arg "REQUIRED" "" "" ${ARGN})
73   string(TOLOWER ${lib} liblow)
74   if(${lib}_LDFLAGS)
75     set(link_lib "${${lib}_LDFLAGS}")
76   else()
77     set(link_lib "${${lib}_LIBRARIES}")
78   endif()
80   execute_process(COMMAND ${CMAKE_C_COMPILER} -print-search-dirs
81                   COMMAND fgrep libraries:
82                   COMMAND sed "s/[^=]*=\\(.*\\)/\\1/"
83                   COMMAND sed "s/:/ /g"
84                   ERROR_QUIET
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"
90                   ERROR_QUIET
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
97                       ERROR_QUIET
98                       OUTPUT_VARIABLE lib_file
99                       OUTPUT_STRIP_TRAILING_WHITESPACE)
100     else()
101       set(lib_file ${path})
102     endif()
103     if(lib_file)
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}"
109                       ERROR_QUIET
110                       OUTPUT_VARIABLE filename
111                       OUTPUT_STRIP_TRAILING_WHITESPACE)
112       get_filename_component(${lib}_SONAME "${filename}" NAME)
113       if(VERBOSE)
114         message(STATUS "${lib} soname: ${${lib}_SONAME}")
115       endif()
116     endif()
117   endforeach()
118   if(arg_REQUIRED AND NOT ${lib}_SONAME)
119     message(FATAL_ERROR "Could not find dynamically loadable library ${lib}")
120   endif()
121   set(${lib}_SONAME ${${lib}_SONAME} PARENT_SCOPE)
122 endfunction()