65 lines
2.5 KiB
CMake
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()
|