Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[boost-modular-build-helper] Attempt to pass flags more correctly into b2 #23001

Merged
merged 14 commits into from
Mar 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions docs/maintainers/ports/vcpkg-cmake/vcpkg_cmake_get_vars.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,16 @@ vcpkg_cmake_get_vars(<out-var>)
a path to a generated CMake file, with the detected `CMAKE_*` variables
re-exported as `VCPKG_DETECTED_CMAKE_*`.

Additionally sets, for `RELEASE` and `DEBUG`:
- VCPKG_COMBINED_CXX_FLAGS_<config>
- VCPKG_COMBINED_C_FLAGS_<config>
- VCPKG_COMBINED_SHARED_LINKER_FLAGS_<config>
- VCPKG_COMBINED_STATIC_LINKER_FLAGS_<config>
- VCPKG_COMBINED_EXE_LINKER_FLAGS_<config>

Most users should use these pre-combined flags instead of attempting
to read the `VCPKG_DETECTED_*` flags directly.

## Notes
Avoid usage in portfiles.

Expand Down
212 changes: 70 additions & 142 deletions ports/boost-modular-build-helper/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
cmake_minimum_required(VERSION 3.9)
project(boost CXX)
project(boost NONE)

# The following variables are used in user-config.jam file
set(USER_CONFIG_TOOLSET)
set(USER_CONFIG_TOOLSET_VERSION)
set(USER_CONFIG_TOOLSET_INVOCATION_COMMAND)
set(USER_CONFIG_TOOLSET_OPTIONS)
set(USER_CONFIG_EXTRA_LINES)
set(USER_CONFIG_TOOLSET "")
set(USER_CONFIG_TOOLSET_VERSION "")
set(USER_CONFIG_TOOLSET_INVOCATION_COMMAND "")
set(USER_CONFIG_TOOLSET_OPTIONS "")
set(USER_CONFIG_EXTRA_LINES "")
set(USER_CONFIG_REQUIREMENTS "")

set(B2_OPTIONS)

include("${VCPKG_CMAKE_VARS_FILE}")

# Add build type specific options
if(VCPKG_CRT_LINKAGE STREQUAL "dynamic")
list(APPEND B2_OPTIONS runtime-link=shared)
Expand All @@ -23,13 +26,13 @@ else()
list(APPEND B2_OPTIONS link=static)
endif()

if(CMAKE_SIZEOF_VOID_P EQUAL 8)
if(VCPKG_DETECTED_CMAKE_SIZEOF_VOID_P EQUAL "8")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This variable is not set. (And why no longer CMAKE_SIZEOF_VOID_P)?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Anwer to the question: No languages enabled here.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This variable is not set.

... because I didn't update vcpkg-cmake at the same time.

Why can't we use version>= for such dependencies?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why can't we use version>= for such dependencies?

manifest mode would have automatically reinstalled here. Just always start from scratch if you use classic mode and do git operations.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

manifest mode would have automatically reinstalled here.

... unless I (the user) would pin a different version. That's why I think it is useful to make the versioned dependencies explicit.

list(APPEND B2_OPTIONS address-model=64)
else()
list(APPEND B2_OPTIONS address-model=32)
endif()

