11cmake_minimum_required (VERSION 3.15...3.26)
22
3- project (nanobind_example LANGUAGES CXX)
3+ project (coompas_libigl LANGUAGES CXX)
44
5+ set (CMAKE_CXX_STANDARD 20)
6+ set (CMAKE_CXX_STANDARD_REQUIRED ON )
7+ set (CMAKE_CXX_EXTENSIONS OFF )
8+ set (CMAKE_BUILD_TYPE Release)
9+
10+ # =====================================================================
11+ # Set this flag to ON for developing to reduce build time.
12+ # Set this flag to OFF for publishing for file size reduction.
13+ # =====================================================================
14+ option (ENABLE_PRECOMPILED_HEADERS "Enable precompiled headers for the build" ON )
15+
16+ # =====================================================================
17+ # Set maximum heap size for MSVC
18+ # =====================================================================
19+
20+ if (MSVC )
21+ set (CMAKE_GENERATOR_PLATFORM x64)
22+ add_compile_options (/Zm1200)
23+ endif ()
24+
25+ # =====================================================================
26+ # Build size reduction.
27+ # =====================================================================
28+
29+ if (NOT ENABLE_PRECOMPILED_HEADERS)
30+ set (CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE )
31+ if (MSVC )
32+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /O1" ) # Optimize for size on MSVC
33+ else ()
34+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Os" ) # Optimize for size on GCC/Clang
35+ endif ()
36+ endif ()
37+
38+ # =====================================================================
39+ # Dependencies
40+ # =====================================================================
541include (ExternalProject)
642
743# Define source directories for external dependencies
844set (EXTERNAL_DIR "${CMAKE_CURRENT_SOURCE_DIR} /external" )
945set (EIGEN_SOURCE_DIR "${EXTERNAL_DIR} /eigen" )
1046set (LIBIGL_SOURCE_DIR "${EXTERNAL_DIR} /libigl" )
11- set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3" )
12- set (CMAKE_EXPORT_COMPILE_COMMANDS ON )
13- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g" )
1447
15- # Create a custom target for all external dependencies
16- add_custom_target (external_downloads ALL )
48+ # Create directories if they don't exist
49+ file (MAKE_DIRECTORY ${EXTERNAL_DIR} )
50+ file (MAKE_DIRECTORY ${EIGEN_SOURCE_DIR} )
51+ file (MAKE_DIRECTORY ${LIBIGL_SOURCE_DIR} )
1752
18- # Download and configure Eigen
19- if (NOT EXISTS "${EIGEN_SOURCE_DIR} " )
53+ # Download Eigen first
54+ if (NOT EXISTS "${EIGEN_SOURCE_DIR} /Eigen " )
2055 message (STATUS "Downloading Eigen..." )
2156 ExternalProject_Add(
2257 eigen_download
58+ PREFIX ${EXTERNAL_DIR}
2359 URL https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz
2460 SOURCE_DIR "${EIGEN_SOURCE_DIR} "
2561 CONFIGURE_COMMAND ""
@@ -29,14 +65,15 @@ if(NOT EXISTS "${EIGEN_SOURCE_DIR}")
2965 UPDATE_COMMAND ""
3066 PATCH_COMMAND ""
3167 )
32- add_dependencies (external_downloads eigen_download)
3368endif ()
3469
35- # Download and configure libigl
36- if (NOT EXISTS "${LIBIGL_SOURCE_DIR} " )
70+ # Download libigl after Eigen
71+ if (NOT EXISTS "${LIBIGL_SOURCE_DIR} /include/igl " )
3772 message (STATUS "Downloading libigl..." )
3873 ExternalProject_Add(
3974 libigl_download
75+ DEPENDS eigen_download
76+ PREFIX ${EXTERNAL_DIR}
4077 URL https://github.com/libigl/libigl/archive/refs/heads/main.zip
4178 SOURCE_DIR "${LIBIGL_SOURCE_DIR} "
4279 CONFIGURE_COMMAND ""
@@ -47,6 +84,14 @@ if(NOT EXISTS "${LIBIGL_SOURCE_DIR}")
4784 PATCH_COMMAND ""
4885 DOWNLOAD_EXTRACT_TIMESTAMP TRUE
4986 )
87+ endif ()
88+
89+ # Create a custom target for all external dependencies
90+ add_custom_target (external_downloads ALL )
91+ if (TARGET eigen_download)
92+ add_dependencies (external_downloads eigen_download)
93+ endif ()
94+ if (TARGET libigl_download)
5095 add_dependencies (external_downloads libigl_download)
5196endif ()
5297
@@ -77,28 +122,39 @@ if (NOT SKBUILD)
77122 after editing C++ files." )
78123endif ()
79124
125+ # Enhanced PCH configuration
126+ if (ENABLE_PRECOMPILED_HEADERS)
127+ set (CMAKE_PCH_INSTANTIATE_TEMPLATES ON )
128+ set (CMAKE_PCH_WARN_INVALID ON )
129+ endif ()
130+
80131# Find Python and nanobind
81132find_package (Python 3.8
82133 REQUIRED COMPONENTS Interpreter Development.Module
83134 OPTIONAL_COMPONENTS Development.SABIModule)
84135find_package (nanobind CONFIG REQUIRED)
85136find_package (Threads REQUIRED)
86137
87- # Add nanobind module
88- nanobind_add_module(
89- nanobind_example_ext
90- STABLE_ABI
91- NB_STATIC
92- src/nanobind_example_ext.cpp
93- )
94-
95- # Add dependencies and include directories
96- add_dependencies (nanobind_example_ext external_downloads)
97- target_include_directories (nanobind_example_ext PRIVATE
98- ${EIGEN_INCLUDE_DIR}
99- ${LIBIGL_INCLUDE_DIR}
100- )
101- target_link_libraries (nanobind_example_ext PRIVATE Threads::Threads)
102-
103- # Install directive for scikit-build-core
104- install (TARGETS nanobind_example_ext LIBRARY DESTINATION nanobind_example)
138+ # Function to add a nanobind module with include directories
139+ function (add_nanobind_module module_name source_file)
140+ nanobind_add_module(${module_name} STABLE_ABI NB_STATIC ${source_file} )
141+
142+ # Ensure external dependencies are downloaded first
143+ add_dependencies (${module_name} external_downloads)
144+
145+ # Add include directories
146+ target_include_directories (${module_name} SYSTEM PRIVATE
147+ ${EIGEN_INCLUDE_DIR}
148+ ${LIBIGL_INCLUDE_DIR}
149+ )
150+
151+ if (ENABLE_PRECOMPILED_HEADERS)
152+ target_precompile_headers(${module_name} PRIVATE src/compas.h)
153+ endif ()
154+
155+ target_link_libraries (${module_name} PRIVATE Threads::Threads)
156+ install (TARGETS ${module_name} LIBRARY DESTINATION coompas_libigl)
157+ endfunction ()
158+
159+ # Add modules
160+ add_nanobind_module(_libigl src/nanobind.cpp)
0 commit comments