mirror of
https://github.com/encounter/nod.git
synced 2026-07-10 12:18:48 -07:00
CMake: Add fallback when failing to determine link dir
This commit is contained in:
+24
-6
@@ -55,30 +55,48 @@ if (NOD_COMPRESS_BZIP2)
|
||||
nod_require_bzip2(_nod_bzip2_target)
|
||||
target_link_libraries(nod_ffi INTERFACE "${_nod_bzip2_target}")
|
||||
nod_resolve_corrosion_link_input(_nod_bzip2_rust_link "${_nod_bzip2_target}" "bz2")
|
||||
# Global flags are needed since the #[link] directives are in the `nod` dependency crate,
|
||||
# not in nod-ffi itself.
|
||||
corrosion_add_target_rustflags(nod_ffi "-L" "$<TARGET_LINKER_FILE_DIR:${_nod_bzip2_rust_link}>")
|
||||
nod_get_target_linker_dir(_nod_bzip2_linker_dir "${_nod_bzip2_rust_link}")
|
||||
if (_nod_bzip2_linker_dir)
|
||||
corrosion_add_target_rustflags(nod_ffi "-L" "${_nod_bzip2_linker_dir}")
|
||||
else()
|
||||
corrosion_link_libraries(nod_ffi "${_nod_bzip2_rust_link}")
|
||||
endif()
|
||||
add_dependencies(_cargo-build_nod_ffi "${_nod_bzip2_rust_link}")
|
||||
endif()
|
||||
if (NOD_COMPRESS_LZMA)
|
||||
nod_require_liblzma(_nod_liblzma_target)
|
||||
target_link_libraries(nod_ffi INTERFACE "${_nod_liblzma_target}")
|
||||
nod_resolve_corrosion_link_input(_nod_liblzma_rust_link "${_nod_liblzma_target}" "lzma")
|
||||
corrosion_add_target_rustflags(nod_ffi "-L" "$<TARGET_LINKER_FILE_DIR:${_nod_liblzma_rust_link}>")
|
||||
nod_get_target_linker_dir(_nod_liblzma_linker_dir "${_nod_liblzma_rust_link}")
|
||||
if (_nod_liblzma_linker_dir)
|
||||
corrosion_add_target_rustflags(nod_ffi "-L" "${_nod_liblzma_linker_dir}")
|
||||
else()
|
||||
corrosion_link_libraries(nod_ffi "${_nod_liblzma_rust_link}")
|
||||
endif()
|
||||
add_dependencies(_cargo-build_nod_ffi "${_nod_liblzma_rust_link}")
|
||||
endif()
|
||||
if (NOD_COMPRESS_ZLIB)
|
||||
nod_require_zlib(_nod_zlib_target)
|
||||
target_link_libraries(nod_ffi INTERFACE "${_nod_zlib_target}")
|
||||
nod_resolve_corrosion_link_input(_nod_zlib_rust_link "${_nod_zlib_target}" "z")
|
||||
corrosion_add_target_rustflags(nod_ffi "-L" "$<TARGET_LINKER_FILE_DIR:${_nod_zlib_rust_link}>")
|
||||
nod_get_target_linker_dir(_nod_zlib_linker_dir "${_nod_zlib_rust_link}")
|
||||
if (_nod_zlib_linker_dir)
|
||||
corrosion_add_target_rustflags(nod_ffi "-L" "${_nod_zlib_linker_dir}")
|
||||
else()
|
||||
corrosion_link_libraries(nod_ffi "${_nod_zlib_rust_link}")
|
||||
endif()
|
||||
add_dependencies(_cargo-build_nod_ffi "${_nod_zlib_rust_link}")
|
||||
endif()
|
||||
if (NOD_COMPRESS_ZSTD)
|
||||
nod_require_zstd(_nod_zstd_target)
|
||||
target_link_libraries(nod_ffi INTERFACE "${_nod_zstd_target}")
|
||||
nod_resolve_corrosion_link_input(_nod_zstd_rust_link "${_nod_zstd_target}" "zstd")
|
||||
corrosion_add_target_rustflags(nod_ffi "-L" "$<TARGET_LINKER_FILE_DIR:${_nod_zstd_rust_link}>")
|
||||
nod_get_target_linker_dir(_nod_zstd_linker_dir "${_nod_zstd_rust_link}")
|
||||
if (_nod_zstd_linker_dir)
|
||||
corrosion_add_target_rustflags(nod_ffi "-L" "${_nod_zstd_linker_dir}")
|
||||
else()
|
||||
corrosion_link_libraries(nod_ffi "${_nod_zstd_rust_link}")
|
||||
endif()
|
||||
add_dependencies(_cargo-build_nod_ffi "${_nod_zstd_rust_link}")
|
||||
endif()
|
||||
|
||||
|
||||
@@ -69,6 +69,70 @@ function(nod_resolve_corrosion_link_input out_var input_link rust_link_name)
|
||||
set("${out_var}" "${input_link}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(nod_get_target_linker_dir out_var target_name)
|
||||
set(_resolved "")
|
||||
if (TARGET "${target_name}")
|
||||
get_target_property(_imported "${target_name}" IMPORTED)
|
||||
if (_imported)
|
||||
foreach(_prop
|
||||
IMPORTED_LOCATION
|
||||
IMPORTED_LOCATION_RELEASE
|
||||
IMPORTED_LOCATION_RELWITHDEBINFO
|
||||
IMPORTED_LOCATION_MINSIZEREL
|
||||
IMPORTED_LOCATION_DEBUG
|
||||
IMPORTED_IMPLIB
|
||||
IMPORTED_IMPLIB_RELEASE
|
||||
IMPORTED_IMPLIB_RELWITHDEBINFO
|
||||
IMPORTED_IMPLIB_MINSIZEREL
|
||||
IMPORTED_IMPLIB_DEBUG
|
||||
LOCATION
|
||||
)
|
||||
get_target_property(_loc "${target_name}" "${_prop}")
|
||||
if (_loc AND IS_ABSOLUTE "${_loc}")
|
||||
get_filename_component(_resolved "${_loc}" DIRECTORY)
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
if (NOT _resolved)
|
||||
get_target_property(_target_type "${target_name}" TYPE)
|
||||
if (_target_type STREQUAL "STATIC_LIBRARY")
|
||||
set(_dir_prop "ARCHIVE_OUTPUT_DIRECTORY")
|
||||
elseif(_target_type STREQUAL "SHARED_LIBRARY" OR _target_type STREQUAL "MODULE_LIBRARY")
|
||||
set(_dir_prop "LIBRARY_OUTPUT_DIRECTORY")
|
||||
elseif(_target_type STREQUAL "EXECUTABLE")
|
||||
set(_dir_prop "RUNTIME_OUTPUT_DIRECTORY")
|
||||
else()
|
||||
set(_dir_prop "")
|
||||
endif()
|
||||
|
||||
if (_dir_prop)
|
||||
if (CMAKE_BUILD_TYPE)
|
||||
string(TOUPPER "${CMAKE_BUILD_TYPE}" _cfg)
|
||||
get_target_property(_resolved "${target_name}" "${_dir_prop}_${_cfg}")
|
||||
endif()
|
||||
if (NOT _resolved)
|
||||
get_target_property(_resolved "${target_name}" "${_dir_prop}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (NOT _resolved)
|
||||
get_target_property(_resolved "${target_name}" BINARY_DIR)
|
||||
endif()
|
||||
|
||||
if (_resolved)
|
||||
string(GENEX_STRIP "${_resolved}" _resolved_no_genex)
|
||||
if (_resolved_no_genex)
|
||||
set(_resolved "${_resolved_no_genex}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set("${out_var}" "${_resolved}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(nod_require_bzip2 out_target)
|
||||
nod_first_available_target(_bzip2_target bz2_static BZip2::BZip2 bz2)
|
||||
if (_bzip2_target)
|
||||
@@ -174,7 +238,9 @@ function(nod_require_zstd out_target)
|
||||
nod_first_available_target(
|
||||
_zstd_target
|
||||
zstd::libzstd_static
|
||||
libzstd_static
|
||||
zstd::libzstd
|
||||
libzstd
|
||||
)
|
||||
if (_zstd_target)
|
||||
message(STATUS "nod: Linking zstd target ${_zstd_target}")
|
||||
@@ -187,7 +253,9 @@ function(nod_require_zstd out_target)
|
||||
nod_first_available_target(
|
||||
_zstd_target
|
||||
zstd::libzstd_static
|
||||
libzstd_static
|
||||
zstd::libzstd
|
||||
libzstd
|
||||
)
|
||||
if (_zstd_target)
|
||||
message(STATUS "nod: Linking zstd target ${_zstd_target}")
|
||||
|
||||
Reference in New Issue
Block a user