Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
0b7ae17
Update CI build and test workflow
adam-ce Jul 11, 2026
0259689
Improve CI dependency cache iteration
adam-ce Jul 11, 2026
d5b955c
Set CI test runtime library path
adam-ce Jul 11, 2026
9950ae4
Set CI geodata runtime paths
adam-ce Jul 11, 2026
d9b4a28
Avoid CI library path setup
adam-ce Jul 12, 2026
dbeb24e
Test CI with newer compiler matrix
adam-ce Jul 12, 2026
d30653a
Update fmt to 12.2.0
adam-ce Jul 12, 2026
05ba0a8
Update spdlog to v1.17.0
adam-ce Jul 12, 2026
8eeb7c1
Fix fmt 12 formatter compatibility
adam-ce Jul 12, 2026
2d91802
Use Clang 23 for ASAN CI
adam-ce Jul 12, 2026
da1ac46
compilation fix for zpp_bits:
adam-ce Jul 13, 2026
fa760ee
Pin zpp_bits before structured binding pack support
adam-ce Jul 13, 2026
1f327a5
Update CI workflow to trigger only on 'main' branch
adam-ce Jul 13, 2026
04df7e0
Update zpp_bits to v4.7.1
adam-ce Jul 13, 2026
365e48b
Allow zpp_bits access to octree Id
adam-ce Jul 14, 2026
16ca878
Fix mesh simplify CLI parse overloads
adam-ce Jul 14, 2026
d24fd54
Fix sf merger visitor template dispatch
adam-ce Jul 14, 2026
d01ac42
Fix Buffer constructor declaration
adam-ce Jul 14, 2026
6a96b29
Move sanitizer options to top-level CMake
adam-ce Jul 14, 2026
7455f47
Build dependencies with ThreadSanitizer
adam-ce Jul 15, 2026
1b275a9
Ignore local build directories
adam-ce Jul 15, 2026
a1f767d
Use terrainlib SRS transformations in tilebuilder tests
adam-ce Jul 15, 2026
8c059e0
Fix sanitizer CI builds
adam-ce Jul 15, 2026
3e1ddb1
Update zpp_bits and remove obsolete access workarounds
adam-ce Jul 15, 2026
0af3a60
Move zpp_bits serializers to associated namespaces
adam-ce Jul 15, 2026
ece6009
Add Clang unity build to CI
adam-ce Jul 16, 2026
bec6614
Fix texture assembler unity build
adam-ce Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
205 changes: 153 additions & 52 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,77 +2,178 @@ name: CI

on:
push:
branches: [ "main", "tile-downloader" ]
pull_request:
branches: [ "main", "tile-downloader" ]
branches: [ "main" ]

env:
BUILD_TYPE: Release
CCACHE_DIR: ${{ github.workspace }}/.ccache
CCACHE_MAXSIZE: 1G

jobs:
build-terrainbuilder:
runs-on: ubuntu-latest
build-and-test:
name: ${{ matrix.name }}
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
include:
- name: gcc-14-normal
cc: gcc-14
cxx: g++-14
build_type: Release
sanitizer: normal
cmake_flags: ""
- name: clang-23-asan
cc: clang-23
cxx: clang++-23
build_type: RelWithDebInfo
sanitizer: asan
cmake_flags: -DALP_ENABLE_ADDRESS_SANITIZER=ON
- name: clang-23-tsan
cc: clang-23
cxx: clang++-23
build_type: RelWithDebInfo
sanitizer: tsan
cmake_flags: -DALP_ENABLE_THREAD_SANITIZER=ON
- name: clang-23-unity
cc: clang-23
cxx: clang++-23
build_type: Release
sanitizer: normal
cmake_flags: -DALP_ENABLE_UNITY_BUILD=ON

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: true
submodules: true

- name: Install dependencies
run: sudo apt-get install libfmt-dev libglm-dev libgdal-dev catch2 libfreeimage-dev libtbb-dev

- name: Configure CMake
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
ccache \
extra-cmake-modules \
libcurl4-openssl-dev \
libegl1-mesa-dev \
libgl1-mesa-dev \
libglm-dev \
libgmp-dev \
libjpeg-dev \
libmpfr-dev \
libpng-dev \
libsqlite3-dev \
libtbb-dev \
libtiff-dev \
libwayland-bin \
libwayland-dev \
libxkbcommon-dev \
ninja-build \
pkg-config \
sqlite3 \
wayland-protocols \
xorg-dev \
zlib1g-dev

- name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --target terrainbuilder

