From 459d094556104d7f2f4cd2ec32742abefc279b18 Mon Sep 17 00:00:00 2001 From: fruffy Date: Fri, 10 May 2024 15:01:29 -0400 Subject: [PATCH] Depend on Boost using FetchContent instead of relying on system-provided Boost. --- CMakeLists.txt | 20 ++------- cmake/Boost.cmake | 95 +++++++++++++++++++++++++++++++++++++++ tools/ci-build.sh | 3 -- tools/install_mac_deps.sh | 7 --- 4 files changed, 98 insertions(+), 27 deletions(-) create mode 100644 cmake/Boost.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 54454c91ae3..437fed12f8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -152,10 +152,6 @@ if(STATIC_BUILD_WITH_DYNAMIC_GLIBC OR STATIC_BUILD_WITH_DYNAMIC_STDLIB) endif() set(BUILD_SHARED_LIBS OFF) set(CMAKE_FIND_LIBRARY_SUFFIXES .a) - # Link Boost statically - # See https://cmake.org/cmake/help/latest/module/FindBoost.html for details - set(Boost_USE_STATIC_LIBS ON) - set(Boost_USE_STATIC_RUNTIME OFF) # Set the static variable set(P4C_STATIC_BUILD STATIC) # TODO: We can not use -static here because of compilation and portability problems: @@ -203,20 +199,13 @@ include(Abseil) p4c_obtain_abseil() include(Protobuf) p4c_obtain_protobuf() +include(Boost) +p4c_obtain_boost() # We require -pthread to make std::call_once work, even if we're not using threads... set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) -# The boost graph headers are optional and only required by the graphs back end. -find_package (Boost QUIET COMPONENTS graph) -if (Boost_FOUND) - set (HAVE_LIBBOOST_GRAPH 1) -else () - message (WARNING "Boost graph headers not found, will not build 'graphs' backend") -endif () -find_package (Boost REQUIRED COMPONENTS iostreams) - # Compile with the Boehm garbage collector (https://github.com/ivmai/bdwgc), if requested. # One can disable the GC, e.g., to run under Valgrind, by editing config.h. if (ENABLE_GC) @@ -227,10 +216,7 @@ if (ENABLE_MULTITHREAD) add_definitions(-DMULTITHREAD) endif() list (APPEND P4C_LIB_DEPS ${CMAKE_THREAD_LIBS_INIT}) -include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) -include_directories(SYSTEM ${PROTOBUF_INCLUDE_DIRS}) -set (HAVE_LIBBOOST_IOSTREAMS 1) -list (APPEND P4C_LIB_DEPS ${Boost_LIBRARIES}) +include_directories(BEFORE SYSTEM ${PROTOBUF_INCLUDE_DIRS}) if (ENABLE_GC) list (APPEND P4C_LIB_DEPS ${LIBGC_LIBRARIES}) endif () diff --git a/cmake/Boost.cmake b/cmake/Boost.cmake new file mode 100644 index 00000000000..201189099c0 --- /dev/null +++ b/cmake/Boost.cmake @@ -0,0 +1,95 @@ +macro(p4c_obtain_boost) + option( + P4C_USE_PREINSTALLED_BOOST + "Look for a preinstalled version of Boost in the system instead of installing the library using FetchContent." + OFF + ) + + set(P4C_BOOST_VERSION "1.85.0") + + # If P4C_USE_PREINSTALLED_BOOST is ON just try to find a preinstalled version of Boost. + if(P4C_USE_PREINSTALLED_BOOST) + if(NOT BUILD_SHARED_LIBS) + # Link Boost statically + # See https://cmake.org/cmake/help/latest/module/FindBoost.html for details + set(Boost_USE_STATIC_LIBS ON) + set(Boost_USE_STATIC_RUNTIME OFF) + endif() + + # The boost graph headers are optional and only required by the graphs back end. + find_package (Boost QUIET COMPONENTS graph) + if (Boost_FOUND) + set (HAVE_LIBBOOST_GRAPH 1) + else () + message (WARNING "Boost graph headers not found, will not build 'graphs' backend") + endif () + find_package (Boost REQUIRED COMPONENTS format multiprecision) + include_directories(BEFORE SYSTEM ${Boost_INCLUDE_DIRS}) + + else() + message(STATUS "Fetching Boost version ${P4C_BOOST_VERSION} for P4C...") + # Print out download state while setting up Boost. + set(FETCHCONTENT_QUIET_PREV ${FETCHCONTENT_QUIET}) + set(FETCHCONTENT_QUIET OFF) + # Unity builds do not work for Abseil... + set(CMAKE_UNITY_BUILD_PREV ${CMAKE_UNITY_BUILD}) + set(CMAKE_UNITY_BUILD OFF) + + + # Add boost library sources. + set(BOOST_INCLUDE_LIBRARIES graph format multiprecision iostreams) + set(BOOST_ENABLE_CMAKE ON) + + if (ENABLE_P4C_GRAPHS) + set(HAVE_LIBBOOST_GRAPH 1) + endif() + + # Always link Boost statically. + set(Boost_USE_STATIC_LIBS ON) + set(Boost_USE_STATIC_RUNTIME OFF) + # set(BOOST_MP_STANDALONE ON CACHE BOOL "Use Boost.Multiprecision in standalone mode") + + # Download and extract the boost library from GitHub. + message(STATUS "Downloading and extracting boost library sources. This may take some time...") + FetchContent_Declare( + Boost + URL https://github.com/boostorg/boost/releases/download/boost-${P4C_BOOST_VERSION}/boost-${P4C_BOOST_VERSION}-cmake.tar.xz + USES_TERMINAL_DOWNLOAD TRUE + GIT_PROGRESS TRUE + ) + FetchContent_MakeAvailable(Boost) + + # Force inclusion of the correct Boost headers. This is necessary because users may have their own system boost headers which can be in conflict. + set (Boost_INCLUDE_DIRS ${Boost_BINARY_DIR}/include) + file(GLOB __boost_include_directories + ${Boost_SOURCE_DIR}/libs/**/include ${Boost_SOURCE_DIR}/libs/**/**/include + ) + foreach(__boost_include_directory ${__boost_include_directories}) + if(IS_DIRECTORY ${__boost_include_directory}) + include_directories(BEFORE SYSTEM ${__boost_include_directory}) + endif() + endforeach() + # Suppress warnings for all Boost targets. + get_all_targets(BOOST_BUILD_TARGETS ${Boost_SOURCE_DIR}) + foreach(target in ${BOOST_BUILD_TARGETS}) + if(target MATCHES "boost_*") + # Do not suppress warnings for Boost library targets that are aliased. + get_target_property(target_type ${target} TYPE) + if (NOT ${target_type} STREQUAL "INTERFACE_LIBRARY") + target_compile_options(${target} PRIVATE "-Wno-error" "-w") + endif() + endif() + endforeach() + + + # Reset temporary variable modifications. + set(CMAKE_UNITY_BUILD ${CMAKE_UNITY_BUILD_PREV}) + set(FETCHCONTENT_QUIET ${FETCHCONTENT_QUIET_PREV}) + endif() + + set(HAVE_LIBBOOST_IOSTREAMS TRUE) + set (P4C_BOOST_LIBRARIES Boost::iostreams Boost::format Boost::multiprecision) + list(APPEND P4C_LIB_DEPS ${P4C_BOOST_LIBRARIES}) + + message(STATUS "Done with setting up Boost for P4C.") +endmacro(p4c_obtain_boost) diff --git a/tools/ci-build.sh b/tools/ci-build.sh index 6a2bd78dc8d..08fdd066438 100755 --- a/tools/ci-build.sh +++ b/tools/ci-build.sh @@ -71,9 +71,6 @@ P4C_DEPS="bison \ g++ \ git \ lld \ - libboost-dev \ - libboost-graph-dev \ - libboost-iostreams-dev \ libfl-dev \ pkg-config \ python3 \ diff --git a/tools/install_mac_deps.sh b/tools/install_mac_deps.sh index 32707cff983..ffb6d3ca795 100755 --- a/tools/install_mac_deps.sh +++ b/tools/install_mac_deps.sh @@ -37,21 +37,14 @@ HOMEBREW_PREFIX=$(brew --prefix) # Fetch the latest formulae brew update -BOOST_LIB="boost@1.85" REQUIRED_PACKAGES=( autoconf automake ccache cmake libtool openssl pkg-config coreutils bison grep ninja - ${BOOST_LIB} ) for package in "${REQUIRED_PACKAGES[@]}"; do brew_install ${package} done -# Check if linking is needed. -if ! brew ls --linked --formula ${BOOST_LIB} > /dev/null 2>&1; then - brew link ${BOOST_LIB} -fi - # Check if PATH modification is needed. if ! grep -q "$(brew --prefix bison)/bin" ~/.bash_profile; then echo 'export PATH="$(brew --prefix bison)/bin:$PATH"' >> ~/.bash_profile