Files
taskwarrior-2.x/cmake/CMakeRust/cmake/CargoLink.cmake
Dathan Bennett 7492fc48bb Vendor CMakeRust
2023-04-27 19:18:10 -04:00

65 lines
2.5 KiB
CMake

function(cargo_print)
execute_process(COMMAND ${CMAKE_COMMAND} -E echo "${ARGN}")
endfunction()
function(cargo_link)
cmake_parse_arguments(CARGO_LINK "" "NAME" "TARGETS;EXCLUDE" ${ARGN})
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/cargo-link.c" "void cargo_link() {}")
add_library(${CARGO_LINK_NAME} "${CMAKE_CURRENT_BINARY_DIR}/cargo-link.c")
target_link_libraries(${CARGO_LINK_NAME} ${CARGO_LINK_TARGETS})
get_target_property(LINK_LIBRARIES ${CARGO_LINK_NAME} LINK_LIBRARIES)
foreach(LINK_LIBRARY ${LINK_LIBRARIES})
get_target_property(_INTERFACE_LINK_LIBRARIES ${LINK_LIBRARY} INTERFACE_LINK_LIBRARIES)
list(APPEND LINK_LIBRARIES ${_INTERFACE_LINK_LIBRARIES})
endforeach()
list(REMOVE_DUPLICATES LINK_LIBRARIES)
if(CARGO_LINK_EXCLUDE)
list(REMOVE_ITEM LINK_LIBRARIES ${CARGO_LINK_EXCLUDE})
endif()
set(LINK_DIRECTORIES "")
foreach(LINK_LIBRARY ${LINK_LIBRARIES})
if(TARGET ${LINK_LIBRARY})
get_target_property(_IMPORTED_CONFIGURATIONS ${LINK_LIBRARY} IMPORTED_CONFIGURATIONS)
list(FIND _IMPORTED_CONFIGURATIONS "RELEASE" _IMPORTED_CONFIGURATION_INDEX)
if (NOT (${_IMPORTED_CONFIGURATION_INDEX} GREATER -1))
set(_IMPORTED_CONFIGURATION_INDEX 0)
endif()
list(GET _IMPORTED_CONFIGURATIONS ${_IMPORTED_CONFIGURATION_INDEX} _IMPORTED_CONFIGURATION)
get_target_property(_IMPORTED_LOCATION ${LINK_LIBRARY} "IMPORTED_LOCATION_${_IMPORTED_CONFIGURATION}")
get_filename_component(_IMPORTED_DIR ${_IMPORTED_LOCATION} DIRECTORY)
get_filename_component(_IMPORTED_NAME ${_IMPORTED_LOCATION} NAME_WE)
if(NOT WIN32)
string(REGEX REPLACE "^lib" "" _IMPORTED_NAME ${_IMPORTED_NAME})
endif()
list(APPEND LINK_DIRECTORIES ${_IMPORTED_DIR})
cargo_print("cargo:rustc-link-lib=static=${_IMPORTED_NAME}")
else()
if("${LINK_LIBRARY}" MATCHES "^.*/(.+)\\.framework$")
set(FRAMEWORK_NAME ${CMAKE_MATCH_1})
cargo_print("cargo:rustc-link-lib=framework=${FRAMEWORK_NAME}")
elseif("${LINK_LIBRARY}" MATCHES "^(.*)/(.+)\\.so$")
set(LIBRARY_DIR ${CMAKE_MATCH_1})
set(LIBRARY_NAME ${CMAKE_MATCH_2})
if(NOT WIN32)
string(REGEX REPLACE "^lib" "" LIBRARY_NAME ${LIBRARY_NAME})
endif()
list(APPEND LINK_DIRECTORIES ${LIBRARY_DIR})
cargo_print("cargo:rustc-link-lib=${LIBRARY_NAME}")
else()
cargo_print("cargo:rustc-link-lib=${LINK_LIBRARY}")
endif()
endif()
endforeach()
list(REMOVE_DUPLICATES LINK_DIRECTORIES)
foreach(LINK_DIRECTORY ${LINK_DIRECTORIES})
cargo_print("cargo:rustc-link-search=native=${LINK_DIRECTORY}")
endforeach()
endfunction()