cmake_minimum_required(VERSION 3.20) set(PROJECT_NAME "conformallab_core") project(${PROJECT_NAME} LANGUAGES C CXX) message(STATUS "Configuring ${PROJECT_NAME}...") # ── 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) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE) endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") add_compile_options(-Wall -Wextra -Wpedantic) # 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() # ── GTest (always – tests are always built) ──────────────────────────────────── include(FetchContent) include(CTest) enable_testing() FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG v1.14.0 ) 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) # ── 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) # CGAL 6.x still needs Boost.Config headers unconditionally. # Install via: brew install boost (macOS) # apt install libboost-dev (Debian/Ubuntu) find_package(Boost REQUIRED) 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 ${Boost_INCLUDE_DIRS}) 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() # ── Example programs (require WITH_CGAL; viewer example also needs WITH_VIEWER) ─ if(WITH_CGAL) add_subdirectory(examples) endif() # ── Tests (always) ──────────────────────────────────────────────────────────── add_subdirectory(tests)