From 9f48af3edd9e1b78a694fe05a1ae7e22fb577fe1 Mon Sep 17 00:00:00 2001 From: Sebastian Ullrich Date: Fri, 2 May 2025 20:25:16 +0200 Subject: [PATCH] fix: cadical distribution on Linux (#8201) Compile it with the same flags as other executables --- CMakeLists.txt | 15 +++++++++++---- script/prepare-llvm-linux.sh | 3 ++- src/cadical.mk | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 583aaaba0a..09f1368b1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ option(USE_MIMALLOC "use mimalloc" ON) # store all variables passed on the command line into CL_ARGS so we can pass them to the stage builds # https://stackoverflow.com/a/48555098/161659 # MUST be done before call to 'project' -# Use standard release build (discarding LEAN_CXX_EXTRA_FLAGS etc.) for stage0 by default since it is assumed to be "good", but still pass through CMake platform arguments (compiler, toolchain file, ..). +# Use standard release build (discarding LEAN_EXTRA_CXX_FLAGS etc.) for stage0 by default since it is assumed to be "good", but still pass through CMake platform arguments (compiler, toolchain file, ..). # Use `STAGE0_` prefix to pass variables to stage0 explicitly. get_cmake_property(vars CACHE_VARIABLES) foreach(var ${vars}) @@ -39,10 +39,14 @@ endif() # Don't do anything with cadical on wasm if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten") - # On CI Linux, we source cadical from Nix instead; see flake.nix find_program(CADICAL cadical) if(NOT CADICAL) set(CADICAL_CXX c++) + if (CADICAL_USE_CUSTOM_CXX) + set(CADICAL_CXX ${CMAKE_CXX_COMPILER}) + set(CADICAL_CXXFLAGS "${LEAN_EXTRA_CXX_FLAGS}") + set(CADICAL_LDFLAGS "-Wl,-rpath=\\$$ORIGIN/../lib") + endif() find_program(CCACHE ccache) if(CCACHE) set(CADICAL_CXX "${CCACHE} ${CADICAL_CXX}") @@ -57,8 +61,11 @@ if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Emscripten") GIT_REPOSITORY https://github.com/arminbiere/cadical GIT_TAG rel-2.1.2 CONFIGURE_COMMAND "" - # https://github.com/arminbiere/cadical/blob/master/BUILD.md#manual-build - BUILD_COMMAND $(MAKE) -f ${CMAKE_SOURCE_DIR}/src/cadical.mk CMAKE_EXECUTABLE_SUFFIX=${CMAKE_EXECUTABLE_SUFFIX} CXX=${CADICAL_CXX} CXXFLAGS=${CADICAL_CXXFLAGS} + BUILD_COMMAND $(MAKE) -f ${CMAKE_SOURCE_DIR}/src/cadical.mk + CMAKE_EXECUTABLE_SUFFIX=${CMAKE_EXECUTABLE_SUFFIX} + CXX=${CADICAL_CXX} + CXXFLAGS=${CADICAL_CXXFLAGS} + LDFLAGS=${CADICAL_LDFLAGS} BUILD_IN_SOURCE ON INSTALL_COMMAND "") set(CADICAL ${CMAKE_BINARY_DIR}/cadical/cadical${CMAKE_EXECUTABLE_SUFFIX} CACHE FILEPATH "path to cadical binary" FORCE) diff --git a/script/prepare-llvm-linux.sh b/script/prepare-llvm-linux.sh index 767e3547cb..ee3d40eb30 100755 --- a/script/prepare-llvm-linux.sh +++ b/script/prepare-llvm-linux.sh @@ -55,7 +55,8 @@ $CP $GLIBC/lib/libc_nonshared.a stage1/lib/glibc $CP $GLIBC/lib/libpthread_nonshared.a stage1/lib/glibc for f in $GLIBC/lib/{ld,lib{c,dl,m,rt,pthread}}-*; do b=$(basename $f); cp $f stage1/lib/glibc/${b%-*}.so; done OPTIONS=() -echo -n " -DLEAN_STANDALONE=ON" +# We build cadical using the custom toolchain on Linux to avoid glibc versioning issues +echo -n " -DLEAN_STANDALONE=ON -DCADICAL_USE_CUSTOM_CXX=ON" echo -n " -DCMAKE_CXX_COMPILER=$PWD/llvm-host/bin/clang++ -DLEAN_CXX_STDLIB='-Wl,-Bstatic -lc++ -lc++abi -Wl,-Bdynamic'" echo -n " -DLEAN_EXTRA_CXX_FLAGS='--sysroot $PWD/llvm -idirafter $GLIBC_DEV/include ${EXTRA_FLAGS:-}'" # use target compiler directly when not cross-compiling diff --git a/src/cadical.mk b/src/cadical.mk index de6d888c5a..81d6d684ce 100644 --- a/src/cadical.mk +++ b/src/cadical.mk @@ -4,4 +4,4 @@ CXX ?= c++ $(CXX) -std=c++11 -O3 -DNDEBUG -DNBUILD $(CXXFLAGS) -c $< -o $@ ../../cadical$(CMAKE_EXECUTABLE_SUFFIX): $(patsubst src/%.cpp,%.o,$(shell ls src/*.cpp | grep -v mobical)) - $(CXX) -o $@ $^ + $(CXX) -o $@ $^ $(LDFLAGS)