build-tile-downloader:
if: github.ref == 'refs/heads/tile-downloader'
runs-on: ubuntu-latest
- name: Install LLVM 23
if: matrix.cxx == 'clang++-23'
run: |
wget -qO /tmp/llvm.sh https://apt.llvm.org/llvm.sh
chmod +x /tmp/llvm.sh
sudo /tmp/llvm.sh 23
sudo apt-get install -y --no-install-recommends libclang-rt-23-dev

steps:
- uses: actions/checkout@v3
- name: Restore installed CMake dependencies
id: cmake_dependency_cache
uses: actions/cache/restore@v4
with:
submodules: true
path: |
build/alp_external/boost
build/alp_external/proj
build/alp_external/gdal
build/alp_external/cgal
build/alp_external/opencv
key: ${{ runner.os }}-alp-installs-${{ matrix.name }}-${{ matrix.build_type }}-${{ matrix.sanitizer }}-${{ hashFiles('CMakeLists.txt', 'src/CMakeLists.txt', 'cmake/*.cmake') }}
restore-keys: |
${{ runner.os }}-alp-installs-${{ matrix.name }}-${{ matrix.build_type }}-${{ matrix.sanitizer }}-

- name: Install dependencies
run: sudo apt-get install libfmt-dev libglm-dev libgdal-dev catch2 libfreeimage-dev libtbb-dev libcurl4-openssl-dev

- name: Configure CMake
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
- name: Restore ccache
id: ccache_cache
uses: actions/cache/restore@v4
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ runner.os }}-ccache-${{ matrix.name }}-${{ matrix.sanitizer }}-${{ github.ref_name }}-${{ github.run_id }}-${{ github.run_attempt }}
restore-keys: |
${{ runner.os }}-ccache-${{ matrix.name }}-${{ matrix.sanitizer }}-${{ github.ref_name }}-
${{ runner.os }}-ccache-${{ matrix.name }}-${{ matrix.sanitizer }}-

- name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --target tile-downloader

test:
runs-on: ubuntu-latest
- name: Configure ccache
run: |
ccache --max-size="${CCACHE_MAXSIZE}"
ccache --zero-stats

steps:
- uses: actions/checkout@v3
- name: Configure CMake
run: >
cmake
-S "${{ github.workspace }}"
-B "${{ github.workspace }}/build"
-G Ninja
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
-DCMAKE_C_COMPILER=${{ matrix.cc }}
-DCMAKE_CXX_COMPILER=${{ matrix.cxx }}
-DCMAKE_C_COMPILER_LAUNCHER=ccache
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
${{ matrix.cmake_flags }}

- name: Save installed CMake dependencies
if: steps.cmake_dependency_cache.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
submodules: true
path: |
build/alp_external/boost
build/alp_external/proj
build/alp_external/gdal
build/alp_external/cgal
build/alp_external/opencv
key: ${{ runner.os }}-alp-installs-${{ matrix.name }}-${{ matrix.build_type }}-${{ matrix.sanitizer }}-${{ hashFiles('CMakeLists.txt', 'src/CMakeLists.txt', 'cmake/*.cmake') }}

- name: Install dependencies
run: sudo apt-get install libfmt-dev libglm-dev libgdal-dev catch2 libfreeimage-dev libtbb-dev

- name: Configure CMake
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
- name: Build all targets
run: cmake --build "${{ github.workspace }}/build" --config ${{ matrix.build_type }} --parallel --target all

- name: ccache stats
if: always()
run: ccache --show-stats

- name: Save ccache
if: always()
uses: actions/cache/save@v4
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ runner.os }}-ccache-${{ matrix.name }}-${{ matrix.sanitizer }}-${{ github.ref_name }}-${{ github.run_id }}-${{ github.run_attempt }}

- name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} --target unittests_terrainlib

- uses: actions/cache@v3
- name: Cache unit test data
id: terrain_builder_unittest_data
uses: actions/cache@v4
with:
path: ./unittests/data
key: terrain_builder_unittest_data.tar.gz

- name: Download data
if: steps.cache.outputs.cache-hit != 'true'
run: wget -qO- https://gataki.cg.tuwien.ac.at/raw/terrain_builder_unittest_data.tar.gz | tar xvz -C ./unittests/
path: unittests/data
key: terrain-builder-unittest-data-v1

- name: Test
working-directory: ${{github.workspace}}/build
run: ./unittests/unittests_terrainlib
- name: Download unit test data
if: steps.terrain_builder_unittest_data.outputs.cache-hit != 'true'
run: wget -qO- https://gataki.cg.tuwien.ac.at/raw/terrain_builder_unittest_data.tar.gz | tar xz -C unittests

