polserver/cmake/Boost.cmake
Fernando Rozenblit 596fb9e0ae
Fix CMake bugs: escript tests under multi-config generators, and cleanups (#895)
- escript tests: pass $<TARGET_FILE:ecompile|runecl> instead of
  ${output_bin_dir}/... - with the Visual Studio generator binaries land
  in bin/<config>/, so every escript_* test failed locally while Ninja CI
  passed
- message(ERROR) is not an error mode; clang-tidy-missing is now FATAL_ERROR
- git_rev target: "BYPRODUCTS=path" was a literal command argument, not the
  BYPRODUCTS keyword; pol_revision.h is now properly declared
- source_group_by_folder: read the computed relative_file variable
  (relative_path was never set, absolute-path sources got an empty group)
- shard_test_2: the second FIXTURES_REQUIRED overwrote the first; merged
  into one property value
- remove dead code: unused DEBUG_VERSION/RELEASE_VERSION defines, unused
  msvc_ide variable, no-op link_directories in set_compile_flags,
  compiler-predefined _WIN32/_WIN64
- guard add_dependencies(lib* lib*_ext) with if(TARGET ...) consistently
  (Antlr/Boost/Efsw/Cppdap already did; the target only exists when the
  prebuilt lib is absent)
- replace deprecated TestBigEndian with CMAKE_CXX_BYTE_ORDER; warn that
  big-endian is unsupported
- restore Boost unknown-toolset FATAL_ERROR (empty toolset made
  bootstrap fail much later with a cryptic error)
- OUTPUT_BINARY_DIR/EXT_DOWNLOAD_DIR are CACHE PATH, not STRING

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 20:58:21 +02:00

151 lines
5.4 KiB
CMake

message("* libboost")
set (BOOST_SOURCE_DIR "${EXT_DOWNLOAD_DIR}/boost_1_91_0-1")
set (BOOST_STAGE_LIB_DIR "${BOOST_SOURCE_DIR}/stage/lib")
if (clang)
set (BOOST_TOOLSET "clang")
elseif (gcc)
set (BOOST_TOOLSET "gcc")
elseif (msvc)
if (MSVC_TOOLSET_VERSION EQUAL 140)
set (BOOST_TOOLSET "msvc") # VS 2015 (14.0)
elseif(MSVC_TOOLSET_VERSION EQUAL 141)
set(BOOST_TOOLSET "msvc-14.1") # VS 2017 (15.0)
elseif(MSVC_TOOLSET_VERSION EQUAL 142)
set(BOOST_TOOLSET "msvc-14.2") # VS 2019 (16.0)
elseif(MSVC_TOOLSET_VERSION EQUAL 143)
set(BOOST_TOOLSET "msvc-14.3") # VS 2022 (17.0)
elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 145)
set(BOOST_TOOLSET "msvc-14.5") # VS 2026 (18.0)
endif()
endif()
# without a toolset bootstrap fails much later with a cryptic error
if (NOT DEFINED BOOST_TOOLSET)
message(FATAL_ERROR "Unknown boost toolset to build (compiler ${CMAKE_CXX_COMPILER_ID}, MSVC toolset '${MSVC_TOOLSET_VERSION}')")
endif()
set (BOOST_ARC "")
if (${windows})
set (BOOST_CONFIGURE_COMMAND "bootstrap.bat")
set (BOOST_BUILD_COMMAND "b2.exe")
set (BOOST_STACKTRACE_LIB2 "${BOOST_STAGE_LIB_DIR}/libboost_stacktrace_windbg.lib")
set (BOOST_STACKTRACE_LIB "${BOOST_STAGE_LIB_DIR}/libboost_stacktrace_from_exception.lib")
if (msvc)
set (BOOST_CXX_FLAGS "/MT -DBOOST_STACKTRACE_LINK")
else()
set (BOOST_CXX_FLAGS "-fms-runtime-lib=static -DBOOST_STACKTRACE_LINK")
endif()
else()
set (BOOST_CONFIGURE_COMMAND "./bootstrap.sh")
set (BOOST_BUILD_COMMAND "./b2")
set (BOOST_STACKTRACE_LIB2 "${BOOST_STAGE_LIB_DIR}/libboost_stacktrace_backtrace.a")
set (BOOST_STACKTRACE_LIB "${BOOST_STAGE_LIB_DIR}/libboost_stacktrace_from_exception.a" )
set (BOOST_CXX_FLAGS "-std=c++${CMAKE_CXX_STANDARD} -DBOOST_STACKTRACE_LINK")
if (clang)
set (BOOST_STACKTRACE_LIB2 "${BOOST_STAGE_LIB_DIR}/libboost_stacktrace_addr2line.a")
endif()
if (APPLE)
foreach(OSX_ARCHITECTURE ${CMAKE_OSX_ARCHITECTURES})
set (BOOST_CXX_FLAGS "${BOOST_CXX_FLAGS} -arch ${OSX_ARCHITECTURE}")
endforeach()
set (BOOST_ARC "architecture=arm+x86")
set (BOOST_STACKTRACE_LIB "${BOOST_STAGE_LIB_DIR}/libboost_stacktrace_basic.a")
set (BOOST_STACKTRACE_LIB2 "")
else()
set (BOOST_CXX_FLAGS "${BOOST_CXX_FLAGS} -fPIC")
endif()
endif()
set(boost_needs_extract FALSE)
set(boost_needs_build FALSE)
if (NOT EXISTS "${BOOST_SOURCE_DIR}/boost")
message(" - will extract")
ExternalProject_Add(libboost_ext
URL "https://github.com/boostorg/boost/releases/download/boost-1.91.0-1/boost-1.91.0-1-b2-nodocs.tar.gz"
SOURCE_DIR "${BOOST_SOURCE_DIR}"
CONFIGURE_COMMAND ${BOOST_CONFIGURE_COMMAND} --with-toolset=${BOOST_TOOLSET}
BUILD_COMMAND ""
INSTALL_COMMAND ""
URL_HASH SHA256=b5a3d1490118e012f8b12688240d981bcdfcd009fd35bc70d120fbc907df4f7c
BUILD_BYPRODUCTS "${BOOST_SOURCE_DIR}"
LOG_DOWNLOAD 1
LOG_CONFIGURE 1
BUILD_IN_SOURCE 1
LOG_OUTPUT_ON_FAILURE 1
DOWNLOAD_EXTRACT_TIMESTAMP 1
EXCLUDE_FROM_ALL 1
)
set_target_properties (libboost_ext PROPERTIES FOLDER 3rdParty)
set(boost_needs_extract TRUE)
else()
message(" - will not extract")
endif()
if(NOT EXISTS ${BOOST_STACKTRACE_LIB})
message(" - will build in ${BOOST_SOURCE_DIR} toolset=${BOOST_TOOLSET} cxxflags=${BOOST_CXX_FLAGS}")
ExternalProject_Add(boost_build
SOURCE_DIR ${BOOST_SOURCE_DIR}
INSTALL_COMMAND ""
CONFIGURE_COMMAND ""
DOWNLOAD_COMMAND ""
BUILD_COMMAND ${BOOST_BUILD_COMMAND} cxxflags=${BOOST_CXX_FLAGS} cflags=${BOOST_CXX_FLAGS} address-model=${ARCH_BITS} toolset=${BOOST_TOOLSET} ${BOOST_ARC} variant=release link=static runtime-link=static --layout=system --with-stacktrace stage
BUILD_BYPRODUCTS ${BOOST_STACKTRACE_LIB} ${BOOST_STACKTRACE_LIB2}
LOG_BUILD 1
BUILD_IN_SOURCE 1
LOG_OUTPUT_ON_FAILURE 1
)
if (boost_needs_extract)
add_dependencies(boost_build libboost_ext)
endif()
set_target_properties (boost_build PROPERTIES FOLDER 3rdParty)
set(boost_needs_build TRUE)
else()
message(" - will not build")
endif()
# imported target to add include/lib dir and additional dependencies
add_library(libboost_headers INTERFACE IMPORTED)
set_target_properties(libboost_headers PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${BOOST_SOURCE_DIR}
)
if (boost_needs_extract)
add_dependencies(libboost_headers libboost_ext)
endif()
if (USE_BOOST_HEADER_STACKTRACE)
add_library(libboost_stacktrace INTERFACE IMPORTED)
set_target_properties(libboost_stacktrace PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${BOOST_SOURCE_DIR}
INTERFACE_COMPILE_DEFINITIONS BOOST_STACKTRACE_USE_ADDR2LINE
FOLDER 3rdParty
)
set(BOOST_STACKTRACE_LIB2)
else()
add_library(libboost_stacktrace STATIC IMPORTED)
set_target_properties(libboost_stacktrace PROPERTIES
IMPORTED_LOCATION ${BOOST_STACKTRACE_LIB}
IMPORTED_IMPLIB ${BOOST_STACKTRACE_LIB}
INTERFACE_INCLUDE_DIRECTORIES ${BOOST_SOURCE_DIR}
INTERFACE_COMPILE_DEFINITIONS BOOST_STACKTRACE_LINK
FOLDER 3rdParty
)
endif()
if (${windows})
set_property(TARGET libboost_stacktrace APPEND
PROPERTY INTERFACE_LINK_LIBRARIES
dbgeng
ole32
${BOOST_STACKTRACE_LIB2}
)
else()
set_property(TARGET libboost_stacktrace APPEND
PROPERTY INTERFACE_LINK_LIBRARIES
${BOOST_STACKTRACE_LIB2}
dl
$<$<NOT:$<PLATFORM_ID:Darwin>>:backtrace>
)
endif()
if (boost_needs_build)
add_dependencies(libboost_stacktrace boost_build)
endif()