if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "s390x")
if(VCPKG_TARGET_ARCHITECTURE STREQUAL "s390x")
list(APPEND B2_OPTIONS architecture=s390x)
elseif(VCPKG_TARGET_ARCHITECTURE STREQUAL "arm" OR VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64")
list(APPEND B2_OPTIONS architecture=arm)
Expand All @@ -43,178 +46,103 @@ if(VCPKG_TARGET_ARCHITECTURE STREQUAL "x86" AND WIN32)
list(APPEND B2_OPTIONS "asmflags=/safeseh")
endif()

if(WIN32)
if(MSVC)
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(USER_CONFIG_TOOLSET clang-win)
else()
set(USER_CONFIG_TOOLSET msvc)
endif()
if(MSVC_VERSION LESS 1900)
math(EXPR USER_CONFIG_TOOLSET_VERSION "${MSVC_VERSION} / 10 - 60")
else()
math(EXPR USER_CONFIG_TOOLSET_VERSION "${MSVC_VERSION} / 10 - 50")
endif()
if(VCPKG_DETECTED_MSVC)
if(VCPKG_DETECTED_CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(USER_CONFIG_TOOLSET clang-win)
else()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(USER_CONFIG_TOOLSET clang)
else()
set(USER_CONFIG_TOOLSET gcc)
endif()
set(USER_CONFIG_TOOLSET msvc)
endif()
list(APPEND B2_OPTIONS target-os=windows)
elseif(APPLE)
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(USER_CONFIG_TOOLSET clang)
if(VCPKG_DETECTED_MSVC_VERSION LESS "1900")
math(EXPR USER_CONFIG_TOOLSET_VERSION "${VCPKG_DETECTED_MSVC_VERSION} / 10 - 60")
else()
set(USER_CONFIG_TOOLSET gcc)
math(EXPR USER_CONFIG_TOOLSET_VERSION "${VCPKG_DETECTED_MSVC_VERSION} / 10 - 50")
endif()
elseif(VCPKG_DETECTED_CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(USER_CONFIG_TOOLSET clang)
else()
set(USER_CONFIG_TOOLSET gcc)
endif()

if(WIN32)
list(APPEND B2_OPTIONS target-os=windows)
elseif(APPLE)
list(APPEND B2_OPTIONS target-os=darwin)
elseif(ANDROID)
set(USER_CONFIG_TOOLSET gcc)
list(APPEND B2_OPTIONS target-os=android)
else()
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(USER_CONFIG_TOOLSET clang)
else()
set(USER_CONFIG_TOOLSET gcc)
endif()
list(APPEND B2_OPTIONS target-os=linux)
endif()

# Properly handle compiler and linker flags passed by VCPKG
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set(CXXFLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")
set(CFLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_RELEASE}")
if(BUILD_SHARED_LIBS)
set(LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
else()
set(LDFLAGS "${CMAKE_STATIC_LINKER_FLAGS} ${CMAKE_STATIC_LINKER_FLAGS_RELEASE}")
endif()
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CXXFLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")
set(CFLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_DEBUG}")
if(BUILD_SHARED_LIBS)
set(LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_DEBUG}")
else()
set(LDFLAGS "${CMAKE_STATIC_LINKER_FLAGS} ${CMAKE_STATIC_LINKER_FLAGS_DEBUG}")
endif()
endif()

if(APPLE)
if(CMAKE_OSX_DEPLOYMENT_TARGET)
set(CXXFLAGS "-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET} ${CXXFLAGS}")
set(CFLAGS "-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET} ${CFLAGS}")
set(LDFLAGS "-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET} ${LDFLAGS}")
endif()

if(CMAKE_OSX_SYSROOT)
set(CXXFLAGS "-isysroot ${CMAKE_OSX_SYSROOT} ${CXXFLAGS}")
set(CFLAGS "-isysroot ${CMAKE_OSX_SYSROOT} ${CFLAGS}")
set(LDFLAGS "-isysroot ${CMAKE_OSX_SYSROOT} ${LDFLAGS}")
endif()
string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_BUILD_TYPE)

# if specific architectures are set, configure them,
# if not set, this will still default to current arch
foreach(ARCH IN LISTS CMAKE_OSX_ARCHITECTURES)
set(CXXFLAGS "-arch ${ARCH} ${CXXFLAGS}")
set(CFLAGS "-arch ${ARCH} ${CFLAGS}")
set(LDFLAGS "-arch ${ARCH} ${LDFLAGS}")
endforeach()
endif()

string(REGEX REPLACE "[ \t\r\n]+" " " CXXFLAGS "${CXXFLAGS}")
string(STRIP "${CXXFLAGS}" CXXFLAGS)
string(REGEX REPLACE "[ \t\r\n]+" " " CFLAGS "${CFLAGS}")
string(STRIP "${CFLAGS}" CFLAGS)
string(REGEX REPLACE "[ \t\r\n]+" " " LDFLAGS "${LDFLAGS}")
string(STRIP "${LDFLAGS}" LDFLAGS)

if(NOT CXXFLAGS STREQUAL "")
string(REPLACE " " " <cxxflags>" CXXFLAGS "<cxxflags>${CXXFLAGS}")
endif()
if(NOT CFLAGS STREQUAL "")
string(REPLACE " " " <cflags>" CFLAGS "<cflags>${CFLAGS}")
endif()
if(NOT LDFLAGS STREQUAL "")
string(REPLACE " " " <linkflags>" LDFLAGS "<linkflags>${LDFLAGS}")
endif()

if(CMAKE_CXX_COMPILER_TARGET AND CMAKE_CXX_COMPILE_OPTIONS_TARGET)
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
string(APPEND CXXFLAGS " <compileflags>${CMAKE_CXX_COMPILE_OPTIONS_TARGET}${CMAKE_CXX_COMPILER_TARGET}")
string(APPEND LDFLAGS " <linkflags>${CMAKE_CXX_COMPILE_OPTIONS_TARGET}${CMAKE_CXX_COMPILER_TARGET}")
else()
string(APPEND CXXFLAGS " <compileflags>${CMAKE_CXX_COMPILE_OPTIONS_TARGET} <compileflags>${CMAKE_CXX_COMPILER_TARGET}")
string(APPEND LDFLAGS " <linkflags>${CMAKE_CXX_COMPILE_OPTIONS_TARGET} <linkflags>${CMAKE_CXX_COMPILER_TARGET}")
endif()
endif()

if(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN)
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
string(APPEND CXXFLAGS " <compileflags>${CMAKE_CXX_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN}${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}")
string(APPEND LDFLAGS " <linkflags>${CMAKE_CXX_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN}${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}")
else()
string(APPEND CXXFLAGS " <compileflags>${CMAKE_CXX_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN} <compileflags>${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}")
string(APPEND LDFLAGS " <linkflags>${CMAKE_CXX_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN} <linkflags>${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}")
endif()
endif()

if(CMAKE_SYSROOT AND CMAKE_CXX_COMPILE_OPTIONS_SYSROOT)
string(APPEND CXXFLAGS " <compileflags>${CMAKE_CXX_COMPILE_OPTIONS_SYSROOT}${CMAKE_SYSROOT}")
string(APPEND LDFLAGS " <linkflags>${CMAKE_CXX_COMPILE_OPTIONS_SYSROOT}${CMAKE_SYSROOT}")
endif()
foreach(INCDIR IN LISTS CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES)
string(APPEND CXXFLAGS " <compileflags>${CMAKE_INCLUDE_FLAG_C}${CMAKE_INCLUDE_FLAG_C_SEP}${INCDIR}")
endforeach()
set(CXXFLAGS "${VCPKG_COMBINED_CXX_FLAGS_${UPPER_BUILD_TYPE}}")
set(CFLAGS "${VCPKG_COMBINED_C_FLAGS_${UPPER_BUILD_TYPE}}")
set(LDFLAGS "${VCPKG_COMBINED_SHARED_LINKER_FLAGS_${UPPER_BUILD_TYPE}}")
set(ARFLAGS "${VCPKG_COMBINED_STATIC_LINKER_FLAGS_${UPPER_BUILD_TYPE}}")

if(APPLE)
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
string(APPEND CXXFLAGS " <compileflags>-D_DARWIN_C_SOURCE <cxxflags>-std=c++11 <cxxflags>-stdlib=libc++")
string(APPEND LDFLAGS " <linkflags>-stdlib=libc++")
else()
string(APPEND CXXFLAGS " <compileflags>-D_DARWIN_C_SOURCE <cxxflags>-std=c++11")
string(APPEND COMPILEFLAGS " -D_DARWIN_C_SOURCE")
if(NOT CXXFLAGS MATCHES " -std=")
# If the user hasn't provided their own standard flag, use at least c++11
string(APPEND CXXFLAGS " -std=c++11")
endif()
endif()

if(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore")
if(VCPKG_DETECTED_CMAKE_SYSTEM_NAME STREQUAL "WindowsStore")
# cl in b2 appears to not receive `LIBPATH` for finding winmd files, so we transform them to `/AI` options.
set(libpath_args "$ENV{LIBPATH}")
# Apply: {x -> /AI"x"}
list(TRANSFORM libpath_args PREPEND "/AI\"")
list(TRANSFORM libpath_args APPEND "\"")
# Apply: {\ -> \\}
list(TRANSFORM libpath_args REPLACE "\\\\" "\\\\\\\\")
# Apply: {" -> \"}
list(TRANSFORM libpath_args REPLACE "\\\"" "\\\\\"")
list(JOIN libpath_args " " libpath_arg)

string(APPEND CXXFLAGS " <compileflags>\"${libpath_arg}\" <cxxflags>/ZW <compileflags>\"/D_WIN32_WINNT=0x0A00\"")
string(APPEND CFLAGS " <cflags>-Zl")
string(APPEND CXXFLAGS " /ZW")
string(APPEND COMPILEFLAGS " ${libpath_arg} /D_WIN32_WINNT=0x0A00")
string(APPEND CFLAGS " -Zl")
list(APPEND B2_OPTIONS windows-api=store)
list(APPEND B2_OPTIONS linkflags=WindowsApp.lib)
Comment on lines -192 to 104
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like this would partly conflict with the uwp settings in #22831

endif()

set(USER_CONFIG_TOOLSET_INVOCATION_COMMAND "\"${CMAKE_CXX_COMPILER}\"")
set(USER_CONFIG_TOOLSET_INVOCATION_COMMAND "\"${VCPKG_DETECTED_CMAKE_CXX_COMPILER}\"")

string(APPEND CXXFLAGS "${COMPILEFLAGS}")
string(APPEND CFLAGS "${COMPILEFLAGS}")

foreach(var CXXFLAGS CFLAGS LDFLAGS ARFLAGS)
string(REPLACE [[\]] [[\\]] ${var} "${${var}}")
string(REPLACE [["]] [[\"]] ${var} "${${var}}")
string(REGEX REPLACE "[ \t\r\n]+" " " ${var} "${${var}}")
string(STRIP "${${var}}" ${var})
endforeach()

if(USER_CONFIG_TOOLSET STREQUAL "msvc")
file(TO_CMAKE_PATH "${CMAKE_CURRENT_LIST_DIR}/nothing.bat" NOTHING_BAT)
string(APPEND USER_CONFIG_TOOLSET_OPTIONS
" <setup>\"${NOTHING_BAT}\"\n"
" ${CXXFLAGS}\n"
" ${CFLAGS}\n"
" ${LDFLAGS}\n"
)
if(NOT ARFLAGS STREQUAL "")
# Only apply these flags for MSVC
string(APPEND USER_CONFIG_REQUIREMENTS "<archiveflags>\"${ARFLAGS}\"\n ")
endif()
else()
string(APPEND USER_CONFIG_TOOLSET_OPTIONS
" <ranlib>\"${CMAKE_RANLIB}\"\n"
" <archiver>\"${CMAKE_AR}\"\n"
" ${CXXFLAGS}\n"
" ${CFLAGS}\n"
" ${LDFLAGS}\n"
" <ranlib>\"${VCPKG_DETECTED_CMAKE_RANLIB}\"\n"
" <archiver>\"${VCPKG_DETECTED_CMAKE_AR}\"\n"
)
endif()

if(NOT CXXFLAGS STREQUAL "")
string(APPEND USER_CONFIG_TOOLSET_OPTIONS " <cxxflags>\"${CXXFLAGS}\"\n")
endif()
if(NOT CFLAGS STREQUAL "")
string(APPEND USER_CONFIG_TOOLSET_OPTIONS " <cflags>\"${CFLAGS}\"\n <asmflags>\"${CFLAGS}\"\n")
endif()
if(NOT LDFLAGS STREQUAL "")
string(APPEND USER_CONFIG_REQUIREMENTS "<linkflags>\"${LDFLAGS}\"\n ")
string(APPEND USER_CONFIG_TOOLSET_OPTIONS " <linkflags>\"${LDFLAGS}\"\n")
endif()

if(WIN32 AND NOT USER_CONFIG_TOOLSET STREQUAL "msvc")
# MINGW here causes b2 to not run cygpath
string(APPEND USER_CONFIG_TOOLSET_OPTIONS
Expand Down Expand Up @@ -255,7 +183,7 @@ endif()
# Handle Python
set(python_versions "")

if("python2" IN_LIST FEATURES)
if(WITH_PYTHON2)
# Find Python2 in the current installed directory
file(GLOB python2_include_dir "${CURRENT_INSTALLED_DIR}/include/python2.*")
string(REGEX REPLACE ".*python([0-9\.]+).*" "\\1" python2_version "${python2_include_dir}")
Expand All @@ -266,7 +194,7 @@ if("python2" IN_LIST FEATURES)
list(APPEND python_versions "${python2_version}")
endif()

if("python3" IN_LIST FEATURES)
if(WITH_PYTHON3)
# Find Python3 in the current installed directory
file(GLOB python3_include_dir "${CURRENT_INSTALLED_DIR}/include/python3.*")
string(REGEX REPLACE ".*python([0-9\.]+).*" "\\1" python3_version "${python3_include_dir}")
Expand Down
11 changes: 11 additions & 0 deletions ports/boost-modular-build-helper/boost-modular-build.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -105,17 +105,28 @@ function(boost_modular_build)
list(APPEND configure_options "-DBOOST_CMAKE_FRAGMENT=${_bm_BOOST_CMAKE_FRAGMENT}")
endif()

vcpkg_cmake_get_vars(cmake_vars_file)

vcpkg_check_features(
OUT_FEATURE_OPTIONS feature_options
FEATURES
python2 WITH_PYTHON2
python3 WITH_PYTHON3
)

vcpkg_cmake_configure(
SOURCE_PATH ${BOOST_BUILD_INSTALLED_DIR}/share/boost-build
GENERATOR Ninja
OPTIONS
"-DPORT=${PORT}"
"-DFEATURES=${FEATURES}"
${feature_options}
"-DCURRENT_INSTALLED_DIR=${CURRENT_INSTALLED_DIR}"
"-DB2_EXE=${B2_EXE}"
"-DSOURCE_PATH=${_bm_SOURCE_PATH}"
"-DBOOST_BUILD_PATH=${BOOST_BUILD_PATH}"
"-DVCPKG_CRT_LINKAGE=${VCPKG_CRT_LINKAGE}"
"-DVCPKG_CMAKE_VARS_FILE=${cmake_vars_file}"
${configure_options}
MAYBE_UNUSED_VARIABLES
FEATURES
Expand Down
2 changes: 1 addition & 1 deletion ports/boost-modular-build-helper/user-config.jam.in
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ using @USER_CONFIG_TOOLSET@ : @USER_CONFIG_TOOLSET_VERSION@ : @USER_CONFIG_TOOLS

@USER_CONFIG_EXTRA_LINES@

project user-config : ;
project user-config : requirements @USER_CONFIG_REQUIREMENTS@ ;

if "@USER_CONFIG_TOOLSET@" = "msvc" || "@USER_CONFIG_TOOLSET@" = "clang-win"
{
Expand Down
3 changes: 2 additions & 1 deletion ports/boost-modular-build-helper/vcpkg.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
{
"name": "boost-modular-build-helper",
"version": "1.78.0",
"port-version": 2,
"port-version": 3,
"description": "Internal vcpkg port used to build Boost libraries",
"license": "MIT",
"dependencies": [
"boost-uninstall",
"vcpkg-cmake"
Expand Down
4 changes: 2 additions & 2 deletions ports/ffmpeg/build.sh.in
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,11 @@ OSX_ARCH_COUNT=0@OSX_ARCH_COUNT@
build_ffmpeg() {
echo "=== CONFIGURING ==="

sh "$PATH_TO_SRC_DIR/configure" "--prefix=$PATH_TO_PACKAGE_DIR" @CONFIGURE_OPTIONS@ $@
sh "$PATH_TO_SRC_DIR/configure" "--prefix=$PATH_TO_PACKAGE_DIR" "--cc=$CC" @CONFIGURE_OPTIONS@ $@

echo "=== BUILDING ==="

make -j${JOBS}
make -j${JOBS} V=1

echo "=== INSTALLING ==="

Expand Down
Loading