From 97828a4be04adec5b35133ca16c0c975ce51d929 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Tue, 3 Jul 2018 17:23:03 -0700 Subject: [vcpkg] Use -fPIC in all builds to enable mixing static libs with shared objects. --- scripts/toolchains/freebsd.cmake | 14 +++++++++ scripts/toolchains/linux.cmake | 4 +-- scripts/toolchains/osx.cmake | 14 +++++++++ toolsrc/src/vcpkg/build.cpp | 64 ++++++++++++++++++++++++++-------------- 4 files changed, 72 insertions(+), 24 deletions(-) diff --git a/scripts/toolchains/freebsd.cmake b/scripts/toolchains/freebsd.cmake index bfeabe18b..9edbb8394 100644 --- a/scripts/toolchains/freebsd.cmake +++ b/scripts/toolchains/freebsd.cmake @@ -2,3 +2,17 @@ if(CMAKE_HOST_SYSTEM_NAME STREQUAL "FreeBSD") set(CMAKE_CROSSCOMPILING OFF CACHE BOOL "") endif() set(CMAKE_SYSTEM_NAME FreeBSD CACHE STRING "") + +get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE ) +if(NOT _CMAKE_IN_TRY_COMPILE) + set(CMAKE_CXX_FLAGS "${VCPKG_CXX_FLAGS} -fPIC" CACHE STRING "") + set(CMAKE_C_FLAGS "${VCPKG_C_FLAGS} -fPIC" CACHE STRING "") + + set(CMAKE_CXX_FLAGS_DEBUG "${VCPKG_CXX_FLAGS_DEBUG}" CACHE STRING "") + set(CMAKE_C_FLAGS_DEBUG "${VCPKG_C_FLAGS_DEBUG}" CACHE STRING "") + set(CMAKE_CXX_FLAGS_RELEASE "${VCPKG_CXX_FLAGS_RELEASE}" CACHE STRING "") + set(CMAKE_C_FLAGS_RELEASE "${VCPKG_C_FLAGS_RELEASE}" CACHE STRING "") + + set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${VCPKG_LINKER_FLAGS}" CACHE STRING "") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${VCPKG_LINKER_FLAGS}" CACHE STRING "") +endif() diff --git a/scripts/toolchains/linux.cmake b/scripts/toolchains/linux.cmake index 54f80c6a2..524d745cf 100644 --- a/scripts/toolchains/linux.cmake +++ b/scripts/toolchains/linux.cmake @@ -5,8 +5,8 @@ set(CMAKE_SYSTEM_NAME Linux CACHE STRING "") get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE ) if(NOT _CMAKE_IN_TRY_COMPILE) - set(CMAKE_CXX_FLAGS "${VCPKG_CXX_FLAGS}" CACHE STRING "") - set(CMAKE_C_FLAGS "${VCPKG_C_FLAGS}" CACHE STRING "") + set(CMAKE_CXX_FLAGS "${VCPKG_CXX_FLAGS} -fPIC" CACHE STRING "") + set(CMAKE_C_FLAGS "${VCPKG_C_FLAGS} -fPIC" CACHE STRING "") set(CMAKE_CXX_FLAGS_DEBUG "${VCPKG_CXX_FLAGS_DEBUG}" CACHE STRING "") set(CMAKE_C_FLAGS_DEBUG "${VCPKG_C_FLAGS_DEBUG}" CACHE STRING "") diff --git a/scripts/toolchains/osx.cmake b/scripts/toolchains/osx.cmake index dd21f5264..b8f261d09 100644 --- a/scripts/toolchains/osx.cmake +++ b/scripts/toolchains/osx.cmake @@ -2,3 +2,17 @@ if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin") set(CMAKE_CROSSCOMPILING OFF CACHE BOOL "") endif() set(CMAKE_SYSTEM_NAME Darwin CACHE STRING "") + +get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE ) +if(NOT _CMAKE_IN_TRY_COMPILE) + set(CMAKE_CXX_FLAGS "${VCPKG_CXX_FLAGS} -fPIC" CACHE STRING "") + set(CMAKE_C_FLAGS "${VCPKG_C_FLAGS} -fPIC" CACHE STRING "") + + set(CMAKE_CXX_FLAGS_DEBUG "${VCPKG_CXX_FLAGS_DEBUG}" CACHE STRING "") + set(CMAKE_C_FLAGS_DEBUG "${VCPKG_C_FLAGS_DEBUG}" CACHE STRING "") + set(CMAKE_CXX_FLAGS_RELEASE "${VCPKG_CXX_FLAGS_RELEASE}" CACHE STRING "") + set(CMAKE_C_FLAGS_RELEASE "${VCPKG_C_FLAGS_RELEASE}" CACHE STRING "") + + set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${VCPKG_LINKER_FLAGS}" CACHE STRING "") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${VCPKG_LINKER_FLAGS}" CACHE STRING "") +endif() diff --git a/toolsrc/src/vcpkg/build.cpp b/toolsrc/src/vcpkg/build.cpp index dc7653795..8e87fe7fe 100644 --- a/toolsrc/src/vcpkg/build.cpp +++ b/toolsrc/src/vcpkg/build.cpp @@ -1,9 +1,9 @@ #include "pch.h" -#include #include #include #include +#include #include #include #include @@ -473,11 +473,6 @@ namespace vcpkg::Build abi_tag_entries.emplace_back( AbiEntry{"control", vcpkg::Hash::get_file_hash(fs, config.port_dir / "CONTROL", "SHA1")}); - if (pre_build_info.cmake_system_name == "Linux") - { - abi_tag_entries.emplace_back(AbiEntry{"toolchain", "1"}); - } - abi_tag_entries.emplace_back(AbiEntry{"triplet", pre_build_info.triplet_abi_tag}); const std::string features = Strings::join(";", config.feature_list); @@ -798,21 +793,6 @@ namespace vcpkg::Build const fs::path ports_cmake_script_path = paths.scripts / "get_triplet_environment.cmake"; const fs::path triplet_file_path = paths.triplets / (triplet.canonical_name() + ".cmake"); - const std::string triplet_abi_tag = [&]() { - static std::map s_hash_cache; - - auto it_hash = s_hash_cache.find(triplet_file_path); - if (it_hash != s_hash_cache.end()) - { - return it_hash->second; - } - auto hash = Hash::get_file_hash(paths.get_filesystem(), triplet_file_path, "SHA1"); - s_hash_cache.emplace(triplet_file_path, hash); - return hash; - - return std::string(); - }(); - const auto cmd_launch_cmake = System::make_cmake_cmd(cmake_exe_path, ports_cmake_script_path, { @@ -824,7 +804,6 @@ namespace vcpkg::Build const std::vector lines = Strings::split(ec_data.output, "\n"); PreBuildInfo pre_build_info; - pre_build_info.triplet_abi_tag = triplet_abi_tag; const auto e = lines.cend(); auto cur = std::find(lines.cbegin(), e, FLAG_GUID); @@ -900,6 +879,47 @@ namespace vcpkg::Build Checks::exit_with_message(VCPKG_LINE_INFO, "Unknown variable name %s", line); } + pre_build_info.triplet_abi_tag = [&]() { + const auto& fs = paths.get_filesystem(); + static std::map s_hash_cache; + + auto it_hash = s_hash_cache.find(triplet_file_path); + if (it_hash != s_hash_cache.end()) + { + return it_hash->second; + } + auto hash = Hash::get_file_hash(fs, triplet_file_path, "SHA1"); + + if (auto p = pre_build_info.external_toolchain_file.get()) + { + hash += "-"; + hash += Hash::get_file_hash(fs, *p, "SHA1"); + } + else if (pre_build_info.cmake_system_name == "Linux") + { + hash += "-"; + hash += Hash::get_file_hash(fs, paths.scripts / "toolchains" / "linux.cmake", "SHA1"); + } + else if (pre_build_info.cmake_system_name == "Darwin") + { + hash += "-"; + hash += Hash::get_file_hash(fs, paths.scripts / "toolchains" / "osx.cmake", "SHA1"); + } + else if (pre_build_info.cmake_system_name == "FreeBSD") + { + hash += "-"; + hash += Hash::get_file_hash(fs, paths.scripts / "toolchains" / "freebsd.cmake", "SHA1"); + } + else if (pre_build_info.cmake_system_name == "Android") + { + hash += "-"; + hash += Hash::get_file_hash(fs, paths.scripts / "toolchains" / "android.cmake", "SHA1"); + } + + s_hash_cache.emplace(triplet_file_path, hash); + return hash; + }(); + return pre_build_info; } ExtendedBuildResult::ExtendedBuildResult(BuildResult code) : code(code) {} -- cgit v1.2.3