From a6c31998a6dd757c014d631a76163a3b8ae72081 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 | 15 ++-- backends/graphs/CMakeLists.txt | 12 ++++ backends/p4tools/common/lib/symbolic_env.cpp | 2 - cmake/Boost.cmake | 76 ++++++++++++++++++++ ir/solver.h | 14 ++-- tools/ci-build.sh | 3 - tools/install_mac_deps.sh | 7 -- 7 files changed, 102 insertions(+), 27 deletions(-) create mode 100644 cmake/Boost.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 54454c91ae3..f893b36ceac 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,6 +199,8 @@ 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) @@ -227,15 +225,14 @@ 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 ${Boost_INCLUDE_DIRS}) +include_directories(BEFORE SYSTEM ${PROTOBUF_INCLUDE_DIRS}) if (ENABLE_GC) list (APPEND P4C_LIB_DEPS ${LIBGC_LIBRARIES}) endif () set (P4C_ABSL_LIBRARIES absl::flat_hash_map absl::flat_hash_set) list (APPEND P4C_LIB_DEPS ${P4C_ABSL_LIBRARIES}) +list(APPEND P4C_LIB_DEPS Boost::iostreams Boost::format Boost::multiprecision) # Other required libraries. p4c_add_library (rt clock_gettime HAVE_CLOCK_GETTIME) @@ -468,7 +465,7 @@ endif () if (ENABLE_EBPF) add_subdirectory (backends/ebpf) endif () -if (ENABLE_P4C_GRAPHS AND HAVE_LIBBOOST_GRAPH EQUAL 1) +if (ENABLE_P4C_GRAPHS) add_subdirectory (backends/graphs) endif () if (ENABLE_P4TC) diff --git a/backends/graphs/CMakeLists.txt b/backends/graphs/CMakeLists.txt index 2d05d43d592..43672f55ae9 100644 --- a/backends/graphs/CMakeLists.txt +++ b/backends/graphs/CMakeLists.txt @@ -12,6 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. +# fetchcontent_declare( +# boost_graph +# GIT_REPOSITORY https://github.com/boostorg/graph.git +# GIT_TAG boost-${P4C_BOOST_VERSION} +# USES_TERMINAL_DOWNLOAD TRUE +# GIT_PROGRESS TRUE +# GIT_SHALLOW TRUE +# ) +# include_directories(BEFORE SYSTEM ${boost_graph_SOURCE_DIR}/include) +# fetchcontent_makeavailable(boost_graph) + + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/version.h.cmake" "${CMAKE_CURRENT_BINARY_DIR}/version.h" @ONLY) diff --git a/backends/p4tools/common/lib/symbolic_env.cpp b/backends/p4tools/common/lib/symbolic_env.cpp index e66ca624fc6..26bf02f063c 100644 --- a/backends/p4tools/common/lib/symbolic_env.cpp +++ b/backends/p4tools/common/lib/symbolic_env.cpp @@ -3,8 +3,6 @@ #include #include -#include - #include "backends/p4tools/common/lib/model.h" #include "ir/indexed_vector.h" #include "ir/vector.h" diff --git a/cmake/Boost.cmake b/cmake/Boost.cmake new file mode 100644 index 00000000000..a372f28b60e --- /dev/null +++ b/cmake/Boost.cmake @@ -0,0 +1,76 @@ +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(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.7z + USES_TERMINAL_DOWNLOAD TRUE + GIT_PROGRESS TRUE + DOWNLOAD_NO_EXTRACT FALSE + ) + FetchContent_MakeAvailable(Boost) + include_directories(BEFORE SYSTEM ${Boost_SOURCE_DIR}/libs/iostreams/include) + include_directories(BEFORE SYSTEM ${Boost_SOURCE_DIR}/libs/format/include) + include_directories(BEFORE SYSTEM ${Boost_SOURCE_DIR}/libs/multiprecision/include) + include_directories(BEFORE SYSTEM ${Boost_SOURCE_DIR}/libs/graph/include) + + + # Reset temporary variable modifications. + set(CMAKE_UNITY_BUILD ${CMAKE_UNITY_BUILD_PREV}) + set(FETCHCONTENT_QUIET ${FETCHCONTENT_QUIET_PREV}) + endif() + + set (HAVE_LIBBOOST_IOSTREAMS TRUE) + + message(STATUS "Done with setting up Boost for P4C.") +endmacro(p4c_obtain_boost) diff --git a/ir/solver.h b/ir/solver.h index 459be62fa28..8bd83f79745 100644 --- a/ir/solver.h +++ b/ir/solver.h @@ -4,9 +4,8 @@ #include #include -#include -#include - +#include "absl/container/flat_hash_map.h" +#include "absl/container/flat_hash_set.h" #include "ir/ir.h" #include "lib/castable.h" #include "lib/cstring.h" @@ -20,13 +19,16 @@ struct SymbolicVarComp { bool operator()(const IR::SymbolicVariable *s1, const IR::SymbolicVariable *s2) const { return s1->operator<(*s2); } + size_t operator()(const IR::SymbolicVariable *s1) const { + return std::hash()(s1->label); + } }; /// This type maps symbolic variables to their value assigned by the solver. -using SymbolicMapping = boost::container::flat_map; +using SymbolicMapping = + absl::flat_hash_map; -using SymbolicSet = boost::container::flat_set; +using SymbolicSet = absl::flat_hash_set; /// Provides a higher-level interface for an SMT solver. class AbstractSolver : public ICastable { 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