diff --git a/README.md b/README.md index 39e1105b..6484b94b 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,8 @@ For example, if we want to use the same python3 executable on target and host bu + Option(Optional): `PROJECT_THIRD_PARTY_PACKAGE_DIR` : Where to place package sources. + Option(Optional): `PROJECT_THIRD_PARTY_INSTALL_DIR` : Where to place installed packages. + Option(Optional): `PROJECT_THIRD_PARTY_HOST_INSTALL_DIR` : Where to place installed packages of host system. ++ Option(Optional): `ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_USE_ABSOLUTE_RPATH` : Use absolute third-party prefix paths + instead of loader-relative paths for additional build `RPATH` entries(default: `OFF`). + Option(Optional): `FindConfigurePackageGitFetchDepth` : Fetch depth og git repository. + Option(Optional): `ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_BUILD_DIR` : Where to build packages. + Option(Optional): `ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_HOST_BUILD_DIR` : Where to build packages of host system. @@ -240,6 +242,10 @@ For example, if we want to use the same python3 executable on target and host bu + Option(Optional): `ATFRAMEWORK_CMAKE_TOOLSET_CLEANUP_BUILD_CACHE` : Cleanup build cache directory after a package is built successfully. + Option(Optional): `ATFRAMEWORK_CMAKE_TOOLSET_CLEANUP_PACKAGE_SOURCE_DIR` : Cleanup souce cache directory after a package is built successfully. +cmake-toolset does not modify `LD_LIBRARY_PATH`. Additional build `RPATH` entries use `$ORIGIN` on Unix or +`@loader_path` on Apple by default; set `ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_USE_ABSOLUTE_RPATH=ON` to use absolute +third-party prefix paths instead. Windows DLL lookup continues to use `PATH`. + ```cmake # set(PROJECT_THIRD_PARTY_PACKAGE_DIR "${PROJECT_SOURCE_DIR}/third_party/packages") # set(PROJECT_THIRD_PARTY_INSTALL_DIR "${PROJECT_SOURCE_DIR}/third_party/install/${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_CXX_COMPILER_ID}") diff --git a/ci/do_ci.sh b/ci/do_ci.sh index bdc645c6..35b12e15 100644 --- a/ci/do_ci.sh +++ b/ci/do_ci.sh @@ -3,6 +3,7 @@ cd "$(cd "$(dirname $0)" && pwd)/.." set -ex +unset LD_LIBRARY_PATH export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 @@ -61,8 +62,6 @@ elif [[ "$1" == "gcc.no-rtti.test" ]]; then exit $CMAKE_CONFIGURE_EXIT_CODE fi cmake --build . -j || cmake --build . || cmake --build . --verbose - THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" ctest . -V elif [[ "$1" == "gcc.no-exceptions.test" ]]; then echo "$1" @@ -79,8 +78,6 @@ elif [[ "$1" == "gcc.no-exceptions.test" ]]; then exit $CMAKE_CONFIGURE_EXIT_CODE fi cmake --build . -j || cmake --build . || cmake --build . --verbose - THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" ctest . -V elif [[ "$1" == "gcc.static.test" ]]; then echo "$1" @@ -97,8 +94,6 @@ elif [[ "$1" == "gcc.static.test" ]]; then exit $CMAKE_CONFIGURE_EXIT_CODE fi cmake --build . -j || cmake --build . || cmake --build . --verbose - THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" ctest . -V elif [[ "$1" == "gcc.shared.test" ]]; then echo "$1" @@ -115,8 +110,6 @@ elif [[ "$1" == "gcc.shared.test" ]]; then exit $CMAKE_CONFIGURE_EXIT_CODE fi cmake --build . -j || cmake --build . || cmake --build . --verbose - THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" ctest . -V elif [[ "$1" == "gcc.libressl.test" ]]; then echo "$1" @@ -133,8 +126,6 @@ elif [[ "$1" == "gcc.libressl.test" ]]; then exit $CMAKE_CONFIGURE_EXIT_CODE fi cmake --build . -j || cmake --build . || cmake --build . --verbose - THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" ctest . -V elif [[ "$1" == "gcc.boringssl.test" ]]; then echo "$1" @@ -151,8 +142,6 @@ elif [[ "$1" == "gcc.boringssl.test" ]]; then exit $CMAKE_CONFIGURE_EXIT_CODE fi cmake --build . -j || cmake --build . || cmake --build . --verbose - THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" ctest . -V elif [[ "$1" == "gcc.mbedtls.test" ]]; then echo "$1" @@ -169,8 +158,6 @@ elif [[ "$1" == "gcc.mbedtls.test" ]]; then exit $CMAKE_CONFIGURE_EXIT_CODE fi cmake --build . -j || cmake --build . || cmake --build . --verbose - THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" ctest . -V elif [[ "$1" == "gcc.4.8.test" ]]; then echo "$1" @@ -187,8 +174,6 @@ elif [[ "$1" == "gcc.4.8.test" ]]; then exit $CMAKE_CONFIGURE_EXIT_CODE fi cmake --build . -j || cmake --build . || cmake --build . --verbose - THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" ctest . -V elif [[ "$1" == "gcc.standalone-upb.test" ]]; then echo "$1" @@ -205,7 +190,6 @@ elif [[ "$1" == "gcc.standalone-upb.test" ]]; then exit $CMAKE_CONFIGURE_EXIT_CODE fi cmake --build . -j || cmake --build . || cmake --build . --verbose - THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/third_party/install/*) elif [[ "$1" == "clang.test" ]]; then echo "$1" mkdir -p test/build_jobs_dir @@ -245,8 +229,6 @@ elif [[ "$1" == "clang.test" ]]; then exit $CMAKE_CONFIGURE_EXIT_CODE fi cmake --build . -j || cmake --build . || cmake --build . --verbose - THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" ctest . -V elif [[ "$1" == "gcc.vcpkg.test" ]]; then echo "$1" @@ -272,8 +254,6 @@ elif [[ "$1" == "gcc.vcpkg.test" ]]; then exit $CMAKE_CONFIGURE_EXIT_CODE fi cmake --build . -j || cmake --build . || cmake --build . --verbose - THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" ctest . -V elif [[ "$1" == "msys2.mingw.static.test" ]]; then echo "$1" @@ -298,7 +278,6 @@ elif [[ "$1" == "msys2.mingw.static.test" ]]; then fi cmake --build . -j || cmake --build . || cmake --build . --verbose THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" export PATH="$PATH:$THIRD_PARTY_PREBUILT_DIR/bin" ctest . -V elif [[ "$1" == "msys2.mingw.shared.test" ]]; then @@ -325,7 +304,6 @@ elif [[ "$1" == "msys2.mingw.shared.test" ]]; then fi cmake --build . -j || cmake --build . || cmake --build . --verbose THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" export PATH="$PATH:$THIRD_PARTY_PREBUILT_DIR/bin" ctest . -V elif [[ "$1" == "msvc.static.test" ]]; then @@ -353,7 +331,6 @@ elif [[ "$1" == "msvc.static.test" ]]; then fi cmake --build . -j --config $CI_BUILD_CONFIGURE_TYPE || cmake --build . --config $CI_BUILD_CONFIGURE_TYPE THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" export PATH="$PATH:$THIRD_PARTY_PREBUILT_DIR/bin" ctest . -V -C $CI_BUILD_CONFIGURE_TYPE elif [[ "$1" == "msvc.shared.test" ]]; then @@ -381,7 +358,6 @@ elif [[ "$1" == "msvc.shared.test" ]]; then fi cmake --build . -j --config $CI_BUILD_CONFIGURE_TYPE || cmake --build . --config $CI_BUILD_CONFIGURE_TYPE THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" export PATH="$PATH:$THIRD_PARTY_PREBUILT_DIR/bin" ctest . -V elif [[ "$1" == "msvc.vcpkg.test" ]]; then @@ -419,7 +395,6 @@ elif [[ "$1" == "msvc.vcpkg.test" ]]; then fi cmake --build . -j --config $CI_BUILD_CONFIGURE_TYPE || cmake --build . --config $CI_BUILD_CONFIGURE_TYPE THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" export PATH="$PATH:$THIRD_PARTY_PREBUILT_DIR/bin" ctest . -V -C $CI_BUILD_CONFIGURE_TYPE elif [[ "$1" == "msvc2017.test" ]]; then @@ -439,7 +414,6 @@ elif [[ "$1" == "msvc2017.test" ]]; then fi cmake --build . -j --config $CI_BUILD_CONFIGURE_TYPE || cmake --build . --config $CI_BUILD_CONFIGURE_TYPE THIRD_PARTY_PREBUILT_DIR=$(ls -d $PWD/../third_party/install/*) - export LD_LIBRARY_PATH="$THIRD_PARTY_PREBUILT_DIR/lib64:$THIRD_PARTY_PREBUILT_DIR/lib" export PATH="$PATH:$THIRD_PARTY_PREBUILT_DIR/bin" ctest . -V -C $CI_BUILD_CONFIGURE_TYPE elif [[ "$1" == "android.arm64.test" ]]; then diff --git a/ports/Configure.cmake b/ports/Configure.cmake index 84e22dbd..1a98ae0b 100644 --- a/ports/Configure.cmake +++ b/ports/Configure.cmake @@ -310,32 +310,156 @@ if(NOT EXISTS ${PROJECT_THIRD_PARTY_INSTALL_DIR}) file(MAKE_DIRECTORY ${PROJECT_THIRD_PARTY_INSTALL_DIR}) endif() -if(NOT CMAKE_BUILD_RPATH) - add_list_flags_to_inherit_var(CMAKE_BUILD_RPATH "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib64" - "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib") +if(NOT EXISTS ${PROJECT_THIRD_PARTY_HOST_INSTALL_DIR}) + file(MAKE_DIRECTORY ${PROJECT_THIRD_PARTY_HOST_INSTALL_DIR}) +endif() - if(ANDROID OR CMAKE_SYSTEM_NAME MATCHES "Linux|Android") - add_compiler_flags_to_inherit_var_unique( - CMAKE_EXE_LINKER_FLAGS - "-Wl,-rpath-link,${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib64:${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib") - add_compiler_flags_to_inherit_var_unique( - CMAKE_MODULE_LINKER_FLAGS - "-Wl,-rpath-link,${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib64:${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib") - add_compiler_flags_to_inherit_var_unique( - CMAKE_SHARED_LINKER_FLAGS - "-Wl,-rpath-link,${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib64:${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib") +option(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_USE_ABSOLUTE_RPATH + "Use absolute paths instead of loader-relative paths for additional third-party build RPATH entries" OFF) + +if(APPLE) + set(_atframework_cmake_toolset_target_rpath_origin "@loader_path") +elseif(UNIX) + set(_atframework_cmake_toolset_target_rpath_origin "$ORIGIN") +endif() +if(CMAKE_HOST_APPLE) + set(_atframework_cmake_toolset_host_rpath_origin "@loader_path") +elseif(CMAKE_HOST_UNIX) + set(_atframework_cmake_toolset_host_rpath_origin "$ORIGIN") +endif() + +# Build absolute and loader-relative RPATH lists for a third-party prefix. +function(_atframework_cmake_toolset_make_build_rpath _atframework_cmake_toolset_out_var + _atframework_cmake_toolset_absolute_out_var _atframework_cmake_toolset_install_dir + _atframework_cmake_toolset_origin) + get_filename_component(_atframework_cmake_toolset_install_dir "${_atframework_cmake_toolset_install_dir}" ABSOLUTE + BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}") + foreach(_atframework_cmake_toolset_library_dir "${CMAKE_INSTALL_LIBDIR}" lib64 lib) + list(APPEND _atframework_cmake_toolset_absolute_rpath + "${_atframework_cmake_toolset_install_dir}/${_atframework_cmake_toolset_library_dir}") + list(APPEND _atframework_cmake_toolset_relative_rpath + "${_atframework_cmake_toolset_origin}/../${_atframework_cmake_toolset_library_dir}") + endforeach() + list(REMOVE_DUPLICATES _atframework_cmake_toolset_absolute_rpath) + if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_USE_ABSOLUTE_RPATH OR NOT _atframework_cmake_toolset_origin) + set(_atframework_cmake_toolset_rpath ${_atframework_cmake_toolset_absolute_rpath}) + else() + list(PREPEND _atframework_cmake_toolset_relative_rpath "${_atframework_cmake_toolset_origin}") + foreach(_atframework_cmake_toolset_output_dir "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") + if(NOT _atframework_cmake_toolset_output_dir OR _atframework_cmake_toolset_output_dir MATCHES "\\$<") + continue() + endif() + get_filename_component(_atframework_cmake_toolset_output_dir "${_atframework_cmake_toolset_output_dir}" ABSOLUTE + BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}") + foreach(_atframework_cmake_toolset_library_dir IN LISTS _atframework_cmake_toolset_absolute_rpath) + file(RELATIVE_PATH _atframework_cmake_toolset_relative_dir "${_atframework_cmake_toolset_output_dir}" + "${_atframework_cmake_toolset_library_dir}") + if(IS_ABSOLUTE "${_atframework_cmake_toolset_relative_dir}") + continue() + elseif(_atframework_cmake_toolset_relative_dir STREQUAL ".") + set(_atframework_cmake_toolset_relative_dir) + else() + set(_atframework_cmake_toolset_relative_dir "/${_atframework_cmake_toolset_relative_dir}") + endif() + list(APPEND _atframework_cmake_toolset_relative_rpath + "${_atframework_cmake_toolset_origin}${_atframework_cmake_toolset_relative_dir}") + if(CMAKE_CONFIGURATION_TYPES) + list(APPEND _atframework_cmake_toolset_relative_rpath + "${_atframework_cmake_toolset_origin}/..${_atframework_cmake_toolset_relative_dir}") + endif() + endforeach() + endforeach() + list(REMOVE_DUPLICATES _atframework_cmake_toolset_relative_rpath) + set(_atframework_cmake_toolset_rpath ${_atframework_cmake_toolset_relative_rpath}) endif() -else() - if(ANDROID OR CMAKE_SYSTEM_NAME MATCHES "Linux|Android") - add_compiler_flags_to_inherit_var_unique(CMAKE_EXE_LINKER_FLAGS "-Wl,-rpath-link,${CMAKE_BUILD_RPATH}") - add_compiler_flags_to_inherit_var_unique(CMAKE_MODULE_LINKER_FLAGS "-Wl,-rpath-link,${CMAKE_BUILD_RPATH}") - add_compiler_flags_to_inherit_var_unique(CMAKE_SHARED_LINKER_FLAGS "-Wl,-rpath-link,${CMAKE_BUILD_RPATH}") + set(${_atframework_cmake_toolset_out_var} + ${_atframework_cmake_toolset_rpath} + PARENT_SCOPE) + set(${_atframework_cmake_toolset_absolute_out_var} + ${_atframework_cmake_toolset_absolute_rpath} + PARENT_SCOPE) +endfunction() + +_atframework_cmake_toolset_make_build_rpath( + _atframework_cmake_toolset_target_runtime_library_dirs + _atframework_cmake_toolset_target_absolute_runtime_library_dirs "${PROJECT_THIRD_PARTY_INSTALL_DIR}" + "${_atframework_cmake_toolset_target_rpath_origin}") +_atframework_cmake_toolset_make_build_rpath( + _atframework_cmake_toolset_host_runtime_library_dirs _atframework_cmake_toolset_host_absolute_runtime_library_dirs + "${PROJECT_THIRD_PARTY_HOST_INSTALL_DIR}" "${_atframework_cmake_toolset_host_rpath_origin}") + +if(NOT DEFINED CMAKE_BUILD_RPATH_USE_ORIGIN) + if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_USE_ABSOLUTE_RPATH) + set(CMAKE_BUILD_RPATH_USE_ORIGIN FALSE) + else() + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) endif() endif() +if(NOT DEFINED CMAKE_HOST_BUILD_RPATH_USE_ORIGIN) + if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_USE_ABSOLUTE_RPATH) + set(CMAKE_HOST_BUILD_RPATH_USE_ORIGIN FALSE) + else() + set(CMAKE_HOST_BUILD_RPATH_USE_ORIGIN TRUE) + endif() +endif() +if(NOT DEFINED COMPILER_OPTION_INHERIT_CMAKE_BUILD_RPATH_USE_ORIGIN) + set(COMPILER_OPTION_INHERIT_CMAKE_BUILD_RPATH_USE_ORIGIN "${CMAKE_BUILD_RPATH_USE_ORIGIN}") +endif() +if(NOT DEFINED COMPILER_OPTION_INHERIT_CMAKE_HOST_BUILD_RPATH_USE_ORIGIN) + set(COMPILER_OPTION_INHERIT_CMAKE_HOST_BUILD_RPATH_USE_ORIGIN "${CMAKE_HOST_BUILD_RPATH_USE_ORIGIN}") +endif() -if(NOT EXISTS ${PROJECT_THIRD_PARTY_HOST_INSTALL_DIR}) - file(MAKE_DIRECTORY ${PROJECT_THIRD_PARTY_HOST_INSTALL_DIR}) +if(NOT DEFINED COMPILER_OPTION_INHERIT_CMAKE_BUILD_RPATH) + set(COMPILER_OPTION_INHERIT_CMAKE_BUILD_RPATH "${CMAKE_BUILD_RPATH}") +endif() +if(NOT DEFINED COMPILER_OPTION_INHERIT_CMAKE_HOST_BUILD_RPATH) + set(COMPILER_OPTION_INHERIT_CMAKE_HOST_BUILD_RPATH "${CMAKE_HOST_BUILD_RPATH}") endif() +foreach(_atframework_cmake_toolset_rpath_var CMAKE_BUILD_RPATH COMPILER_OPTION_INHERIT_CMAKE_BUILD_RPATH) + list(PREPEND ${_atframework_cmake_toolset_rpath_var} ${_atframework_cmake_toolset_target_runtime_library_dirs}) + list(REMOVE_DUPLICATES ${_atframework_cmake_toolset_rpath_var}) +endforeach() +foreach(_atframework_cmake_toolset_rpath_var CMAKE_HOST_BUILD_RPATH COMPILER_OPTION_INHERIT_CMAKE_HOST_BUILD_RPATH) + list(PREPEND ${_atframework_cmake_toolset_rpath_var} ${_atframework_cmake_toolset_host_runtime_library_dirs}) + list(REMOVE_DUPLICATES ${_atframework_cmake_toolset_rpath_var}) +endforeach() +unset(_atframework_cmake_toolset_rpath_var) + +# GNU-compatible ELF linkers use rpath-link only while resolving indirect shared-library dependencies. Runtime lookup is +# provided by CMAKE_BUILD_RPATH above. Use one option per directory so Windows drive letters in cross builds are not +# mistaken for path-list separators. +if((ANDROID OR CMAKE_SYSTEM_NAME MATCHES "Linux|Android") AND NOT MSVC) + foreach(_atframework_cmake_toolset_runtime_library_dir IN + LISTS _atframework_cmake_toolset_target_absolute_runtime_library_dirs) + set(_atframework_cmake_toolset_rpath_link_option + "-Wl,-rpath-link,\"${_atframework_cmake_toolset_runtime_library_dir}\"") + foreach(_atframework_cmake_toolset_linker_type EXE MODULE SHARED) + add_compiler_flags_to_inherit_var_unique(CMAKE_${_atframework_cmake_toolset_linker_type}_LINKER_FLAGS + "${_atframework_cmake_toolset_rpath_link_option}") + endforeach() + endforeach() +endif() +if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") + foreach(_atframework_cmake_toolset_runtime_library_dir IN + LISTS _atframework_cmake_toolset_host_absolute_runtime_library_dirs) + set(_atframework_cmake_toolset_rpath_link_option + "-Wl,-rpath-link,\"${_atframework_cmake_toolset_runtime_library_dir}\"") + foreach(_atframework_cmake_toolset_linker_type EXE MODULE SHARED) + add_compiler_flags_to_inherit_var_unique(CMAKE_HOST_${_atframework_cmake_toolset_linker_type}_LINKER_FLAGS + "${_atframework_cmake_toolset_rpath_link_option}") + endforeach() + endforeach() +endif() +unset(_atframework_cmake_toolset_linker_type) +unset(_atframework_cmake_toolset_rpath_link_option) +unset(_atframework_cmake_toolset_runtime_library_dir) +unset(_atframework_cmake_toolset_target_runtime_library_dirs) +unset(_atframework_cmake_toolset_host_runtime_library_dirs) +unset(_atframework_cmake_toolset_target_absolute_runtime_library_dirs) +unset(_atframework_cmake_toolset_host_absolute_runtime_library_dirs) +unset(_atframework_cmake_toolset_target_rpath_origin) +unset(_atframework_cmake_toolset_host_rpath_origin) if(NOT EXISTS ${PROJECT_THIRD_PARTY_INSTALL_CMAKE_MODULE_DIR}) file(MAKE_DIRECTORY ${PROJECT_THIRD_PARTY_INSTALL_CMAKE_MODULE_DIR}) @@ -546,37 +670,11 @@ project_third_party_print_find_information() mark_as_advanced(PROJECT_THIRD_PARTY_PACKAGE_DIR PROJECT_THIRD_PARTY_INSTALL_DIR) -# Some libraries maybe has wrong RPATH -string(FIND "$ENV{PATH}" "\;" PROJECT_THIRD_PARTY_TEST_PATH_SEP) -if(PROJECT_THIRD_PARTY_TEST_PATH_SEP GREATER_EQUAL 0) - set(PROJECT_THIRD_PARTY_PATH_SEPARATOR ";") -else() - set(PROJECT_THIRD_PARTY_PATH_SEPARATOR ":") -endif() -unset(PROJECT_THIRD_PARTY_TEST_PATH_SEP) - -# reset LD_LIBRARY_PATH may lead to conflict when external tools depends on our ports when ours are built with sanitizer -if(NOT ((CMAKE_CROSSCOMPILING AND PROJECT_COMPILER_OPTIONS_HOST_USE_SANITIZER) - OR PROJECT_COMPILER_OPTIONS_TARGET_USE_SANITIZER)) - if(UNIX - OR MINGW - OR MSYS) - if(DEFINED ENV{LD_LIBRARY_PATH}) - set(ENV{LD_LIBRARY_PATH} - "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib64${PROJECT_THIRD_PARTY_PATH_SEPARATOR}${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib${PROJECT_THIRD_PARTY_PATH_SEPARATOR}$ENV{LD_LIBRARY_PATH}" - ) - else() - set(ENV{LD_LIBRARY_PATH} - "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib64${PROJECT_THIRD_PARTY_PATH_SEPARATOR}${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib" - ) - endif() - endif() -endif() - -# Can not append PATH when corssing compiling, CMAKE_USE_SYSTEM_ENVIRONMENT_PATH will cause a invalid arch searching. +# Do not append PATH when cross compiling. CMAKE_USE_SYSTEM_ENVIRONMENT_PATH may otherwise find target-architecture +# tools while configuring host tools. if(NOT CMAKE_CROSSCOMPILING) set(ENV{PATH} - "${PROJECT_THIRD_PARTY_HOST_INSTALL_DIR}/bin${PROJECT_THIRD_PARTY_PATH_SEPARATOR}${PROJECT_THIRD_PARTY_HOST_INSTALL_DIR}/libexec${PROJECT_THIRD_PARTY_PATH_SEPARATOR}$ENV{PATH}" + "${PROJECT_THIRD_PARTY_HOST_INSTALL_DIR}/bin${ATFRAMEWORK_CMAKE_TOOLSET_HOST_PATH_SEPARATOR}${PROJECT_THIRD_PARTY_HOST_INSTALL_DIR}/libexec${ATFRAMEWORK_CMAKE_TOOLSET_HOST_PATH_SEPARATOR}$ENV{PATH}" ) endif() diff --git a/ports/ssl/libsodium/libsodium-msvc.cmake b/ports/ssl/libsodium/libsodium-msvc.cmake new file mode 100644 index 00000000..c1569afd --- /dev/null +++ b/ports/ssl/libsodium/libsodium-msvc.cmake @@ -0,0 +1,378 @@ +include_guard(DIRECTORY) + +function(project_third_party_libsodium_msvc_import OUTPUT_LOCAL_FOUND) + set(_libsodium_debug_lib "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib/libsodium-dbg.lib") + set(_libsodium_release_lib "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib/libsodium.lib") + set(_libsodium_debug_dll "${PROJECT_THIRD_PARTY_INSTALL_DIR}/bin/libsodium-dbg.dll") + set(_libsodium_release_dll "${PROJECT_THIRD_PARTY_INSTALL_DIR}/bin/libsodium.dll") + + set(_libsodium_local_found FALSE) + foreach(_libsodium_artifact + "${_libsodium_debug_lib}" "${_libsodium_release_lib}" "${_libsodium_debug_dll}" "${_libsodium_release_dll}" + "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib/sodium-dbg.lib" "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib/sodium.lib") + if(EXISTS "${_libsodium_artifact}") + set(_libsodium_local_found TRUE) + break() + endif() + endforeach() + set(${OUTPUT_LOCAL_FOUND} + "${_libsodium_local_found}" + PARENT_SCOPE) + + if(TARGET sodium + OR TARGET unofficial-sodium::sodium + OR TARGET libsodium::libsodium + OR NOT EXISTS "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/sodium.h" + OR NOT EXISTS "${_libsodium_debug_lib}" + OR NOT EXISTS "${_libsodium_release_lib}") + return() + endif() + + if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_USE_SHARED) + if(NOT EXISTS "${_libsodium_debug_dll}" OR NOT EXISTS "${_libsodium_release_dll}") + return() + endif() + add_library(libsodium::libsodium SHARED IMPORTED) + set_target_properties( + libsodium::libsodium + PROPERTIES IMPORTED_IMPLIB "${_libsodium_release_lib}" + IMPORTED_IMPLIB_DEBUG "${_libsodium_debug_lib}" + IMPORTED_IMPLIB_RELEASE "${_libsodium_release_lib}" + IMPORTED_LOCATION "${_libsodium_release_dll}" + IMPORTED_LOCATION_DEBUG "${_libsodium_debug_dll}" + IMPORTED_LOCATION_RELEASE "${_libsodium_release_dll}") + else() + if(EXISTS "${_libsodium_debug_dll}" OR EXISTS "${_libsodium_release_dll}") + return() + endif() + add_library(libsodium::libsodium STATIC IMPORTED) + set_target_properties( + libsodium::libsodium + PROPERTIES IMPORTED_LOCATION "${_libsodium_release_lib}" + IMPORTED_LOCATION_DEBUG "${_libsodium_debug_lib}" + IMPORTED_LOCATION_RELEASE "${_libsodium_release_lib}" + INTERFACE_COMPILE_DEFINITIONS "SODIUM_STATIC=1") + endif() + + set_target_properties( + libsodium::libsodium + PROPERTIES IMPORTED_CONFIGURATIONS "Debug;Release" + INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include" + INTERFACE_LINK_LIBRARIES "advapi32" + MAP_IMPORTED_CONFIG_MINSIZEREL Release + MAP_IMPORTED_CONFIG_RELWITHDEBINFO Release) +endfunction() + +function(project_third_party_libsodium_msvc_select_project OUTPUT_PROJECT OUTPUT_VERSION) + if(MSVC_TOOLSET_VERSION) + if(MSVC_TOOLSET_VERSION GREATER_EQUAL 145) + set(_libsodium_requested_vs 2026) + elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 144) + set(_libsodium_requested_vs 2025) + elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 143) + set(_libsodium_requested_vs 2022) + elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 142) + set(_libsodium_requested_vs 2019) + elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 141) + set(_libsodium_requested_vs 2017) + elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 140) + set(_libsodium_requested_vs 2015) + elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 120) + set(_libsodium_requested_vs 2013) + elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 110) + set(_libsodium_requested_vs 2012) + else() + set(_libsodium_requested_vs 2010) + endif() + elseif(MSVC_VERSION) + if(MSVC_VERSION GREATER_EQUAL 1950) + set(_libsodium_requested_vs 2026) + elseif(MSVC_VERSION GREATER_EQUAL 1930) + set(_libsodium_requested_vs 2022) + elseif(MSVC_VERSION GREATER_EQUAL 1920) + set(_libsodium_requested_vs 2019) + elseif(MSVC_VERSION GREATER_EQUAL 1910) + set(_libsodium_requested_vs 2017) + elseif(MSVC_VERSION GREATER_EQUAL 1900) + set(_libsodium_requested_vs 2015) + elseif(MSVC_VERSION GREATER_EQUAL 1800) + set(_libsodium_requested_vs 2013) + elseif(MSVC_VERSION GREATER_EQUAL 1700) + set(_libsodium_requested_vs 2012) + else() + set(_libsodium_requested_vs 2010) + endif() + elseif(CMAKE_GENERATOR MATCHES "^Visual Studio\\s*[0-9]+\\s*([0-9]+)$") + set(_libsodium_requested_vs "${CMAKE_MATCH_1}") + else() + message(FATAL_ERROR "Dependency(${PROJECT_NAME}): Unable to detect the MSVC toolset for libsodium") + endif() + + foreach( + _libsodium_vs_version + 2026 + 2022 + 2019 + 2017 + 2015 + 2013 + 2012 + 2010) + if(_libsodium_vs_version GREATER _libsodium_requested_vs) + continue() + endif() + set(_libsodium_vcxproj + "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/builds/msvc/vs${_libsodium_vs_version}/libsodium/libsodium.vcxproj" + ) + if(EXISTS "${_libsodium_vcxproj}") + set(${OUTPUT_PROJECT} + "${_libsodium_vcxproj}" + PARENT_SCOPE) + set(${OUTPUT_VERSION} + "${_libsodium_vs_version}" + PARENT_SCOPE) + return() + endif() + endforeach() + + message( + FATAL_ERROR + "Dependency(${PROJECT_NAME}): No compatible libsodium MSVC project found for Visual Studio ${_libsodium_requested_vs}" + ) +endfunction() + +function(project_third_party_libsodium_msvc_find_msbuild OUTPUT_COMMAND) + if(CMAKE_VS_MSBUILD_COMMAND AND EXISTS "${CMAKE_VS_MSBUILD_COMMAND}") + set(${OUTPUT_COMMAND} + "${CMAKE_VS_MSBUILD_COMMAND}" + PARENT_SCOPE) + return() + endif() + + unset(_libsodium_msbuild CACHE) + find_program(_libsodium_msbuild NAMES MSBuild.exe msbuild) + if(NOT _libsodium_msbuild) + unset(_libsodium_vswhere CACHE) + find_program( + _libsodium_vswhere + NAMES vswhere.exe + HINTS "$ENV{ProgramFiles\(x86\)}/Microsoft Visual Studio/Installer" + "$ENV{ProgramFiles}/Microsoft Visual Studio/Installer" + NO_DEFAULT_PATH) + if(_libsodium_vswhere) + execute_process( + COMMAND "${_libsodium_vswhere}" -latest -products "*" -requires Microsoft.Component.MSBuild -find + "MSBuild/**/Bin/MSBuild.exe" + OUTPUT_VARIABLE _libsodium_msbuild + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(_libsodium_msbuild) + string(REGEX REPLACE "[\r\n]+" ";" _libsodium_msbuild "${_libsodium_msbuild}") + list(GET _libsodium_msbuild 0 _libsodium_msbuild) + endif() + endif() + unset(_libsodium_vswhere CACHE) + endif() + set(_libsodium_msbuild_command "${_libsodium_msbuild}") + unset(_libsodium_msbuild CACHE) + + if(NOT EXISTS "${_libsodium_msbuild_command}") + message(FATAL_ERROR "Dependency(${PROJECT_NAME}): MSBuild is required to build libsodium on MSVC") + endif() + set(${OUTPUT_COMMAND} + "${_libsodium_msbuild_command}" + PARENT_SCOPE) +endfunction() + +function(project_third_party_libsodium_msvc_generate_version_header) + set(_libsodium_version_header_in + "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/src/libsodium/include/sodium/version.h.in") + if(NOT EXISTS "${_libsodium_version_header_in}") + return() + endif() + + string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" _libsodium_version_match + "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION}") + if(_libsodium_version_match) + set(VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") + else() + set(VERSION "1.0.21") + endif() + + set(SODIUM_LIBRARY_VERSION_MAJOR "26") + set(SODIUM_LIBRARY_VERSION_MINOR "3") + set(_libsodium_configure_ac "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/configure.ac") + if(EXISTS "${_libsodium_configure_ac}") + file(STRINGS "${_libsodium_configure_ac}" _libsodium_library_major REGEX "^SODIUM_LIBRARY_VERSION_MAJOR=[0-9]+") + file(STRINGS "${_libsodium_configure_ac}" _libsodium_library_minor REGEX "^SODIUM_LIBRARY_VERSION_MINOR=[0-9]+") + if(_libsodium_library_major) + string(REGEX REPLACE ".*=([0-9]+).*" "\\1" SODIUM_LIBRARY_VERSION_MAJOR "${_libsodium_library_major}") + endif() + if(_libsodium_library_minor) + string(REGEX REPLACE ".*=([0-9]+).*" "\\1" SODIUM_LIBRARY_VERSION_MINOR "${_libsodium_library_minor}") + endif() + endif() + set(SODIUM_LIBRARY_MINIMAL_DEF "") + + configure_file( + "${_libsodium_version_header_in}" + "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/src/libsodium/include/sodium/version.h" @ONLY + NEWLINE_STYLE LF) +endfunction() + +function(project_third_party_libsodium_msvc_build) + set(_libsodium_git_args + URL "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_GIT_URL}" REPO_DIRECTORY + "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}" TAG + "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION}") + if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_PATCH_FILE + AND EXISTS "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_PATCH_FILE}") + list(APPEND _libsodium_git_args PATCH_FILES "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_PATCH_FILE}") + endif() + project_git_clone_repository(${_libsodium_git_args}) + + if(NOT EXISTS "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}") + message(WARNING "Dependency(${PROJECT_NAME}): libsodium source directory is unavailable") + return() + endif() + file(MAKE_DIRECTORY "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}") + + if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_USE_SHARED) + set(_libsodium_linkage DLL) + else() + set(_libsodium_linkage LIB) + endif() + + if(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]64$") + set(_libsodium_platform ARM64) + elseif(CMAKE_GENERATOR_PLATFORM MATCHES "^[Aa][Rr][Mm]$") + set(_libsodium_platform ARM) + elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_libsodium_platform x64) + else() + set(_libsodium_platform Win32) + endif() + + project_third_party_libsodium_msvc_select_project(_libsodium_vcxproj _libsodium_vs_version) + project_third_party_libsodium_msvc_find_msbuild(_libsodium_msbuild) + message(STATUS "Dependency(${PROJECT_NAME}): Build libsodium with Visual Studio ${_libsodium_vs_version} project") + + if(DEFINED ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSVC_STATIC_RUNTIME) + set(_libsodium_static_runtime "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSVC_STATIC_RUNTIME}") + elseif(VCPKG_CRT_LINKAGE STREQUAL "static") + set(_libsodium_static_runtime TRUE) + elseif(CMAKE_MSVC_RUNTIME_LIBRARY AND NOT CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL") + set(_libsodium_static_runtime TRUE) + else() + set(_libsodium_static_runtime FALSE) + endif() + if(_libsodium_static_runtime) + set(_libsodium_debug_runtime MultiThreadedDebug) + set(_libsodium_release_runtime MultiThreaded) + else() + set(_libsodium_debug_runtime MultiThreadedDebugDLL) + set(_libsodium_release_runtime MultiThreadedDLL) + endif() + + set(_libsodium_runtime_props "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/msvc-runtime.props") + set(_libsodium_runtime_props_content + [=[ + + + + @_libsodium_debug_runtime@ + @_libsodium_release_runtime@ + + + +]=]) + string(CONFIGURE "${_libsodium_runtime_props_content}" _libsodium_runtime_props_content @ONLY) + if(EXISTS "${_libsodium_runtime_props}") + file(READ "${_libsodium_runtime_props}" _libsodium_runtime_props_old_content) + endif() + if(NOT _libsodium_runtime_props_content STREQUAL _libsodium_runtime_props_old_content) + file(WRITE "${_libsodium_runtime_props}" "${_libsodium_runtime_props_content}") + endif() + + project_third_party_libsodium_msvc_generate_version_header() + + set(_libsodium_msbuild_common_args "${_libsodium_vcxproj}" "/m" "/v:minimal" "/p:Platform=${_libsodium_platform}" + "/p:ForceImportBeforeCppTargets=${_libsodium_runtime_props}") + if(CMAKE_VS_PLATFORM_TOOLSET) + list(APPEND _libsodium_msbuild_common_args "/p:PlatformToolset=${CMAKE_VS_PLATFORM_TOOLSET}") + elseif(MSVC_TOOLSET_VERSION) + list(APPEND _libsodium_msbuild_common_args "/p:PlatformToolset=v${MSVC_TOOLSET_VERSION}") + endif() + + foreach(_libsodium_build_type Debug Release) + if(_libsodium_build_type STREQUAL "Debug") + set(_libsodium_target_name "libsodium-dbg") + else() + set(_libsodium_target_name "libsodium") + endif() + set(_libsodium_output_dir + "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/msbuild/${_libsodium_build_type}") + + execute_process( + COMMAND + "${_libsodium_msbuild}" ${_libsodium_msbuild_common_args} + "/p:Configuration=${_libsodium_build_type}${_libsodium_linkage}" "/p:TargetName=${_libsodium_target_name}" + "/p:OutDir=${_libsodium_output_dir}/" "/p:IntDir=${_libsodium_output_dir}/obj/" + WORKING_DIRECTORY "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}" + ${ATFRAMEWORK_CMAKE_TOOLSET_EXECUTE_PROCESS_OUTPUT_OPTIONS} + RESULT_VARIABLE _libsodium_build_result) + if(NOT _libsodium_build_result EQUAL 0) + message(WARNING "Dependency(${PROJECT_NAME}): libsodium ${_libsodium_build_type} MSBuild failed") + return() + endif() + endforeach() + + set(_libsodium_debug_output "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/msbuild/Debug") + set(_libsodium_release_output "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/msbuild/Release") + set(_libsodium_debug_lib "${_libsodium_debug_output}/libsodium-dbg.lib") + set(_libsodium_release_lib "${_libsodium_release_output}/libsodium.lib") + if(NOT EXISTS "${_libsodium_debug_lib}" OR NOT EXISTS "${_libsodium_release_lib}") + message(WARNING "Dependency(${PROJECT_NAME}): libsodium MSBuild did not produce the expected libraries") + return() + endif() + if(_libsodium_linkage STREQUAL "DLL") + set(_libsodium_debug_dll "${_libsodium_debug_output}/libsodium-dbg.dll") + set(_libsodium_release_dll "${_libsodium_release_output}/libsodium.dll") + if(NOT EXISTS "${_libsodium_debug_dll}" OR NOT EXISTS "${_libsodium_release_dll}") + message(WARNING "Dependency(${PROJECT_NAME}): libsodium MSBuild did not produce the expected DLLs") + return() + endif() + endif() + + file(INSTALL "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/src/libsodium/include/sodium.h" + DESTINATION "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include") + file(INSTALL "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/src/libsodium/include/sodium" + DESTINATION "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include") + file(REMOVE "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/Makefile.am" + "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/sodium/version.h.in") + + file( + REMOVE + "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib/libsodium-dbg.lib" + "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib/libsodium.lib" + "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib/sodium-dbg.lib" + "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib/sodium.lib" + "${PROJECT_THIRD_PARTY_INSTALL_DIR}/bin/libsodium-dbg.dll" + "${PROJECT_THIRD_PARTY_INSTALL_DIR}/bin/libsodium.dll" + "${PROJECT_THIRD_PARTY_INSTALL_DIR}/bin/libsodium-dbg.pdb" + "${PROJECT_THIRD_PARTY_INSTALL_DIR}/bin/libsodium.pdb") + file(INSTALL "${_libsodium_debug_lib}" "${_libsodium_release_lib}" + DESTINATION "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib") + + if(_libsodium_linkage STREQUAL "DLL") + file(INSTALL "${_libsodium_debug_dll}" "${_libsodium_release_dll}" + DESTINATION "${PROJECT_THIRD_PARTY_INSTALL_DIR}/bin") + elseif(EXISTS "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/sodium/export.h") + file(READ "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/sodium/export.h" _libsodium_export_h) + string(REPLACE "#ifdef SODIUM_STATIC" "#if 1" _libsodium_patched_export_h "${_libsodium_export_h}") + if(NOT _libsodium_export_h STREQUAL _libsodium_patched_export_h) + file(WRITE "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/sodium/export.h" "${_libsodium_patched_export_h}") + endif() + endif() + + project_third_party_libsodium_msvc_import(_libsodium_local_found) +endfunction() diff --git a/ports/ssl/libsodium/libsodium.cmake b/ports/ssl/libsodium/libsodium.cmake index b6567df1..5d893875 100644 --- a/ports/ssl/libsodium/libsodium.cmake +++ b/ports/ssl/libsodium/libsodium.cmake @@ -19,6 +19,21 @@ function(PROJECT_THIRD_PARTY_LIBSODIUM_IMPORT) endif() endfunction() +project_third_party_check_build_shared_lib("libsodium" "" ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_USE_SHARED) + +set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LOCAL_INSTALL_FOUND FALSE) +if(MSVC AND NOT MINGW) + include("${CMAKE_CURRENT_LIST_DIR}/libsodium-msvc.cmake") + if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_USE_SHARED) + set(sodium_USE_STATIC_LIBS FALSE) + else() + set(sodium_USE_STATIC_LIBS TRUE) + endif() + if(NOT VCPKG_TOOLCHAIN) + project_third_party_libsodium_msvc_import(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LOCAL_INSTALL_FOUND) + endif() +endif() + if(NOT TARGET sodium AND NOT TARGET unofficial-sodium::sodium AND NOT TARGET libsodium::libsodium) @@ -27,7 +42,7 @@ if(NOT TARGET sodium if(NOT TARGET unofficial-sodium::sodium) find_package(sodium QUIET) endif() - else() + elseif(NOT ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LOCAL_INSTALL_FOUND) find_package(sodium QUIET) if(NOT TARGET sodium) find_package(libsodium QUIET CONFIG) @@ -64,321 +79,9 @@ if(NOT TARGET sodium set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR "${PROJECT_THIRD_PARTY_PACKAGE_DIR}/${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SRC_DIRECTORY_NAME}") - project_third_party_check_build_shared_lib("libsodium" "" ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_USE_SHARED) - # libsodium does not ship a CMakeLists.txt. On MSVC we build native vcxproj via MSBuild; on Unix we use autotools. if(MSVC AND NOT MINGW) - # ============ MSVC: MSBuild with vcxproj ============ - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_GIT_ARGS - URL "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_GIT_URL}" REPO_DIRECTORY - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}" TAG - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION}") - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_PATCH_FILE - AND EXISTS "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_PATCH_FILE}") - list(APPEND ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_GIT_ARGS PATCH_FILES - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_PATCH_FILE}") - endif() - project_git_clone_repository(${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_GIT_ARGS}) - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_GIT_ARGS) - - if(EXISTS "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}") - if(NOT EXISTS "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}") - file(MAKE_DIRECTORY "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}") - endif() - - # Determine linkage configuration - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_USE_SHARED) - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_LINKAGE "DLL") - else() - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_LINKAGE "LIB") - endif() - - # Determine platform - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_PLATFORM "x64") - else() - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_PLATFORM "Win32") - endif() - if(CMAKE_GENERATOR_PLATFORM) - string(TOUPPER "${CMAKE_GENERATOR_PLATFORM}" ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_GEN_PLATFORM_UC) - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_GEN_PLATFORM_UC STREQUAL "ARM64") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_PLATFORM "ARM64") - elseif(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_GEN_PLATFORM_UC STREQUAL "ARM") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_PLATFORM "ARM") - endif() - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_GEN_PLATFORM_UC) - endif() - - # Select vcxproj path - prefer vs2022 - if(CMAKE_GENERATOR MATCHES "^Visual Studio\\s*([0-9]+)\\s*([0-9]+)$") - # By Generator - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VS_START_VERSION ${CMAKE_MATCH_2}) - elseif(MSVC_TOOLSET_VERSION) - # By toolset - if(MSVC_TOOLSET_VERSION GREATER_EQUAL "144") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VS_START_VERSION 2026) - elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL "143") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VS_START_VERSION 2022) - elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL "142") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VS_START_VERSION 2019) - elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL "141") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VS_START_VERSION 2017) - else() - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VS_START_VERSION 2022) - endif() - else() - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VS_START_VERSION 2022) - endif() - - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VCXPROJ_SUBPATH - "builds/msvc/vs2022/libsodium/libsodium.vcxproj") - foreach(_test_msvc_toolset 2026 2022 2019 2017) - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VS_START_VERSION LESS _test_msvc_toolset) - continue() - endif() - if(EXISTS - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/builds/msvc/vs${_test_msvc_toolset}/libsodium/libsodium.vcxproj" - ) - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VCXPROJ_SUBPATH - "builds/msvc/vs${_test_msvc_toolset}/libsodium/libsodium.vcxproj") - break() - endif() - endforeach() - - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_CONFIG - "Release${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_LINKAGE}") - - # Generate version.h from version.h.in (libsodium requires this before build) - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_IN - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/src/libsodium/include/sodium/version.h.in") - if(EXISTS "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_IN}") - file(READ "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_IN}" - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_CONTENT) - # Extract version numbers from ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION e.g. "1.0.21-RELEASE" → - # MAJOR=1, MINOR=0, PATCH=21 - string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_MATCH - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION}") - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_MATCH) - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VER_MAJOR "${CMAKE_MATCH_1}") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VER_MINOR "${CMAKE_MATCH_2}") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VER_PATCH "${CMAKE_MATCH_3}") - else() - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VER_MAJOR "1") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VER_MINOR "0") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VER_PATCH "21") - endif() - - # Extract SODIUM_LIBRARY_VERSION_MAJOR/MINOR from configure.ac - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_CONFIGURE_AC - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/configure.ac") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_VER_MAJOR "26") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_VER_MINOR "3") - if(EXISTS "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_CONFIGURE_AC}") - file(READ "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_CONFIGURE_AC}" - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_CONFIGURE_AC_CONTENT) - string(REGEX MATCH "SODIUM_LIBRARY_VERSION_MAJOR=([0-9]+)" - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_VER_MAJOR_MATCH - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_CONFIGURE_AC_CONTENT}") - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_VER_MAJOR_MATCH) - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_VER_MAJOR "${CMAKE_MATCH_1}") - endif() - string(REGEX MATCH "SODIUM_LIBRARY_VERSION_MINOR=([0-9]+)" - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_VER_MINOR_MATCH - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_CONFIGURE_AC_CONTENT}") - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_VER_MINOR_MATCH) - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_VER_MINOR "${CMAKE_MATCH_1}") - endif() - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_CONFIGURE_AC_CONTENT) - endif() - - string( - REPLACE - "@VERSION@" - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VER_MAJOR}.${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VER_MINOR}.${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VER_PATCH}" - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_CONTENT - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_CONTENT}") - string( - REPLACE "@SODIUM_LIBRARY_VERSION_MAJOR@" "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_VER_MAJOR}" - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_CONTENT - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_CONTENT}") - string( - REPLACE "@SODIUM_LIBRARY_VERSION_MINOR@" "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_VER_MINOR}" - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_CONTENT - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_CONTENT}") - string(REPLACE "@SODIUM_LIBRARY_MINIMAL_DEF@" "" - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_CONTENT - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_CONTENT}") - file(WRITE - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/src/libsodium/include/sodium/version.h" - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_CONTENT}") - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_CONTENT) - endif() - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VERSION_H_IN) - - # Generate build script - file(WRITE "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/run-build-release.ps1" - "\$PSDefaultParameterValues['*:Encoding'] = 'UTF-8'${PROJECT_THIRD_PARTY_BUILDTOOLS_BASH_EOL}" - "\$OutputEncoding = [System.Text.UTF8Encoding]::new()${PROJECT_THIRD_PARTY_BUILDTOOLS_BASH_EOL}") - file(WRITE "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/run-build-release.bat" - "@echo off${PROJECT_THIRD_PARTY_BUILDTOOLS_EOL}" "chcp 65001${PROJECT_THIRD_PARTY_BUILDTOOLS_EOL}") - file(APPEND "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/run-build-release.bat" - "set PATH=%PATH%${PROJECT_THIRD_PARTY_BUILDTOOLS_EOL}") - - project_third_party_generate_load_env_powershell( - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/run-build-release.ps1") - - project_make_executable("${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/run-build-release.ps1") - project_make_executable("${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/run-build-release.bat") - - # MSBuild command - project_expand_list_for_command_line_to_file( - BAT - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/run-build-release.bat" - msbuild - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VCXPROJ_SUBPATH}" - "/m" - "/v:minimal" - "/p:Configuration=${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_CONFIG}" - "/p:Platform=${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_PLATFORM}") - project_expand_list_for_command_line_to_file( - PWSH - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/run-build-release.ps1" - "&" - msbuild - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VCXPROJ_SUBPATH}" - "/m" - "/v:minimal" - "/p:Configuration=${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_CONFIG}" - "/p:Platform=${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_PLATFORM}") - - # Run build - if(ATFRAMEWORK_CMAKE_TOOLSET_PWSH) - execute_process( - COMMAND - "${ATFRAMEWORK_CMAKE_TOOLSET_PWSH}" "-NoProfile" "-InputFormat" "None" "-ExecutionPolicy" "Bypass" - "-NonInteractive" "-NoLogo" "-File" - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/run-build-release.ps1" - WORKING_DIRECTORY "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}" - ${ATFRAMEWORK_CMAKE_TOOLSET_EXECUTE_PROCESS_OUTPUT_OPTIONS} - RESULT_VARIABLE ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_RESULT) - else() - execute_process( - COMMAND "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}/run-build-release.bat" - WORKING_DIRECTORY "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_DIR}" - ${ATFRAMEWORK_CMAKE_TOOLSET_EXECUTE_PROCESS_OUTPUT_OPTIONS} - RESULT_VARIABLE ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_RESULT) - endif() - - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_RESULT EQUAL 0) - # Install headers - file(INSTALL "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/src/libsodium/include/sodium.h" - DESTINATION "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include") - file(INSTALL "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/src/libsodium/include/sodium" - DESTINATION "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include") - # Install generated version.h - if(NOT EXISTS "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/sodium/version.h") - if(EXISTS - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/src/libsodium/include/sodium/version.h") - file(INSTALL - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/src/libsodium/include/sodium/version.h" - DESTINATION "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/sodium") - endif() - endif() - # Remove build artifacts from include - file(REMOVE "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/Makefile.am" - "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/sodium/version.h.in") - - # Install libraries - MSBuild outputs to - # /bin///// (see - # builds/msvc/properties/Output.props). Select only the active linkage directory to avoid mixing static and - # dynamic libs with the same basename into one install path. - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_LINKAGE STREQUAL "DLL") - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_LINKAGE_DIR "dynamic") - else() - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_LINKAGE_DIR "static") - endif() - - set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_SEARCH_ROOT - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_SOURCE_DIR}/bin/${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_PLATFORM}/Release" - ) - file( - GLOB_RECURSE - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_LIBS - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_SEARCH_ROOT}/*/${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_LINKAGE_DIR}/*.lib" - ) - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_LINKAGE STREQUAL "DLL") - file( - GLOB_RECURSE - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_DLLS - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_SEARCH_ROOT}/*/${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_LINKAGE_DIR}/*.dll" - ) - else() - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_DLLS) - endif() - - file(REMOVE "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib/libsodium.lib" - "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib/sodium.lib" "${PROJECT_THIRD_PARTY_INSTALL_DIR}/bin/libsodium.dll" - "${PROJECT_THIRD_PARTY_INSTALL_DIR}/bin/libsodium.pdb") - - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_LIBS) - file(INSTALL ${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_LIBS} - DESTINATION "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib") - endif() - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_DLLS) - file(INSTALL ${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_DLLS} - DESTINATION "${PROJECT_THIRD_PARTY_INSTALL_DIR}/bin") - endif() - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_SEARCH_ROOT) - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_INSTALL_LINKAGE_DIR) - - # For static builds, patch export.h - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_LINKAGE STREQUAL "LIB") - if(EXISTS "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/sodium/export.h") - file(READ "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/sodium/export.h" - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_EXPORT_H_CONTENT) - string(REPLACE "#ifdef SODIUM_STATIC" "#if 1" - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_EXPORT_H_CONTENT - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_EXPORT_H_CONTENT}") - file(WRITE "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include/sodium/export.h" - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_EXPORT_H_CONTENT}") - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_EXPORT_H_CONTENT) - endif() - endif() - - # Create an imported target for find_package compatibility - if(NOT TARGET libsodium::libsodium) - add_library(libsodium::libsodium UNKNOWN IMPORTED) - set_target_properties(libsodium::libsodium PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "${PROJECT_THIRD_PARTY_INSTALL_DIR}/include") - # Find the installed .lib - file(GLOB ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_FILE - "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib/libsodium*.lib" - "${PROJECT_THIRD_PARTY_INSTALL_DIR}/lib/sodium*.lib") - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_FILE) - list(GET ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_FILE 0 - ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_FILE_FIRST) - set_target_properties( - libsodium::libsodium PROPERTIES IMPORTED_LOCATION - "${ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_FILE_FIRST}") - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_FILE_FIRST) - endif() - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LIB_FILE) - if(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_LINKAGE STREQUAL "LIB") - set_target_properties(libsodium::libsodium PROPERTIES INTERFACE_COMPILE_DEFINITIONS "SODIUM_STATIC=1") - endif() - set_target_properties(libsodium::libsodium PROPERTIES INTERFACE_LINK_LIBRARIES "advapi32") - endif() - else() - message(WARNING "Dependency(${PROJECT_NAME}): libsodium MSBuild build failed") - endif() - - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_LINKAGE) - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_PLATFORM) - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_MSBUILD_CONFIG) - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_VCXPROJ_SUBPATH) - unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_BUILD_RESULT) - endif() + project_third_party_libsodium_msvc_build() else() # ============ Unix/Linux/macOS/MinGW: autotools (configure + make) ============ set(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_CONFIGURE_OPTIONS) @@ -467,3 +170,5 @@ if(NOT TARGET sodium else() project_third_party_libsodium_import() endif() + +unset(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_LIBSODIUM_LOCAL_INSTALL_FOUND) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 2616069f..d2299c5a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -22,6 +22,31 @@ project(cmake-toolset-test LANGUAGES C CXX) enable_testing() +if(UNIX + AND NOT CYGWIN + AND NOT CMAKE_CROSSCOMPILING) + set(CMAKE_TOOLSET_RPATH_TEST_GENERATOR_OPTIONS -G "${CMAKE_GENERATOR}") + if(CMAKE_GENERATOR_PLATFORM) + list(APPEND CMAKE_TOOLSET_RPATH_TEST_GENERATOR_OPTIONS -A "${CMAKE_GENERATOR_PLATFORM}") + endif() + if(CMAKE_GENERATOR_TOOLSET) + list(APPEND CMAKE_TOOLSET_RPATH_TEST_GENERATOR_OPTIONS -T "${CMAKE_GENERATOR_TOOLSET}") + endif() + add_test( + NAME cmake-toolset.rpath-relative-configure + COMMAND + "${CMAKE_COMMAND}" -S "${CMAKE_CURRENT_LIST_DIR}/rpath" -B "${CMAKE_CURRENT_BINARY_DIR}/rpath-relative" + ${CMAKE_TOOLSET_RPATH_TEST_GENERATOR_OPTIONS} -DCMAKE_BUILD_RPATH_USE_ORIGIN=OFF + -DCMAKE_HOST_BUILD_RPATH_USE_ORIGIN=OFF -DCMAKE_TOOLSET_RPATH_TEST_EXPECT_USE_ORIGIN=OFF) + add_test( + NAME cmake-toolset.rpath-absolute-configure + COMMAND + "${CMAKE_COMMAND}" -S "${CMAKE_CURRENT_LIST_DIR}/rpath" -B "${CMAKE_CURRENT_BINARY_DIR}/rpath-absolute" + ${CMAKE_TOOLSET_RPATH_TEST_GENERATOR_OPTIONS} -DATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_USE_ABSOLUTE_RPATH=ON + -DCMAKE_BUILD_RPATH_USE_ORIGIN=ON -DCMAKE_HOST_BUILD_RPATH_USE_ORIGIN=ON + -DCMAKE_TOOLSET_RPATH_TEST_EXPECT_USE_ORIGIN=ON) +endif() + if(NOT DEFINED __COMPILER_OPTION_LOADED) set(CMAKE_TOOLSET_TEST_IS_TOP_LEVEL TRUE) if(MSVC) diff --git a/test/rpath/CMakeLists.txt b/test/rpath/CMakeLists.txt new file mode 100644 index 00000000..c5c9c45a --- /dev/null +++ b/test/rpath/CMakeLists.txt @@ -0,0 +1,108 @@ +cmake_minimum_required(VERSION 3.16) + +project(cmake-toolset-rpath-test LANGUAGES C CXX) + +set(ATFRAMEWORK_CMAKE_TOOLSET_DIR "${CMAKE_CURRENT_LIST_DIR}/../..") +set(PROJECT_THIRD_PARTY_PACKAGE_DIR "${CMAKE_CURRENT_BINARY_DIR}/packages") +set(PROJECT_THIRD_PARTY_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/target-prefix") +set(PROJECT_THIRD_PARTY_HOST_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/host-prefix") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib") +set(CMAKE_TOOLSET_RPATH_TEST_TARGET_USER_RPATH "${CMAKE_CURRENT_BINARY_DIR}/target-user-rpath") +set(CMAKE_TOOLSET_RPATH_TEST_HOST_USER_RPATH "${CMAKE_CURRENT_BINARY_DIR}/host-user-rpath") +set(CMAKE_BUILD_RPATH + "${CMAKE_TOOLSET_RPATH_TEST_TARGET_USER_RPATH}" + CACHE STRING "Target build RPATH fixture" FORCE) +set(CMAKE_HOST_BUILD_RPATH + "${CMAKE_TOOLSET_RPATH_TEST_HOST_USER_RPATH}" + CACHE STRING "Host build RPATH fixture" FORCE) + +set(ENV{LD_LIBRARY_PATH} "cmake-toolset-rpath-sentinel") +include("${ATFRAMEWORK_CMAKE_TOOLSET_DIR}/Import.cmake") + +if(APPLE) + set(CMAKE_TOOLSET_RPATH_TEST_TARGET_ORIGIN "@loader_path") +elseif(UNIX) + set(CMAKE_TOOLSET_RPATH_TEST_TARGET_ORIGIN "$ORIGIN") +endif() +if(CMAKE_HOST_APPLE) + set(CMAKE_TOOLSET_RPATH_TEST_HOST_ORIGIN "@loader_path") +elseif(CMAKE_HOST_UNIX) + set(CMAKE_TOOLSET_RPATH_TEST_HOST_ORIGIN "$ORIGIN") +endif() + +set(CMAKE_TOOLSET_RPATH_TEST_TARGET_PREFIX_RPATH "${PROJECT_THIRD_PARTY_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}") +set(CMAKE_TOOLSET_RPATH_TEST_HOST_PREFIX_RPATH "${PROJECT_THIRD_PARTY_HOST_INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}") +set(CMAKE_TOOLSET_RPATH_TEST_TARGET_EXPECTED_RPATH "${CMAKE_TOOLSET_RPATH_TEST_TARGET_PREFIX_RPATH}") +set(CMAKE_TOOLSET_RPATH_TEST_HOST_EXPECTED_RPATH "${CMAKE_TOOLSET_RPATH_TEST_HOST_PREFIX_RPATH}") +if(NOT ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_USE_ABSOLUTE_RPATH AND CMAKE_TOOLSET_RPATH_TEST_TARGET_ORIGIN) + file(RELATIVE_PATH CMAKE_TOOLSET_RPATH_TEST_RELATIVE_DIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + "${CMAKE_TOOLSET_RPATH_TEST_TARGET_PREFIX_RPATH}") + set(CMAKE_TOOLSET_RPATH_TEST_TARGET_EXPECTED_RPATH + "${CMAKE_TOOLSET_RPATH_TEST_TARGET_ORIGIN}/${CMAKE_TOOLSET_RPATH_TEST_RELATIVE_DIR}") +endif() +if(NOT ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_USE_ABSOLUTE_RPATH AND CMAKE_TOOLSET_RPATH_TEST_HOST_ORIGIN) + file(RELATIVE_PATH CMAKE_TOOLSET_RPATH_TEST_RELATIVE_DIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" + "${CMAKE_TOOLSET_RPATH_TEST_HOST_PREFIX_RPATH}") + set(CMAKE_TOOLSET_RPATH_TEST_HOST_EXPECTED_RPATH + "${CMAKE_TOOLSET_RPATH_TEST_HOST_ORIGIN}/${CMAKE_TOOLSET_RPATH_TEST_RELATIVE_DIR}") +endif() + +foreach(cmake_toolset_rpath_test_var CMAKE_BUILD_RPATH COMPILER_OPTION_INHERIT_CMAKE_BUILD_RPATH) + if(NOT CMAKE_TOOLSET_RPATH_TEST_TARGET_EXPECTED_RPATH IN_LIST ${cmake_toolset_rpath_test_var} + OR NOT CMAKE_TOOLSET_RPATH_TEST_TARGET_USER_RPATH IN_LIST ${cmake_toolset_rpath_test_var}) + message(FATAL_ERROR "${cmake_toolset_rpath_test_var} does not contain the expected target RPATH entries") + endif() +endforeach() +foreach(cmake_toolset_rpath_test_var CMAKE_HOST_BUILD_RPATH COMPILER_OPTION_INHERIT_CMAKE_HOST_BUILD_RPATH) + if(NOT CMAKE_TOOLSET_RPATH_TEST_HOST_EXPECTED_RPATH IN_LIST ${cmake_toolset_rpath_test_var} + OR NOT CMAKE_TOOLSET_RPATH_TEST_HOST_USER_RPATH IN_LIST ${cmake_toolset_rpath_test_var}) + message(FATAL_ERROR "${cmake_toolset_rpath_test_var} does not contain the expected host RPATH entries") + endif() +endforeach() +if(NOT "${CMAKE_BUILD_RPATH}" STREQUAL "${COMPILER_OPTION_INHERIT_CMAKE_BUILD_RPATH}" + OR NOT "${CMAKE_HOST_BUILD_RPATH}" STREQUAL "${COMPILER_OPTION_INHERIT_CMAKE_HOST_BUILD_RPATH}") + message(FATAL_ERROR "Build RPATH is not inherited unchanged") +endif() + +if(DEFINED CMAKE_TOOLSET_RPATH_TEST_EXPECT_USE_ORIGIN) + if(NOT "${CMAKE_BUILD_RPATH_USE_ORIGIN}" STREQUAL "${CMAKE_TOOLSET_RPATH_TEST_EXPECT_USE_ORIGIN}" + OR NOT "${CMAKE_HOST_BUILD_RPATH_USE_ORIGIN}" STREQUAL "${CMAKE_TOOLSET_RPATH_TEST_EXPECT_USE_ORIGIN}" + OR NOT "${COMPILER_OPTION_INHERIT_CMAKE_BUILD_RPATH_USE_ORIGIN}" STREQUAL + "${CMAKE_TOOLSET_RPATH_TEST_EXPECT_USE_ORIGIN}" + OR NOT "${COMPILER_OPTION_INHERIT_CMAKE_HOST_BUILD_RPATH_USE_ORIGIN}" STREQUAL + "${CMAKE_TOOLSET_RPATH_TEST_EXPECT_USE_ORIGIN}") + message(FATAL_ERROR "Outer BUILD_RPATH_USE_ORIGIN settings were changed") + endif() +elseif(ATFRAMEWORK_CMAKE_TOOLSET_THIRD_PARTY_USE_ABSOLUTE_RPATH) + if(CMAKE_BUILD_RPATH_USE_ORIGIN OR CMAKE_HOST_BUILD_RPATH_USE_ORIGIN) + message(FATAL_ERROR "Absolute RPATH mode unexpectedly enables origin mode") + endif() +elseif(NOT CMAKE_BUILD_RPATH_USE_ORIGIN OR NOT CMAKE_HOST_BUILD_RPATH_USE_ORIGIN) + message(FATAL_ERROR "Relative RPATH mode did not enable origin mode") +elseif(CMAKE_TOOLSET_RPATH_TEST_TARGET_ORIGIN AND CMAKE_TOOLSET_RPATH_TEST_TARGET_PREFIX_RPATH IN_LIST + CMAKE_BUILD_RPATH) + message(FATAL_ERROR "Target RPATH is not loader-relative") +elseif(CMAKE_TOOLSET_RPATH_TEST_HOST_ORIGIN AND CMAKE_TOOLSET_RPATH_TEST_HOST_PREFIX_RPATH IN_LIST + CMAKE_HOST_BUILD_RPATH) + message(FATAL_ERROR "Host RPATH is not loader-relative") +endif() +if(NOT "$ENV{LD_LIBRARY_PATH}" STREQUAL "cmake-toolset-rpath-sentinel") + message(FATAL_ERROR "Import.cmake changed LD_LIBRARY_PATH") +endif() + +file( + GENERATE + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/rpath-test.c" + CONTENT "#if defined(_WIN32)\n__declspec(dllexport)\n#endif\nint cmake_toolset_rpath_test(void) { return 0; }\n") +add_library(cmake-toolset-rpath-test SHARED "${CMAKE_CURRENT_BINARY_DIR}/rpath-test.c") +set_target_properties( + cmake-toolset-rpath-test PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_TOOLSET_RPATH_TEST_TARGET_PREFIX_RPATH}" + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_THIRD_PARTY_INSTALL_DIR}/bin") + +file( + GENERATE + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/rpath-test-main.c" + CONTENT "int cmake_toolset_rpath_test(void);\nint main(void) { return cmake_toolset_rpath_test(); }\n") +add_executable(cmake-toolset-rpath-run "${CMAKE_CURRENT_BINARY_DIR}/rpath-test-main.c") +target_link_libraries(cmake-toolset-rpath-run PRIVATE cmake-toolset-rpath-test)