- name: Run unit tests
working-directory: ${{ github.workspace }}/build
run: |
export PROJ_DATA="${{ github.workspace }}/build/alp_external/proj/share/proj"
export PROJ_LIB="${PROJ_DATA}"
export GDAL_DATA="${{ github.workspace }}/build/alp_external/gdal/share/gdal"
if [[ "${{ matrix.sanitizer }}" == "tsan" ]]; then
export TSAN_OPTIONS="suppressions=${{ github.workspace }}/extern/tbb/cmake/suppressions/tsan.suppressions"
fi
status=0
./unittests/unittests_terrainlib "~mesh::clip_on_bounds benchmark" || status=$?
./unittests/unittests_tilebuilder || status=$?
./unittests/unittests_meshbuilder || status=$?
./unittests/unittests_dagbuilder || status=$?
./unittests/unittests_sfmerger || status=$?
exit $status
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,5 @@ build-release/
.vs
/extern/*
src/scratch
/.qtcreator/
/build*/
36 changes: 36 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,42 @@ cmake_minimum_required(VERSION 3.21)
project(alpine-terrain-builder)
option(ALP_UNITTESTS "include unit test targets in the buildsystem" ON)

# ASAN & TSAN
option(ALP_ENABLE_THREAD_SANITIZER "compiles with thread sanitizer enabled" OFF)
option(ALP_ENABLE_ADDRESS_SANITIZER "compiles with address sanitizer enabled" OFF)

if(ALP_ENABLE_ADDRESS_SANITIZER)
if(ALP_ENABLE_THREAD_SANITIZER)
message(FATAL_ERROR "Cannot enable both AddressSanitizer and ThreadSanitizer")
endif()
endif()

if(ALP_ENABLE_ADDRESS_SANITIZER)
message(STATUS "AddressSanitizer enabled")
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
set(ALP_SANITIZER_FLAGS -fsanitize=address -fsanitize=leak -fsanitize=undefined -fno-omit-frame-pointer -g)
add_compile_options(${ALP_SANITIZER_FLAGS})
add_link_options(${ALP_SANITIZER_FLAGS})
else()
message(WARNING "ALP_ENABLE_ADDRESS_SANITIZER set but compiler is not GCC/Clang; ignoring")
endif()
endif()

if(ALP_ENABLE_THREAD_SANITIZER)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
message(WARNING "ThreadSanitizer is not recommended with Release builds. "
"Use Debug or RelWithDebInfo for accurate race detection.")
endif()
message(STATUS "ThreadSanitizer enabled")
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
set(ALP_SANITIZER_FLAGS -fsanitize=thread -fno-omit-frame-pointer -fno-optimize-sibling-calls -g)
add_compile_options(${ALP_SANITIZER_FLAGS})
add_link_options(${ALP_SANITIZER_FLAGS})
else()
message(WARNING "ALP_ENABLE_THREAD_SANITIZER set but compiler is not GCC/Clang; ignoring")
endif()
endif()

include(cmake/AddRepo.cmake)
include(cmake/SetupCMakeProject.cmake)

Expand Down
43 changes: 36 additions & 7 deletions cmake/SetupCMakeProject.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,20 @@ endif()
function(_alp_build_and_install NAME SRC_DIR BUILD_DIR INSTALL_DIR)
message(STATUS "[alp] Configuring ${NAME}")

string(JOIN " " _alp_sanitizer_flags ${ALP_SANITIZER_FLAGS})

