diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 94e0714..d409480 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1,13 +1,31 @@ cmake_minimum_required(VERSION 3.20) -# Automatisch Projektname aus Parent-Ordner set(PROJECT_NAME "conformallab_core") - project(${PROJECT_NAME} LANGUAGES C CXX) message(STATUS "Configuring ${PROJECT_NAME}...") -# Build-Setup +# ── Build modes ──────────────────────────────────────────────────────────────── +# +# Default (CI / tests-only): only Eigen + GTest are required. +# +# -DWITH_CGAL=ON builds the conformallab_core CLI app (needs CGAL). +# Automatically enables WITH_VIEWER because the app uses +# the viewer library for mesh visualisation. +# +# -DWITH_VIEWER=ON builds the viewer library standalone (libigl/GLFW/GLAD). +# +# ────────────────────────────────────────────────────────────────────────────── +option(WITH_CGAL "Build conformallab_core app (requires CGAL + Viewer)" OFF) +option(WITH_VIEWER "Build viewer library (libigl / GLFW / GLAD)" OFF) + +# The CLI app always needs the viewer; enable it implicitly. +if(WITH_CGAL AND NOT WITH_VIEWER) + message(STATUS "WITH_CGAL implies WITH_VIEWER – enabling automatically.") + set(WITH_VIEWER ON CACHE BOOL "" FORCE) +endif() + +# ── Standard settings ────────────────────────────────────────────────────────── set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) @@ -18,20 +36,18 @@ if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE) endif() -# Compiler-Warnings & Optimierungen if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") add_compile_options(-Wall -Wextra -Wpedantic) - - # AddressSanitizer nur im Debug (nicht für Tests, da gtest_discover_tests - # die Binary zur Buildzeit ausführt und ASan dabei hängt) + + # AddressSanitizer only in Debug (gtest_discover_tests runs the binary at + # configure time and hangs with ASan enabled). if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT BUILD_TESTING) add_compile_options(-fsanitize=address -fno-omit-frame-pointer) add_link_options(-fsanitize=address) endif() endif() - -# ----- Testing (Google Test via FetchContent) ----- +# ── GTest (always – tests are always built) ──────────────────────────────────── include(FetchContent) include(CTest) enable_testing() @@ -45,38 +61,44 @@ set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) set(INSTALL_GTEST OFF CACHE BOOL "" FORCE) set(BUILD_GMOCK OFF CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) -# -------------------------------------------------- +# ── External deps (lazy tarball extraction) ──────────────────────────────────── add_subdirectory(deps) -add_subdirectory(deps/glfw-3.4) -# --------- GLAD (global) --------- -add_library(glad STATIC ${CMAKE_CURRENT_SOURCE_DIR}/deps/libigl-glad/src/glad.c) -target_include_directories(glad PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/deps/libigl-glad/include) -# --------- VIEWER Lib (separat → nur bei src/viewer/* Änderung gebaut!) --------- -add_library(viewer STATIC src/viewer/simple_viewer.cpp) -target_include_directories(viewer PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/deps/libigl-2.6.0/include - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${CMAKE_CURRENT_SOURCE_DIR}/deps/libigl-glad/include - ${CMAKE_CURRENT_SOURCE_DIR}/deps/eigen-3.4.0/ -) -target_link_libraries(viewer PUBLIC glad glfw) -# --------- Executable --------- -add_executable(${PROJECT_NAME} src/apps/v0/conformallab_cli.cpp) -target_include_directories(${PROJECT_NAME} SYSTEM PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/deps/single_includes - ${CMAKE_CURRENT_SOURCE_DIR}/deps/eigen-3.4.0/ - ${CMAKE_CURRENT_SOURCE_DIR}/deps/CGAL-6.1.1/include - ${CMAKE_CURRENT_SOURCE_DIR}/deps/boost_1_90_0/ - ${CMAKE_CURRENT_SOURCE_DIR}/deps/libigl-2.6.0/include -) -target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) -#-------- Compiler-Definitionen --------- -target_compile_definitions(${PROJECT_NAME} PRIVATE CGAL_DISABLE_GMP CGAL_DISABLE_MPFR) -target_link_libraries(${PROJECT_NAME} PRIVATE viewer) -#--------- Output-Ordner --------- -set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) +# ── Viewer library (optional) ────────────────────────────────────────────────── +if(WITH_VIEWER) + add_subdirectory(deps/glfw-3.4) + add_library(glad STATIC + ${CMAKE_CURRENT_SOURCE_DIR}/deps/libigl-glad/src/glad.c) + target_include_directories(glad PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/deps/libigl-glad/include) + + add_library(viewer STATIC src/viewer/simple_viewer.cpp) + target_include_directories(viewer PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/deps/libigl-2.6.0/include + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/deps/libigl-glad/include + ${CMAKE_CURRENT_SOURCE_DIR}/deps/eigen-3.4.0/) + target_link_libraries(viewer PUBLIC glad glfw) +endif() + +# ── Core CLI app (optional, requires CGAL + Viewer) ─────────────────────────── +if(WITH_CGAL) + add_executable(${PROJECT_NAME} src/apps/v0/conformallab_cli.cpp) + target_include_directories(${PROJECT_NAME} SYSTEM PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/deps/single_includes + ${CMAKE_CURRENT_SOURCE_DIR}/deps/eigen-3.4.0/ + ${CMAKE_CURRENT_SOURCE_DIR}/deps/CGAL-6.1.1/include + ${CMAKE_CURRENT_SOURCE_DIR}/deps/libigl-2.6.0/include) + target_include_directories(${PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/include) + target_compile_definitions(${PROJECT_NAME} PRIVATE + CGAL_DISABLE_GMP CGAL_DISABLE_MPFR) + target_link_libraries(${PROJECT_NAME} PRIVATE viewer) + set_target_properties(${PROJECT_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) +endif() + +# ── Tests (always) ──────────────────────────────────────────────────────────── add_subdirectory(tests) - diff --git a/code/deps/Cmakelists.txt b/code/deps/Cmakelists.txt index d6a0910..025c852 100644 --- a/code/deps/Cmakelists.txt +++ b/code/deps/Cmakelists.txt @@ -1,5 +1,16 @@ # deps/CMakeLists.txt -function(setup_dependency NAME SUBDIR) +# +# Lazy tarball extraction – a dependency is only extracted when its directory +# does not yet exist. Extraction happens at cmake configure time. +# +# Which deps are extracted depends on the active build mode: +# +# (default) Eigen only → tests-only build +# WITH_VIEWER=ON + Eigen, libigl, libigl-glad, glfw +# WITH_CGAL=ON + Eigen, CGAL (WITH_VIEWER is implied by WITH_CGAL) +# + +function(setup_dependency NAME SUBDIR) if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${NAME}") file(MAKE_DIRECTORY "${NAME}") file(GLOB TARBALL "${CMAKE_CURRENT_SOURCE_DIR}/tarballs/${NAME}.tar.*") @@ -7,20 +18,21 @@ function(setup_dependency NAME SUBDIR) if(NOT TARBALL) message(FATAL_ERROR "❌ No '${NAME}*.tar.*' in deps/tarballs/") else() - message(STATUS "${CMAKE_COMMAND} ${TARBALL}" ) - + message(STATUS "${CMAKE_COMMAND} ${TARBALL}") if(SUBDIR STREQUAL "") - execute_process(COMMAND "${CMAKE_COMMAND}" -E tar xf "${TARBALL}" RESULT_VARIABLE TAR_STATUS WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) - message(STATUS "Extracting ${NAME}... Output: ${TAR_OUTPUT} Status: ${TAR_STATUS}") - if(NOT TAR_STATUS EQUAL 0) - message(FATAL_ERROR "❌ Extract failed: ${NAME}") - endif() + execute_process( + COMMAND "${CMAKE_COMMAND}" -E tar xf "${TARBALL}" + RESULT_VARIABLE TAR_STATUS + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") else() - execute_process(COMMAND "${CMAKE_COMMAND}" -E tar xf "${TARBALL}" "${NAME}/${SUBDIR}" RESULT_VARIABLE TAR_STATUS WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) - message(STATUS "Extracting ${NAME}... Output: ${TAR_OUTPUT} Status: ${TAR_STATUS}") - if(NOT TAR_STATUS EQUAL 0) - message(FATAL_ERROR "❌ Extract failed: ${NAME}") - endif() + execute_process( + COMMAND "${CMAKE_COMMAND}" -E tar xf "${TARBALL}" "${NAME}/${SUBDIR}" + RESULT_VARIABLE TAR_STATUS + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") + endif() + message(STATUS "Extracting ${NAME}... Status: ${TAR_STATUS}") + if(NOT TAR_STATUS EQUAL 0) + message(FATAL_ERROR "❌ Extract failed: ${NAME}") endif() endif() else() @@ -28,10 +40,17 @@ function(setup_dependency NAME SUBDIR) endif() endfunction() -setup_dependency("CGAL-6.1.1" "include" ) -setup_dependency("eigen-3.4.0" "Eigen" ) -setup_dependency("boost_1_90_0" "boost" ) -setup_dependency("libigl-2.6.0" "include" ) -setup_dependency("libigl-glad" "" ) -setup_dependency("glfw-3.4" "" ) +# ── Always required ──────────────────────────────────────────────────────────── +setup_dependency("eigen-3.4.0" "Eigen") +# ── Viewer mode ──────────────────────────────────────────────────────────────── +if(WITH_VIEWER) + setup_dependency("libigl-2.6.0" "include") + setup_dependency("libigl-glad" "") + setup_dependency("glfw-3.4" "") +endif() + +# ── CGAL mode ───────────────────────────────────────────────────────────────── +if(WITH_CGAL) + setup_dependency("CGAL-6.1.1" "include") +endif() diff --git a/code/deps/tarballs/boost_1_90_0.tar.gz b/code/deps/tarballs/boost_1_90_0.tar.gz deleted file mode 100644 index 1e830b4..0000000 Binary files a/code/deps/tarballs/boost_1_90_0.tar.gz and /dev/null differ diff --git a/code/src/main.cpp b/code/src/main.cpp deleted file mode 100644 index 5c14b7a..0000000 --- a/code/src/main.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include - -typedef CGAL::Simple_cartesian Kernel; -typedef Kernel::Point_2 Point_2; -typedef Kernel::Segment_2 Segment_2; - -int main() -{ - Point_2 p(1,1), q(10,10); - - std::cout << "p = " << p << std::endl; - std::cout << "q = " << q.x() << " " << q.y() << std::endl; - - std::cout << "sqdist(p,q) = " - << CGAL::squared_distance(p,q) << std::endl; - - Segment_2 s(p,q); - Point_2 m(5, 9); - - std::cout << "m = " << m << std::endl; - std::cout << "sqdist(Segment_2(p,q), m) = " - << CGAL::squared_distance(s,m) << std::endl; - - std::cout << "p, q, and m "; - switch (CGAL::orientation(p,q,m)){ - case CGAL::COLLINEAR: - std::cout << "are collinear\n"; - break; - case CGAL::LEFT_TURN: - std::cout << "make a left turn\n"; - break; - case CGAL::RIGHT_TURN: - std::cout << "make a right turn\n"; - break; - } - - std::cout << " midpoint(p,q) = " << CGAL::midpoint(p,q) << std::endl; - return 0; -} \ No newline at end of file