Skip to content

Commit

Permalink
Depend on Boost using FetchContent instead of relying on system-provi…
Browse files Browse the repository at this point in the history
…ded Boost.
  • Loading branch information
fruffy committed May 31, 2024
1 parent 0db2432 commit 24cdef8
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 26 deletions.
18 changes: 2 additions & 16 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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)
Expand All @@ -227,9 +216,6 @@ if (ENABLE_MULTITHREAD)
add_definitions(-DMULTITHREAD)
endif()
list (APPEND P4C_LIB_DEPS ${CMAKE_THREAD_LIBS_INIT})
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
set (HAVE_LIBBOOST_IOSTREAMS 1)
list (APPEND P4C_LIB_DEPS ${Boost_LIBRARIES})
if (ENABLE_GC)
list (APPEND P4C_LIB_DEPS ${LIBGC_LIBRARIES})
endif ()
Expand Down
95 changes: 95 additions & 0 deletions cmake/Boost.cmake
Original file line number Diff line number Diff line change
@@ -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)
3 changes: 0 additions & 3 deletions tools/ci-build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,6 @@ P4C_DEPS="bison \
g++ \
git \
lld \
libboost-dev \
libboost-graph-dev \
libboost-iostreams-dev \
libfl-dev \
pkg-config \
python3 \
Expand Down
7 changes: 0 additions & 7 deletions tools/install_mac_deps.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,14 @@ HOMEBREW_PREFIX=$(brew --prefix)
# Fetch the latest formulae
brew update

BOOST_LIB="[email protected]"
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
Expand Down

0 comments on commit 24cdef8

Please sign in to comment.