execute_process(
COMMAND ${CMAKE_COMMAND}
-G ${CMAKE_GENERATOR}
-S ${SRC_DIR}
-B ${BUILD_DIR}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
"-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} ${_alp_sanitizer_flags}"
"-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} ${_alp_sanitizer_flags}"
"-DCMAKE_EXE_LINKER_FLAGS=${CMAKE_EXE_LINKER_FLAGS} ${_alp_sanitizer_flags}"
"-DCMAKE_MODULE_LINKER_FLAGS=${CMAKE_MODULE_LINKER_FLAGS} ${_alp_sanitizer_flags}"
"-DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS} ${_alp_sanitizer_flags}"
-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
Expand Down Expand Up @@ -64,27 +73,47 @@ function(alp_setup_cmake_project arg_NAME)

set(version_var "ALP_INSTALLED_${arg_NAME}_VERSION")
set(path_var "ALP_INSTALLED_${arg_NAME}_PATH")

if(DEFINED ${version_var} AND "${${version_var}}" STREQUAL "${arg_COMMITISH}${arg_CMAKE_ARGUMENTS}" AND DEFINED ${path_var} AND EXISTS "${${path_var}}")
set(build_dir "${CMAKE_BINARY_DIR}/alp_external/${arg_NAME}_build")
set(install_dir "${CMAKE_BINARY_DIR}/alp_external/${arg_NAME}")
set(stamp_file "${install_dir}/.alp_install_signature")
set(version_signature "${arg_COMMITISH}${arg_CMAKE_ARGUMENTS}${ALP_SANITIZER_FLAGS}")
set(cache_signature "URL=${arg_URL}
COMMITISH=${arg_COMMITISH}
BUILD_TYPE=${CMAKE_BUILD_TYPE}
SYSTEM=${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}
CXX=${CMAKE_CXX_COMPILER_ID}-${CMAKE_CXX_COMPILER_VERSION}
SANITIZER_FLAGS=${ALP_SANITIZER_FLAGS}
ARGS=${arg_CMAKE_ARGUMENTS}")

if(DEFINED ${version_var} AND "${${version_var}}" STREQUAL "${version_signature}" AND DEFINED ${path_var} AND EXISTS "${${path_var}}")
list(PREPEND CMAKE_PREFIX_PATH "${${path_var}}")
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
return()
endif()

if(EXISTS "${install_dir}" AND EXISTS "${stamp_file}")
file(READ "${stamp_file}" installed_signature)
if(installed_signature STREQUAL cache_signature)
message(STATUS "[alp] Using cached install for ${arg_NAME}: ${install_dir}")
list(PREPEND CMAKE_PREFIX_PATH "${install_dir}")
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}" PARENT_SCOPE)
set(${path_var} "${install_dir}" CACHE PATH "Install path for ${arg_NAME}" FORCE)
set(${version_var} "${version_signature}" CACHE STRING "Installed commit/tag for $ + build flags" FORCE)
return()
endif()
endif()

alp_add_git_repository(${arg_NAME} URL ${arg_URL} COMMITISH ${arg_COMMITISH} DO_NOT_ADD_SUBPROJECT)
set(src_dir "${${arg_NAME}_SOURCE_DIR}")
set(build_dir "${CMAKE_BINARY_DIR}/alp_external/${arg_NAME}_build")
set(install_dir "${CMAKE_BINARY_DIR}/alp_external/${arg_NAME}")

file(REMOVE_RECURSE "${install_dir}")
_alp_build_and_install(${arg_NAME} ${src_dir} ${build_dir} ${install_dir} ${arg_CMAKE_ARGUMENTS})
file(WRITE "${stamp_file}" "${cache_signature}")

list(PREPEND CMAKE_PREFIX_PATH "${install_dir}")
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}" PARENT_SCOPE)


set(${path_var} "${install_dir}" CACHE PATH "Install path for ${arg_NAME}" FORCE)
set(${version_var} "${arg_COMMITISH}${arg_CMAKE_ARGUMENTS}" CACHE STRING "Installed commit/tag for $ + build flags" FORCE)
set(${version_var} "${version_signature}" CACHE STRING "Installed commit/tag for $ + build flags" FORCE)
endfunction()


2 changes: 1 addition & 1 deletion cmake/SetupGDAL.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ function(alp_setup_gdal)
-DBUILD_CSHARP_BINDINGS=OFF
-DGDAL_USE_ICONV=OFF
-DGDAL_USE_EXTERNAL_LIBS=OFF
"-DCMAKE_INSTALL_RPATH=\$ORIGIN/../../proj/lib"
)

find_package(GDAL CONFIG REQUIRED)
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}" PARENT_SCOPE)
endfunction()

7 changes: 6 additions & 1 deletion cmake/SetupOpenCV.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,15 @@ if(NOT COMMAND alp_setup_cmake_project)
endif()

function(alp_setup_opencv version)
set(_alp_opencv_sanitizer_arguments)
if(ALP_ENABLE_ADDRESS_SANITIZER OR ALP_ENABLE_THREAD_SANITIZER)
list(APPEND _alp_opencv_sanitizer_arguments -DOPENCV_SKIP_LINK_NO_UNDEFINED=ON)
endif()

alp_setup_cmake_project(opencv
URL https://github.com/opencv/opencv.git COMMITISH ${version}
CMAKE_ARGUMENTS
${_alp_opencv_sanitizer_arguments}
-DBUILD_TESTS=OFF
-DBUILD_PERF_TESTS=OFF
-DBUILD_EXAMPLES=OFF
Expand All @@ -41,4 +47,3 @@ function(alp_setup_opencv version)
)
find_package(OpenCV REQUIRED)
endfunction()

Loading
Loading