Skip to content

Commit d12fadf

Browse files
Add z3 installation to dockerfile (#751)
* Add z3 installation to dockerfile * automatic z3 detection * minor cleanup * fix: FindZ3.cmake shouldn't try compile with ASAN * clean: rm z3 auto, not necessary anymore * ci: add arm build for pull requests * ci: arm runner min is 22.04 * ci: disable swift on 24.04-arm * clean: fix pre-commit * test: ignore flaky tests for 24.04+ * minor --------- Co-authored-by: Lucas Briese <lucas.briese@iem.fraunhofer.de>
1 parent cd5f556 commit d12fadf

6 files changed

Lines changed: 80 additions & 23 deletions

File tree

.github/workflows/ci.yml

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ on:
1010
# TODO test conan build
1111
jobs:
1212
build:
13-
runs-on: ubuntu-20.04
13+
runs-on: ${{ matrix.os }}
1414
strategy:
1515
fail-fast: true
1616
matrix:
17+
os: [ubuntu-20.04, ubuntu-24.04-arm]
1718
compiler: [ [clang++-19, clang-19, "clang-19 libclang-rt-19-dev"] ]
1819
build: [ Debug, Release, DebugLibdeps ]
1920
include:
@@ -26,6 +27,11 @@ jobs:
2627
- build: DebugLibdeps
2728
cmake_build_type: Debug
2829
flags: -DPHASAR_DEBUG_LIBDEPS=ON -DBUILD_SHARED_LIBS=ON
30+
exclude:
31+
- os: ubuntu-24.04-arm
32+
build: Debug
33+
- os: ubuntu-24.04-arm
34+
build: DebugLibdeps
2935

3036
continue-on-error: false
3137
steps:
@@ -41,9 +47,11 @@ jobs:
4147
./utils/InstallAptDependencies.sh --noninteractive tzdata ${{ matrix.compiler[2] }}
4248
4349
- uses: swift-actions/setup-swift@v2
50+
if: matrix.os == 'ubuntu-20.04'
4451
with:
4552
swift-version: "5.8.1"
46-
- name: Building Phasar in ${{ matrix.build }} with ${{ matrix.compiler[0] }}
53+
- name: Building Phasar in ${{ matrix.build }} with ${{ matrix.compiler[0] }} including swift
54+
if: matrix.os == 'ubuntu-20.04'
4755
env:
4856
CXX: ${{ matrix.compiler[0] }}
4957
CC: ${{ matrix.compiler[1] }}
@@ -58,6 +66,21 @@ jobs:
5866
-G Ninja
5967
ninja -C build
6068
69+
- name: Building Phasar in ${{ matrix.build }} with ${{ matrix.compiler[0] }}
70+
if: matrix.os != 'ubuntu-20.04'
71+
env:
72+
CXX: ${{ matrix.compiler[0] }}
73+
CC: ${{ matrix.compiler[1] }}
74+
shell: bash
75+
run: |
76+
cmake -S . -B build \
77+
-DCMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \
78+
-DBUILD_PHASAR_CLANG=OFF \
79+
-DPHASAR_USE_Z3=ON \
80+
${{ matrix.flags }} \
81+
-G Ninja
82+
ninja -C build
83+
6184
- name: Run Unittests
6285
shell: bash
6386
run: |

CMakeLists.txt

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -320,18 +320,26 @@ add_llvm()
320320
# Z3 Solver
321321
if(PHASAR_IN_TREE)
322322
set (PHASAR_USE_Z3 OFF)
323-
endif()
324-
if(PHASAR_USE_Z3 AND NOT PHASAR_IN_TREE)
325-
# This z3-version is the same version LLVM requires; however, we cannot just use Z3 via the LLVM interface
326-
# as it lacks some functionality (such as z3::expr::simplify()) that we require
327-
find_package(Z3 4.7.1 REQUIRED)
328-
329-
if(NOT TARGET z3)
330-
add_library(z3 IMPORTED SHARED)
331-
set_property(TARGET z3 PROPERTY
332-
IMPORTED_LOCATION ${Z3_LIBRARIES})
333-
set_property(TARGET z3 PROPERTY
334-
INTERFACE_INCLUDE_DIRECTORIES ${Z3_INCLUDE_DIR})
323+
else()
324+
if(PHASAR_USE_Z3)
325+
# This z3-version is the same version LLVM requires; however, we cannot just use Z3 via the LLVM interface
326+
# as it lacks some functionality (such as z3::expr::simplify()) that we require
327+
328+
# FindZ3.cmake by llvm tries to compile a snippet with Z3 which crashes on arm with sanitizers enabled
329+
set(SAFE_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
330+
set(CMAKE_CXX_FLAGS "")
331+
find_package(Z3 4.7.1 REQUIRED)
332+
set(CMAKE_CXX_FLAGS "${SAFE_CMAKE_CXX_FLAGS}")
333+
334+
if(Z3_FOUND)
335+
if (NOT TARGET z3)
336+
add_library(z3 IMPORTED SHARED)
337+
set_property(TARGET z3 PROPERTY
338+
IMPORTED_LOCATION ${Z3_LIBRARIES})
339+
set_property(TARGET z3 PROPERTY
340+
INTERFACE_INCLUDE_DIRECTORIES ${Z3_INCLUDE_DIR})
341+
endif()
342+
endif()
335343
endif()
336344
endif()
337345

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ RUN --mount=type=bind,source=.,target=/usr/src/phasar,rw \
2121
-DPHASAR_ENABLE_SANITIZERS=ON \
2222
-DBUILD_PHASAR_CLANG=ON \
2323
-DPHASAR_USE_Z3=ON \
24-
-DPHASAR_ALLOW_LTO_IN_RELEASE_BUILD=ON \
2524
-DPHASAR_BUILD_UNITTESTS=$RUN_TESTS \
25+
-DPHASAR_BUILD_IR=$RUN_TESTS \
2626
-DPHASAR_BUILD_OPENSSL_TS_UNITTESTS=OFF \
2727
-G Ninja; \
2828
ninja -C cmake-build/Release install; \

bootstrap.sh

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ else
146146
# install missing packages if necessary
147147
boostlibnames=("libboost-graph")
148148
additional_boost_libs=()
149-
for boost_lib in ${boostlibnames[@]}; do
149+
for boost_lib in "${boostlibnames[@]}"; do
150150
dpkg -s "$boost_lib${DESIRED_BOOST_VERSION}" >/dev/null 2>&1 ||
151151
dpkg -s "$boost_lib${DESIRED_BOOST_VERSION}.0" >/dev/null 2>&1 ||
152152
additional_boost_libs+=("$boost_lib${DESIRED_BOOST_VERSION}") ||
@@ -163,7 +163,7 @@ fi
163163

164164
# installing LLVM
165165
tmp_dir=$(mktemp -d "llvm-build.XXXXXXXX" --tmpdir)
166-
./utils/install-llvm.sh "${NUM_THREADS}" "${tmp_dir}" ${LLVM_INSTALL_DIR} ${LLVM_RELEASE}
166+
./utils/install-llvm.sh "${NUM_THREADS}" "${tmp_dir}" "${LLVM_INSTALL_DIR}" ${LLVM_RELEASE}
167167
rm -rf "${tmp_dir}"
168168
echo "dependencies successfully installed"
169169

@@ -193,7 +193,8 @@ if ${DO_UNIT_TEST}; then
193193
NUM_FAILED_TESTS=0
194194

195195
pushd unittests
196-
for x in $(find . -type f -executable -print); do
196+
mapfile -t files < <(find . -type f -executable)
197+
for x in "${files[@]}"; do
197198
pushd "${x%/*}" && ./"${x##*/}" || { echo "Test ${x} failed."; NUM_FAILED_TESTS=$((NUM_FAILED_TESTS+1)); };
198199
popd;
199200
done
@@ -206,13 +207,13 @@ fi
206207

207208
if ${DO_INSTALL}; then
208209
echo "install phasar..."
209-
sudo cmake -DCMAKE_INSTALL_PREFIX=${PHASAR_INSTALL_DIR} -P cmake_install.cmake
210+
sudo cmake -DCMAKE_INSTALL_PREFIX="${PHASAR_INSTALL_DIR}" -P cmake_install.cmake
210211
sudo ldconfig
211212
safe_cd ..
212213
echo "phasar successfully installed to ${PHASAR_INSTALL_DIR}"
213214

214215
echo "Set environment variables"
215-
./utils/setEnvironmentVariables.sh ${LLVM_INSTALL_DIR} ${PHASAR_INSTALL_DIR}
216+
./utils/setEnvironmentVariables.sh "${LLVM_INSTALL_DIR}" "${PHASAR_INSTALL_DIR}"
216217
fi
217218

218219
echo "done."

unittests/CMakeLists.txt

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,30 @@ add_dependencies(PhasarUnitTests LLFileGeneration)
44

55
set(PHASAR_UNITTEST_DIR ${CMAKE_CURRENT_BINARY_DIR})
66

7+
cmake_host_system_information(RESULT cores QUERY NUMBER_OF_LOGICAL_CORES)
8+
set(additional_args -j ${cores})
9+
10+
# ignore flaky tests
11+
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
12+
execute_process(COMMAND lsb_release -r
13+
OUTPUT_VARIABLE UBUNTU_VERSION
14+
OUTPUT_STRIP_TRAILING_WHITESPACE)
15+
string(REGEX REPLACE "^[^0-9]+([0-9]+)\\.([0-9]+).*" "\\1" UBUNTU_MAJOR_VERSION "${UBUNTU_VERSION}")
16+
17+
if ("${UBUNTU_MAJOR_VERSION}" GREATER 22)
18+
# TODO tests shouldn't be flaky
19+
list(APPEND additional_args -E "\"(LLVMBasedCFGTest|LLVMBasedICFGGlobCtorDtorTest|IDEInstInteractionAnalysisTest|IFDSUninitializedVariablesTest|IDEGeneralizedLCATest|IDEExtendedTaintAnalysisTest)\"")
20+
# LLVMBasedCFGTest.HandlesCppStandardType
21+
# IDEInstInteractionAnalysisTest.HandleBasicTest_04
22+
# IFDSUninitializedVariablesTest.UninitTest_05_SHOULD_NOT_LEAK
23+
# .UninitTest_06_SHOULD_NOT_LEAK
24+
# IDEGeneralizedLCATest.StringTestCpp
25+
# IDEExtendedTaintAnalysisTest.XTaint09
26+
endif()
27+
endif()
28+
729
add_custom_target(check-phasar-unittests
8-
COMMAND ${CMAKE_CTEST_COMMAND} --progress --output-on-failure -j 8
30+
COMMAND ${CMAKE_CTEST_COMMAND} --progress --output-on-failure ${additional_args}
931
WORKING_DIRECTORY ${PHASAR_UNITTEST_DIR}
1032
DEPENDS PhasarUnitTests
1133
)

utils/InstallAptDependencies.sh

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ additional_dependencies=("$@")
2424
packages=("${additional_dependencies[@]}")
2525
packages+=(
2626
git ca-certificates build-essential cmake ninja-build # build
27-
binutils # LTO
2827
"clang-$LLVM_IR_VERSION" # compiler for IR
2928
"libclang-rt-$LLVM_IR_VERSION-dev" # ASAN
30-
libboost-graph-dev libsqlite3-dev libssl-dev zlib1g-dev "libclang-$LLVM_IR_VERSION-dev" "llvm-$LLVM_IR_VERSION-dev" "libclang-common-$LLVM_IR_VERSION-dev" # build deps
29+
libsqlite3-dev libz3-dev libssl-dev "libclang-$LLVM_IR_VERSION-dev" "libclang-common-$LLVM_IR_VERSION-dev" # optional build deps
30+
libboost-graph-dev zlib1g-dev "llvm-$LLVM_IR_VERSION-dev" # build deps
3131
)
3232

3333

@@ -82,4 +82,7 @@ additional_dependencies=("$@")
8282
"${pkg_mgr[@]}" update
8383
check_if_llvm_apt_is_required
8484
"${pkg_mgr[@]}" install --no-install-recommends -y "${packages[@]}"
85+
if "$noninteractive"; then
86+
"${pkg_mgr[@]}" clean
87+
fi
8588
)

0 commit comments

Comments
 (0)