format cmake files (#975)

* format cmake files

* update format.sh

* fix linker flags for emscripten

* update readme

* use gersemi

* actual format

* should be public instead of interface

* make test work without download

* simplification

* format
This commit is contained in:
pca006132
2024-10-05 00:36:24 +08:00
committed by GitHub
parent cc1e97442a
commit 658d3e037a
15 changed files with 451 additions and 308 deletions
+2
View File
@@ -0,0 +1,2 @@
line_length: 80
indent: 2
+9
View File
@@ -22,3 +22,12 @@ jobs:
with:
options: "--check --verbose"
src: "./bindings/python/examples"
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
- name: "gersemi cmake check"
run: |
pip3 install gersemi
./scripts/gersemi-check.sh
+156 -89
View File
@@ -26,32 +26,54 @@ set(CMAKE_VERBOSE_MAKEFILE ON)
set(MANIFOLD_VERSION_MAJOR 2)
set(MANIFOLD_VERSION_MINOR 5)
set(MANIFOLD_VERSION_PATCH 1)
set(MANIFOLD_VERSION "${MANIFOLD_VERSION_MAJOR}.${MANIFOLD_VERSION_MINOR}.${MANIFOLD_VERSION_PATCH}")
set(
MANIFOLD_VERSION
"${MANIFOLD_VERSION_MAJOR}.${MANIFOLD_VERSION_MINOR}.${MANIFOLD_VERSION_PATCH}"
)
# Correct MANIFOLD_PAR values to on/off (previous NONE/TBB values should still
# work this way)
if (DEFINED MANIFOLD_PAR)
if ("${MANIFOLD_PAR}" STREQUAL "" OR "${MANIFOLD_PAR}" STREQUAL "NONE" OR "${MANIFOLD_PAR}" STREQUAL "OFF")
if(DEFINED MANIFOLD_PAR)
if(
"${MANIFOLD_PAR}" STREQUAL ""
OR "${MANIFOLD_PAR}" STREQUAL "NONE"
OR "${MANIFOLD_PAR}" STREQUAL "OFF"
)
set(MANIFOLD_PAR OFF)
else()
set(MANIFOLD_PAR ON)
endif ()
endif ()
endif()
endif()
# Primary user facing options
option(MANIFOLD_CROSS_SECTION "Build CrossSection for 2D support" ON)
option(MANIFOLD_DEBUG "Enable debug tracing/timing" OFF)
option(MANIFOLD_DOWNLOADS "Allow Manifold build to download missing dependencies" ON)
option(
MANIFOLD_DOWNLOADS
"Allow Manifold build to download missing dependencies"
ON
)
option(MANIFOLD_EXCEPTIONS "Build manifold with exception enabled" ON)
option(MANIFOLD_EXPORT "Build mesh export (via assimp) utility library" OFF)
option(MANIFOLD_FUZZ "Enable fuzzing tests" OFF) # fuzztest is a rather large dependency
option(MANIFOLD_PAR "Enable Parallel backend" OFF)
option(MANIFOLD_TEST "Enable testing suite" ON)
option(BUILD_SHARED_LIBS "Build shared library" ON)
include(CMakeDependentOption)
cmake_dependent_option(MANIFOLD_CBIND "Build C (FFI) bindings" ON "MANIFOLD_CROSS_SECTION" OFF)
cmake_dependent_option(
MANIFOLD_CBIND
"Build C (FFI) bindings"
ON
"MANIFOLD_CROSS_SECTION"
OFF
)
option(MANIFOLD_PYBIND "Build python bindings" OFF)
cmake_dependent_option(MANIFOLD_JSBIND "Build js binding" ON "EMSCRIPTEN" OFF)
cmake_dependent_option(
MANIFOLD_JSBIND
"Build js binding"
ON
"EMSCRIPTEN"
OFF
)
# Set some option values in the CMake cache
if(NOT MANIFOLD_FLAGS)
@@ -59,7 +81,6 @@ if(NOT MANIFOLD_FLAGS)
endif()
set(MANIFOLD_FLAGS "" CACHE STRING "Manifold compiler flags")
# Development options
option(TRACY_ENABLE "Use tracy profiling" OFF)
option(TRACY_MEMORY_USAGE "Track memory allocation with tracy (expensive)" OFF)
@@ -68,6 +89,10 @@ mark_as_advanced(TRACY_ENABLE)
mark_as_advanced(TRACY_MEMORY_USAGE)
mark_as_advanced(BUILD_TEST_CGAL)
# fuzztest is a rather large dependency
option(MANIFOLD_FUZZ "Enable fuzzing tests" OFF)
mark_as_advanced(MANIFOLD_FUZZ)
# Define some paths for CMake
include(GNUInstallDirs)
@@ -77,23 +102,23 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Various Compiler Flags
if(MANIFOLD_FUZZ)
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
message(FATAL_ERROR "fuzztest only supports clang" )
message(FATAL_ERROR "fuzztest only supports clang")
endif()
# we should enable debug checks
set(MANIFOLD_DEBUG ON)
# enable fuzztest fuzzing mode
set(FUZZTEST_FUZZING_MODE ON)
# address sanitizer required
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -fsanitize=address")
list(APPEND CMAKE_CXX_FLAGS -fsanitize=address)
endif()
if(TRACY_ENABLE)
option(CMAKE_BUILD_TYPE "Build type" RelWithDebInfo)
if(TRACY_MEMORY_USAGE)
set(MANIFOLD_FLAGS ${MANIFOLD_FLAGS} -DTRACY_MEMORY_USAGE)
list(APPEND MANIFOLD_FLAGS -DTRACY_MEMORY_USAGE)
endif()
if(NOT MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
list(APPEND CMAKE_CXX_FLAGS -fno-omit-frame-pointer)
endif()
else()
option(CMAKE_BUILD_TYPE "Build type" Release)
@@ -102,11 +127,14 @@ endif()
if(EMSCRIPTEN)
message("Building for Emscripten")
if(MANIFOLD_EXCEPTIONS)
set(MANIFOLD_FLAGS -fexceptions -D_LIBCUDACXX_HAS_THREAD_API_EXTERNAL -D_LIBCUDACXX_HAS_THREAD_API_CUDA)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -sALLOW_MEMORY_GROWTH=1 -fexceptions -sDISABLE_EXCEPTION_CATCHING=0")
list(APPEND MANIFOLD_FLAGS -fexceptions)
string(
APPEND
CMAKE_EXE_LINKER_FLAGS
"-sALLOW_MEMORY_GROWTH=1 -fexceptions -sDISABLE_EXCEPTION_CATCHING=0 "
)
else()
set(MANIFOLD_FLAGS -D_LIBCUDACXX_HAS_THREAD_API_EXTERNAL -D_LIBCUDACXX_HAS_THREAD_API_CUDA)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -sALLOW_MEMORY_GROWTH=1")
string(APPEND CMAKE_EXE_LINKER_FLAGS "-sALLOW_MEMORY_GROWTH=1 ")
endif()
set(MANIFOLD_PYBIND OFF)
set(BUILD_SHARED_LIBS OFF)
@@ -114,32 +142,48 @@ endif()
if(CMAKE_EXPORT_COMPILE_COMMANDS AND NOT EMSCRIPTEN)
# for nixos
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES
${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES})
set(
CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES
${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}
)
endif()
if (MSVC)
set(MANIFOLD_FLAGS ${MANIFOLD_FLAGS} /DNOMINMAX /bigobj)
if(MSVC)
list(APPEND MANIFOLD_FLAGS /DNOMINMAX /bigobj)
else()
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(WARNING_FLAGS -Wall -Wno-unused -Wno-array-bounds
-Wno-stringop-overflow -Wno-alloc-size-larger-than)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
list(
APPEND
WARNING_FLAGS
-Wall
-Wno-unused
-Wno-array-bounds
-Wno-stringop-overflow
-Wno-alloc-size-larger-than
)
else()
set(WARNING_FLAGS -Wall -Wno-unused -Wno-shorten-64-to-32)
list(APPEND WARNING_FLAGS -Wall -Wno-unused -Wno-shorten-64-to-32)
endif()
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(WARNING_FLAGS ${WARNING_FLAGS} -Wno-format)
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
list(APPEND WARNING_FLAGS -Wno-format)
endif()
else()
set(WARNING_FLAGS ${WARNING_FLAGS} -Werror)
list(APPEND WARNING_FLAGS -Werror)
endif()
set(MANIFOLD_FLAGS ${MANIFOLD_FLAGS} ${WARNING_FLAGS})
list(APPEND MANIFOLD_FLAGS ${WARNING_FLAGS})
endif()
if(CODE_COVERAGE AND NOT MSVC)
set(COVERAGE_FLAGS -coverage -fno-inline-small-functions -fkeep-inline-functions -fkeep-static-functions)
set(MANIFOLD_FLAGS ${MANIFOLD_FLAGS} ${COVERAGE_FLAGS})
list(
APPEND
COVERAGE_FLAGS
-coverage
-fno-inline-small-functions
-fkeep-inline-functions
-fkeep-static-functions
)
list(APPEND MANIFOLD_FLAGS ${COVERAGE_FLAGS})
add_link_options("-coverage")
endif()
@@ -148,28 +192,44 @@ set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} isSystemDir)
list(
FIND
CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES
${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}
isSystemDir
)
if("${isSystemDir}" STREQUAL "-1")
set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
endif("${isSystemDir}" STREQUAL "-1")
# Dependencies
include(FetchContent)
function(logmissingdep PKG)
if(NOT MANIFOLD_DOWNLOADS)
if(ARGC EQUAL 3)
set(MSG "${ARGV2} enabled, but ${PKG} was not found ")
string(APPEND MSG "and dependency downloading is disabled. ")
else()
set(MSG "${PKG} not found, and dependency downloading disabled. ")
endif()
string(APPEND MSG "Please install ${PKG} and reconfigure.\n")
message(FATAL_ERROR ${MSG})
endif()
endfunction()
# GLM is required in all configurations.
find_package(glm QUIET)
if(NOT glm_FOUND)
if (NOT MANIFOLD_DOWNLOADS)
message(FATAL_ERROR "glm not found, and dependency downloading disabled. Please install glm and reconfigure.\n")
endif()
logmissingdep("glm")
message(STATUS "glm not found, downloading from source")
set(GLM_BUILD_INSTALL "ON" CACHE STRING "")
FetchContent_Declare(glm
FetchContent_Declare(
glm
GIT_REPOSITORY https://github.com/g-truc/glm.git
GIT_TAG 1.0.1
GIT_PROGRESS TRUE
)
)
FetchContent_MakeAvailable(glm)
if(NOT EMSCRIPTEN)
install(TARGETS glm)
@@ -185,20 +245,18 @@ if(MANIFOLD_PAR)
pkg_check_modules(TBB tbb)
endif()
if(NOT TBB_FOUND)
if (NOT MANIFOLD_DOWNLOADS)
message(FATAL_ERROR "Parallel mode enabled, but TBB was not found and dependency downloading is disabled. Please install TBB and reconfigure.\n")
endif()
logmissingdep("TBB" , "Parallel mode")
# TODO - this isn't recommended by the TBB upstream - should we be
# doing it?
message(STATUS "TBB not found, downloading from source")
set(TBB_TEST OFF CACHE INTERNAL "" FORCE)
set(TBB_STRICT OFF CACHE INTERNAL "" FORCE)
FetchContent_Declare(TBB
FetchContent_Declare(
TBB
GIT_REPOSITORY https://github.com/oneapi-src/oneTBB.git
GIT_TAG v2021.11.0
GIT_PROGRESS TRUE
)
GIT_TAG v2021.11.0
GIT_PROGRESS TRUE
)
FetchContent_MakeAvailable(TBB)
set_property(DIRECTORY ${tbb_SOURCE_DIR} PROPERTY EXCLUDE_FROM_ALL YES)
# note: we do want to install tbb to the user machine when built from
@@ -217,28 +275,36 @@ if(MANIFOLD_CROSS_SECTION)
endif()
if(Clipper2_FOUND)
add_library(Clipper2 SHARED IMPORTED)
set_property(TARGET Clipper2 PROPERTY
IMPORTED_LOCATION ${Clipper2_LINK_LIBRARIES})
set_property(
TARGET Clipper2
PROPERTY IMPORTED_LOCATION ${Clipper2_LINK_LIBRARIES}
)
if(WIN32)
set_property(TARGET Clipper2 PROPERTY
IMPORTED_IMPLIB ${Clipper2_LINK_LIBRARIES})
set_property(
TARGET Clipper2
PROPERTY IMPORTED_IMPLIB ${Clipper2_LINK_LIBRARIES}
)
endif()
target_include_directories(Clipper2 INTERFACE ${Clipper2_INCLUDE_DIRS})
else()
if (NOT MANIFOLD_DOWNLOADS)
message(FATAL_ERROR "cross_section enabled, but Clipper2 was not found and dependency downloading is disabled. Please install Clipper2 and reconfigure.\n")
endif()
logmissingdep("Clipper2" , "cross_section")
message(STATUS "clipper2 not found, downloading from source")
set(CLIPPER2_UTILS OFF)
set(CLIPPER2_EXAMPLES OFF)
set(CLIPPER2_TESTS OFF)
set(CLIPPER2_USINGZ "OFF" CACHE STRING "Preempt cache default of USINGZ (we only use 2d)")
FetchContent_Declare(Clipper2
set(
CLIPPER2_USINGZ
"OFF"
CACHE STRING
"Preempt cache default of USINGZ (we only use 2d)"
)
FetchContent_Declare(
Clipper2
GIT_REPOSITORY https://github.com/AngusJohnson/Clipper2.git
GIT_TAG ff378668baae3570e9d8070aa9eb339bdd5a6aba
GIT_PROGRESS TRUE
SOURCE_SUBDIR CPP
)
)
FetchContent_MakeAvailable(Clipper2)
if(NOT EMSCRIPTEN)
install(TARGETS Clipper2)
@@ -263,17 +329,17 @@ message(STATUS "====================================")
message(STATUS "Manifold Build Configuration Summary")
message(STATUS "====================================")
message(STATUS " ")
if (MXECROSS)
if(MXECROSS)
message(STATUS "Environment: MXE")
elseif (APPLE)
elseif(APPLE)
message(STATUS "Environment: macOS")
elseif (WIN32)
if (MINGW)
elseif(WIN32)
if(MINGW)
message(STATUS "Environment: msys2")
else()
message(STATUS "Environment: Windows")
endif()
elseif (LINUX)
elseif(LINUX)
message(STATUS "Environment: Linux")
elseif(UNIX)
message(STATUS "Environment: Unknown Unix")
@@ -289,7 +355,7 @@ message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
message(STATUS "CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")
message(STATUS "CMAKE_CXX_COMPILER_VERSION: ${CMAKE_CXX_COMPILER_VERSION}")
if (APPLE)
if(APPLE)
message(STATUS "CMAKE_OSX_DEPLOYMENT_TARGET: ${CMAKE_OSX_DEPLOYMENT_TARGET}")
message(STATUS "CMAKE_OSX_ARCHITECTURES: ${CMAKE_OSX_ARCHITECTURES}")
endif()
@@ -312,32 +378,38 @@ if(EMSCRIPTEN)
return()
endif()
# CMake exports
configure_file(manifoldConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/manifoldConfig.cmake @ONLY)
configure_file(
manifoldConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/manifoldConfig.cmake
@ONLY
)
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
${CMAKE_BINARY_DIR}/cmake/manifoldConfigVersion.cmake
VERSION ${MANIFOLD_VERSION}
COMPATIBILITY SameMajorVersion
)
)
# Location of inputs for CMake find_package - see:
# https://cmake.org/cmake/help/latest/command/find_package.html
set(EXPORT_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake)
install(EXPORT manifoldTargets
install(
EXPORT manifoldTargets
NAMESPACE manifold::
DESTINATION ${EXPORT_INSTALL_DIR}/manifold
)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/cmake/manifoldConfigVersion.cmake
${CMAKE_CURRENT_BINARY_DIR}/manifoldConfig.cmake
)
install(
FILES
${CMAKE_CURRENT_BINARY_DIR}/cmake/manifoldConfigVersion.cmake
${CMAKE_CURRENT_BINARY_DIR}/manifoldConfig.cmake
DESTINATION ${EXPORT_INSTALL_DIR}/manifold
)
)
# install public headers
set(MANIFOLD_PUBLIC_HDRS
set(
MANIFOLD_PUBLIC_HDRS
include/manifold/common.h
include/manifold/iters.h
include/manifold/manifold.h
@@ -345,32 +417,27 @@ set(MANIFOLD_PUBLIC_HDRS
include/manifold/parallel.h
include/manifold/polygon.h
include/manifold/vec_view.h
)
)
if (MANIFOLD_CROSS_SECTION)
if(MANIFOLD_CROSS_SECTION)
list(APPEND MANIFOLD_PUBLIC_HDRS include/manifold/cross_section.h)
endif()
if (MANIFOLD_EXPORT)
if(MANIFOLD_EXPORT)
list(APPEND MANIFOLD_PUBLIC_HDRS include/manifold/meshIO.h)
endif()
install(FILES ${MANIFOLD_PUBLIC_HDRS}
install(
FILES ${MANIFOLD_PUBLIC_HDRS}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/manifold
)
)
# PkgConfig file
if(MANIFOLD_CROSS_SECTION)
set(TEMPLATE_OPTIONAL_CLIPPER "Clipper2")
endif()
configure_file(manifold.pc.in ${CMAKE_CURRENT_BINARY_DIR}/manifold.pc @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/manifold.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
# Local Variables:
# tab-width: 8
# mode: cmake
# indent-tabs-mode: t
# End:
# ex: shiftwidth=2 tabstop=8
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/manifold.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)
+5 -3
View File
@@ -161,10 +161,12 @@ Contributions are welcome! A lower barrier contribution is to simply make a PR t
### Formatting
There is a formatting script `format.sh` that automatically formats everything.
It requires clang-format 11 and black formatter for python.
It requires clang-format, black formatter for python and [gersemi](https://github.com/BlankSpruce/gersemi) for formatting cmake files.
If you have clang-format installed but without clang-11, you can specify the
clang-format executable by setting the `CLANG_FORMAT` environment variable.
Note that our script can run with clang-format older than 18, but the GitHub
action check may fail due to slight differences between different versions of
clang-format. In that case, either update your clang-format version or apply the
patch from the GitHub action log.
### Profiling
+1 -8
View File
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
if (NOT MANIFOLD_CROSS_SECTION)
if(NOT MANIFOLD_CROSS_SECTION)
return()
endif()
@@ -27,10 +27,3 @@ endif()
if(EMSCRIPTEN AND MANIFOLD_JSBIND)
add_subdirectory(wasm)
endif()
# Local Variables:
# tab-width: 8
# mode: cmake
# indent-tabs-mode: t
# End:
# ex: shiftwidth=2 tabstop=8
+23 -22
View File
@@ -3,22 +3,28 @@ include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/../../include
)
)
add_library(manifoldc SHARED
add_library(
manifoldc
SHARED
manifoldc.cpp
conv.cpp
box.cpp
cross.cpp
rect.cpp
)
)
if(MSVC)
set_target_properties(manifoldc PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
set_target_properties(manifoldc PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/bin )
set_target_properties(manifoldc PROPERTIES LIBRARY_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/bin )
set_target_properties(
manifoldc
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
set_target_properties(
manifoldc
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
endif()
if(MANIFOLD_EXPORT)
@@ -28,22 +34,17 @@ endif()
target_link_libraries(manifoldc PRIVATE manifold)
target_include_directories(manifoldc PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/bindings/c/include>
)
target_include_directories(
manifoldc
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/bindings/c/include>
)
target_compile_options(manifoldc PRIVATE ${MANIFOLD_FLAGS})
target_compile_features(manifoldc PRIVATE cxx_std_17)
install(TARGETS manifoldc EXPORT manifoldTargets)
install(FILES
include/manifold/manifoldc.h
include/manifold/types.h DESTINATION
${CMAKE_INSTALL_INCLUDEDIR}/manifold)
# Local Variables:
# tab-width: 8
# mode: cmake
# indent-tabs-mode: t
# End:
# ex: shiftwidth=2 tabstop=8
install(
FILES include/manifold/manifoldc.h include/manifold/types.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/manifold
)
+28 -27
View File
@@ -33,22 +33,28 @@ endif()
execute_process(
COMMAND "${Python_EXECUTABLE}" -m nanobind --version
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE NB_VERSION)
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE NB_VERSION
)
# we are fine with 2.0.0
if(NB_VERSION VERSION_GREATER_EQUAL 2.0.0)
message("Found nanobind, version ${NB_VERSION}")
execute_process(
COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE nanobind_ROOT)
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE nanobind_ROOT
)
find_package(nanobind CONFIG REQUIRED)
else()
message(STATUS "nanobind not found, downloading from source")
include(FetchContent)
FetchContent_Declare(nanobind
FetchContent_Declare(
nanobind
GIT_REPOSITORY https://github.com/wjakob/nanobind.git
GIT_TAG 9641bb7151f04120013b812789b3ebdfa7e7324f # v2.1.0
GIT_TAG
9641bb7151f04120013b812789b3ebdfa7e7324f # v2.1.0
GIT_PROGRESS TRUE
)
)
FetchContent_MakeAvailable(nanobind)
endif()
@@ -57,11 +63,9 @@ if(NB_VERSION VERSION_LESS 2.1.0)
set(MANIFOLD_PYBIND_STUBGEN OFF)
endif()
nanobind_add_module(
manifold3d
NB_STATIC STABLE_ABI LTO
autogen_docstrings.inl
manifold3d.cpp)
nanobind_add_module(manifold3d NB_STATIC STABLE_ABI LTO autogen_docstrings.inl
manifold3d.cpp
)
if(MANIFOLD_PYBIND_STUBGEN)
nanobind_add_stub(
@@ -71,30 +75,35 @@ if(MANIFOLD_PYBIND_STUBGEN)
PYTHON_PATH $<TARGET_FILE_DIR:manifold3d>
DEPENDS manifold3d
PATTERN_FILE ${CMAKE_CURRENT_SOURCE_DIR}/stub_pattern.txt
)
)
endif()
target_link_libraries(manifold3d PRIVATE manifold)
target_compile_options(manifold3d PRIVATE ${MANIFOLD_FLAGS} -DMODULE_NAME=manifold3d)
target_compile_options(
manifold3d
PRIVATE ${MANIFOLD_FLAGS} -DMODULE_NAME=manifold3d
)
target_compile_features(manifold3d PUBLIC cxx_std_17)
set_target_properties(manifold3d PROPERTIES OUTPUT_NAME "manifold3d")
message(Python_EXECUTABLE = ${Python_EXECUTABLE})
# ideally we should generate a dependency file from python...
set(DOCSTRING_DEPS
set(
DOCSTRING_DEPS
${CMAKE_SOURCE_DIR}/src/manifold.cpp
${CMAKE_SOURCE_DIR}/src/constructors.cpp
${CMAKE_SOURCE_DIR}/src/sort.cpp
${CMAKE_SOURCE_DIR}/src/cross_section/cross_section.cpp
${CMAKE_SOURCE_DIR}/src/polygon.cpp
${CMAKE_SOURCE_DIR}/include/manifold/common.h
)
)
add_custom_command(
OUTPUT autogen_docstrings.inl
DEPENDS ${DOCSTRING_DEPS}
COMMAND ${Python_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/gen_docs.py
COMMAND ${Python_EXECUTABLE}
ARGS ${CMAKE_CURRENT_SOURCE_DIR}/gen_docs.py
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
)
target_include_directories(manifold3d PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
if(SKBUILD)
@@ -105,20 +114,12 @@ endif()
install(
TARGETS manifold3d
LIBRARY DESTINATION ${MANIFOLD_PYBIND_LIBDIR}
COMPONENT bindings
)
LIBRARY DESTINATION ${MANIFOLD_PYBIND_LIBDIR} COMPONENT bindings
)
if(MANIFOLD_PYBIND_STUBGEN)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/manifold3d.pyi
DESTINATION ${MANIFOLD_PYBIND_LIBDIR}
COMPONENT bindings
)
)
endif()
# Local Variables:
# tab-width: 8
# mode: cmake
# indent-tabs-mode: t
# End:
# ex: shiftwidth=2 tabstop=8
+38 -25
View File
@@ -16,11 +16,23 @@ project(wasm)
add_executable(manifoldjs bindings.cpp)
set_source_files_properties(bindings.cpp PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bindings.js)
set_source_files_properties(
bindings.cpp
PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bindings.js
)
target_link_libraries(manifoldjs manifold)
target_compile_options(manifoldjs PRIVATE ${MANIFOLD_FLAGS})
target_link_options(manifoldjs PUBLIC --pre-js ${CMAKE_CURRENT_SOURCE_DIR}/bindings.js --bind -sALLOW_TABLE_GROWTH=1
-sEXPORTED_RUNTIME_METHODS=addFunction,removeFunction -sMODULARIZE=1 -sEXPORT_ES6=1)
target_link_options(
manifoldjs
PUBLIC
--pre-js
${CMAKE_CURRENT_SOURCE_DIR}/bindings.js
--bind
-sALLOW_TABLE_GROWTH=1
-sEXPORTED_RUNTIME_METHODS=addFunction,removeFunction
-sMODULARIZE=1
-sEXPORT_ES6=1
)
target_compile_features(manifoldjs PUBLIC cxx_std_17)
set_target_properties(manifoldjs PROPERTIES OUTPUT_NAME "manifold")
@@ -28,34 +40,35 @@ set_target_properties(manifoldjs PROPERTIES OUTPUT_NAME "manifold")
file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/examples/built)
# ensure that interface files are copied over when modified
add_custom_target(js_deps ALL
DEPENDS manifoldjs
${CMAKE_CURRENT_SOURCE_DIR}/manifold*.d.ts)
add_custom_target(
js_deps
ALL
DEPENDS manifoldjs ${CMAKE_CURRENT_SOURCE_DIR}/manifold*.d.ts
)
# copy WASM build back here for publishing to npm
add_custom_command(
TARGET js_deps POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_BINARY_DIR}/manifold.*
${CMAKE_CURRENT_SOURCE_DIR})
TARGET js_deps
POST_BUILD
COMMAND
${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/manifold.*
${CMAKE_CURRENT_SOURCE_DIR}
)
# copy WASM build and TS declarations for Vite to package into ManifoldCAD.org
add_custom_command(
TARGET js_deps POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/manifold*
${CMAKE_CURRENT_SOURCE_DIR}/examples/built/)
TARGET js_deps
POST_BUILD
COMMAND
${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/manifold*
${CMAKE_CURRENT_SOURCE_DIR}/examples/built/
)
# copy TS declarations to public so they can be accessed by our editor
add_custom_command(
TARGET js_deps POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/manifold*.d.ts
${CMAKE_CURRENT_SOURCE_DIR}/examples/public/)
# Local Variables:
# tab-width: 8
# mode: cmake
# indent-tabs-mode: t
# End:
# ex: shiftwidth=2 tabstop=8
TARGET js_deps
POST_BUILD
COMMAND
${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/manifold*.d.ts
${CMAKE_CURRENT_SOURCE_DIR}/examples/public/
)
+15 -10
View File
@@ -52,21 +52,26 @@ if(BUILD_TEST_CGAL)
find_package(CGAL REQUIRED COMPONENTS Core)
find_package(Boost REQUIRED COMPONENTS thread)
target_compile_definitions(perfTestCGAL PRIVATE CGAL_USE_GMPXX)
target_link_libraries(perfTestCGAL manifold CGAL::CGAL CGAL::CGAL_Core Boost::thread)
target_link_libraries(
perfTestCGAL
manifold
CGAL::CGAL
CGAL::CGAL_Core
Boost::thread
)
target_compile_options(perfTestCGAL PRIVATE ${MANIFOLD_FLAGS})
target_compile_features(perfTestCGAL PUBLIC cxx_std_17)
add_executable(testHullPerformance test_hull_performance.cpp)
target_compile_definitions(testHullPerformance PRIVATE CGAL_USE_GMPXX)
target_link_libraries(testHullPerformance manifold samples CGAL::CGAL CGAL::CGAL_Core Boost::thread)
target_link_libraries(
testHullPerformance
manifold
samples
CGAL::CGAL
CGAL::CGAL_Core
Boost::thread
)
target_compile_options(testHullPerformance PRIVATE ${MANIFOLD_FLAGS})
target_compile_features(testHullPerformance PUBLIC cxx_std_17)
endif()
# Local Variables:
# tab-width: 8
# mode: cmake
# indent-tabs-mode: t
# End:
# ex: shiftwidth=2 tabstop=8
+7 -7
View File
@@ -15,18 +15,18 @@ set(glm_ROOT "${_FIND_ROOT}")
find_package(glm REQUIRED)
set(MANIFOLD_CROSS_SECTION "@MANIFOLD_CROSS_SECTION@")
if(MANIFOLD_CROSS_SECTION)
set(Clipper2_ROOT "${_FIND_ROOT}")
find_package(Clipper2 REQUIRED)
set(Clipper2_ROOT "${_FIND_ROOT}")
find_package(Clipper2 REQUIRED)
endif()
set(MANIFOLD_PAR "@MANIFOLD_PAR@")
if(MANIFOLD_PAR STREQUAL "ON")
find_package(TBB REQUIRED)
if(APPLE)
find_package(oneDPL REQUIRED)
endif()
find_package(TBB REQUIRED)
if(APPLE)
find_package(oneDPL REQUIRED)
endif()
endif()
set(MANIFOLD_EXPORT "@MANIFOLD_EXPORT@")
if(MANIFOLD_EXPORT)
find_package(assimp REQUIRED)
find_package(assimp REQUIRED)
endif(MANIFOLD_EXPORT)
include("${CMAKE_CURRENT_LIST_DIR}/manifoldTargets.cmake")
+11 -14
View File
@@ -12,29 +12,26 @@
# See the License for the specific language governing permissions and
# limitations under the License.
if (NOT MANIFOLD_TEST)
if(NOT MANIFOLD_TEST)
return()
endif()
add_library(samples src/menger_sponge.cpp
src/rounded_frame.cpp src/scallop.cpp src/tet_puzzle.cpp
src/gyroid_module.cpp src/condensed_matter.cpp)
add_library(
samples
src/menger_sponge.cpp
src/rounded_frame.cpp
src/scallop.cpp
src/tet_puzzle.cpp
src/gyroid_module.cpp
src/condensed_matter.cpp
)
if(MANIFOLD_CROSS_SECTION)
target_sources(samples PUBLIC src/bracelet.cpp src/knot.cpp)
endif()
target_include_directories(samples
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_include_directories(samples PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(samples PUBLIC manifold)
target_compile_options(samples PRIVATE ${MANIFOLD_FLAGS})
target_compile_features(samples PUBLIC cxx_std_17)
# Local Variables:
# tab-width: 8
# mode: cmake
# indent-tabs-mode: t
# End:
# ex: shiftwidth=2 tabstop=8
+19 -4
View File
@@ -6,14 +6,29 @@ CLANG_FORMAT=clang-format
fi
$CLANG_FORMAT -i extras/*.cpp
$CLANG_FORMAT -i meshIO/**/*.{h,cpp}
$CLANG_FORMAT -i samples/**/*.{h,cpp}
$CLANG_FORMAT -i samples/*/*.{h,cpp}
$CLANG_FORMAT -i test/*.{h,cpp}
$CLANG_FORMAT -i bindings/*/*.cpp
$CLANG_FORMAT -i bindings/c/include/manifold/*.h
$CLANG_FORMAT -i bindings/wasm/*.{js,ts}
$CLANG_FORMAT -i bindings/wasm/examples/*.{js,ts,html}
$CLANG_FORMAT -i bindings/wasm/examples/public/*.{js,ts}
$CLANG_FORMAT -i src/*/src/*.{h,cpp}
$CLANG_FORMAT -i src/*/include/manifold/*.h
$CLANG_FORMAT -i src/*.{h,cpp}
$CLANG_FORMAT -i src/*/*.cpp
$CLANG_FORMAT -i include/manifold/*.h
black bindings/python/examples/*.py
for f in $(find -name CMakeLists.txt); do
# skip build directories
if [[ $f != *build* ]]; then
gersemi -i $f
fi
done
for f in $(find -name '*.cmake.in'); do
# skip build directories
if [[ $f != *build* ]]; then
gersemi -i $f
fi
done
+25
View File
@@ -0,0 +1,25 @@
#!/usr/bin/env bash
FAILED=0
function check() {
if [[ $1 != *build* ]]; then
gersemi -c $1 2> /dev/null
if [ $? -ne 0 ]; then
gersemi --diff $1 2> /dev/null
FAILED=1
fi
fi
}
for f in $(find -name CMakeLists.txt); do
check $f
done
for f in $(find -name '*.cmake.in'); do
check $f
done
if [[ $FAILED -ne 0 ]]; then
exit 1
fi
+54 -52
View File
@@ -15,7 +15,8 @@
# For private headers
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
set(MANIFOLD_SRCS
set(
MANIFOLD_SRCS
boolean3.cpp
boolean_result.cpp
constructors.cpp
@@ -31,9 +32,10 @@ set(MANIFOLD_SRCS
smoothing.cpp
sort.cpp
subdivision.cpp
)
)
set(MANIFOLD_PRIVATE_HDRS
set(
MANIFOLD_PRIVATE_HDRS
boolean3.h
collider.h
csg_tree.h
@@ -47,18 +49,14 @@ set(MANIFOLD_PRIVATE_HDRS
tri_dist.h
utils.h
vec.h
)
)
if(MANIFOLD_CROSS_SECTION)
list(APPEND MANIFOLD_SRCS
cross_section/cross_section.cpp
)
list(APPEND MANIFOLD_SRCS cross_section/cross_section.cpp)
endif()
if(MANIFOLD_EXPORT)
list(APPEND MANIFOLD_SRCS
meshIO/meshIO.cpp
)
list(APPEND MANIFOLD_SRCS meshIO/meshIO.cpp)
endif()
# Dependency libraries
@@ -77,11 +75,12 @@ if(MANIFOLD_PAR)
list(APPEND MANIFOLD_LIBS ${TBB_LINK_LIBRARIES})
endif()
endif()
if(MANIFOLD_EXPORT)
list(APPEND MANIFOLD_LIBS assimp::assimp)
endif()
#Include directories
set(MANIFOLD_INCLUDE_DIRS
${CMAKE_SOURCE_DIR}/include
)
# Include directories
set(MANIFOLD_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include)
if(TBB_INCLUDE_DIRS)
list(APPEND MANIFOLD_INCLUDE_DIRS ${TBB_INCLUDE_DIRS})
endif()
@@ -90,54 +89,57 @@ add_library(manifold ${MANIFOLD_SRCS} ${MANIFOLD_PRIVATE_HDRS})
set_property(TARGET manifold PROPERTY VERSION "${MANIFOLD_VERSION}")
set_property(TARGET manifold PROPERTY SOVERSION ${MANIFOLD_VERSION_MAJOR})
if(MSVC)
set_target_properties(${PROJECT_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
set_target_properties(
${PROJECT_NAME}
PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON
)
endif()
target_link_libraries(manifold PUBLIC ${MANIFOLD_LIBS})
if(MANIFOLD_FLAGS)
target_compile_options(manifold PRIVATE ${MANIFOLD_FLAGS})
endif()
target_include_directories(manifold PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
target_include_directories(
manifold
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
PRIVATE ${MANIFOLD_INCLUDE_DIRS}
)
if(MANIFOLD_EXCEPTIONS)
target_compile_options(manifold PRIVATE -DMANIFOLD_EXCEPTIONS=1)
endif()
if(MANIFOLD_DEBUG)
target_compile_options(manifold PRIVATE -DMANIFOLD_DEBUG)
endif()
if(MANIFOLD_EXPORT)
target_link_libraries(manifold PRIVATE assimp::assimp)
target_compile_options(manifold PUBLIC -DMANIFOLD_EXPORT)
endif()
)
set(
OPTIONS
MANIFOLD_EXCEPTIONS
MANIFOLD_DEBUG
MANIFOLD_CROSS_SECTION
MANIFOLD_EXPORT
MANIFOLD_PAR
)
foreach(OPT IN LISTS OPTIONS)
if(${${OPT}})
target_compile_options(manifold PUBLIC -D${OPT})
endif()
endforeach()
target_compile_features(manifold PUBLIC cxx_std_17)
if(MANIFOLD_PAR)
target_compile_options(manifold INTERFACE -DMANIFOLD_PAR)
endif()
install(TARGETS manifold EXPORT manifoldTargets)
# Tracy Support
if (MANIFOLD_DOWNLOADS)
include(FetchContent)
if (TRACY_ENABLE)
include(FetchContent)
FetchContent_Declare(tracy
GIT_REPOSITORY https://github.com/wolfpld/tracy.git
GIT_TAG v0.10
GIT_SHALLOW TRUE
GIT_PROGRESS TRUE
)
FetchContent_MakeAvailable(tracy)
target_link_libraries(manifold INTERFACE TracyClient)
if(TRACY_ENABLE)
if(NOT MANIFOLD_DOWNLOADS)
message(
WARNING
"Downloading is disabled, but tracy requires download - skipping.\n"
)
return()
endif()
include(FetchContent)
FetchContent_Declare(
tracy
GIT_REPOSITORY https://github.com/wolfpld/tracy.git
GIT_TAG v0.10
GIT_SHALLOW TRUE
GIT_PROGRESS TRUE
)
FetchContent_MakeAvailable(tracy)
target_link_libraries(manifold INTERFACE TracyClient)
endif()
# Local Variables:
# tab-width: 8
# mode: cmake
# indent-tabs-mode: t
# End:
# ex: shiftwidth=2 tabstop=8
+58 -47
View File
@@ -12,16 +12,41 @@
# See the License for the specific language governing permissions and
# limitations under the License.
if (NOT MANIFOLD_TEST)
if(NOT MANIFOLD_TEST)
return()
endif()
if (NOT MANIFOLD_DOWNLOADS)
message("Downloading is disabled, but testing requires googletest - skipping.\n")
endif()
enable_testing()
set(SOURCE_FILES
find_package(gtest QUIET)
if(NOT gtest_FOUND)
if(NOT MANIFOLD_DOWNLOADS)
message(
WARNING
"Downloading is disabled, but testing requires googletest - skipping.\n"
)
return()
endif()
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
# Prevent installation of GTest with your project
set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
set(INSTALL_GMOCK OFF CACHE BOOL "" FORCE)
include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.14.0
GIT_SHALLOW TRUE
GIT_PROGRESS TRUE
FIND_PACKAGE_ARGS NAMES GTest gtest
)
FetchContent_MakeAvailable(googletest)
endif()
set(
SOURCE_FILES
boolean_complex_test.cpp
boolean_test.cpp
hull_test.cpp
@@ -32,7 +57,7 @@ set(SOURCE_FILES
sdf_test.cpp
smooth_test.cpp
test_main.cpp
)
)
if(MANIFOLD_CROSS_SECTION)
list(APPEND SOURCE_FILES cross_section_test.cpp)
@@ -42,21 +67,6 @@ if(MANIFOLD_CBIND AND NOT EMSCRIPTEN)
list(APPEND SOURCE_FILES manifoldc_test.cpp)
endif()
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
# Prevent installation of GTest with your project
set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
set(INSTALL_GMOCK OFF CACHE BOOL "" FORCE)
include(FetchContent)
FetchContent_Declare(googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.14.0
GIT_SHALLOW TRUE
GIT_PROGRESS TRUE
FIND_PACKAGE_ARGS NAMES GTest gtest
)
FetchContent_MakeAvailable(googletest)
if(NOT TARGET GTest::gtest_main)
add_library(GTest::gtest_main ALIAS gtest_main)
endif()
@@ -65,12 +75,13 @@ add_executable(manifold_test ${SOURCE_FILES})
target_link_libraries(manifold_test GTest::gtest_main manifold samples)
if(MANIFOLD_FUZZ)
FetchContent_Declare(fuzztest
FetchContent_Declare(
fuzztest
GIT_REPOSITORY https://github.com/google/fuzztest.git
# note that if commit hash is used, it cannot be a shallow clone
GIT_TAG 2606e04a43e5a7730e437a849604a61f1cb0ff28
GIT_PROGRESS TRUE
)
GIT_TAG 2606e04a43e5a7730e437a849604a61f1cb0ff28
GIT_PROGRESS TRUE
)
FetchContent_MakeAvailable(fuzztest)
fuzztest_setup_fuzzing_flags()
add_executable(polygon_fuzz polygon_fuzz.cpp)
@@ -83,14 +94,6 @@ if(MANIFOLD_CBIND AND NOT EMSCRIPTEN)
target_link_libraries(manifold_test manifoldc)
endif()
if(MANIFOLD_CROSS_SECTION)
target_compile_options(manifold_test PUBLIC -DMANIFOLD_CROSS_SECTION)
endif()
if(MANIFOLD_EXPORT)
target_compile_options(manifold_test PUBLIC -DMANIFOLD_EXPORT)
endif()
target_compile_options(manifold_test PRIVATE ${MANIFOLD_FLAGS})
target_compile_features(manifold_test PUBLIC cxx_std_17)
@@ -98,21 +101,29 @@ add_test(test_all manifold_test)
target_precompile_headers(manifold_test INTERFACE test.h)
if(EMSCRIPTEN)
set_target_properties(manifold_test PROPERTIES LINK_FLAGS
"-s ASSERTIONS=1 -s DEMANGLE_SUPPORT=1 --bind --preload-file ${CMAKE_CURRENT_SOURCE_DIR}/polygons@/polygons")
list(
APPEND
EMSCRIPTEN_LINK_FLAGS
-sASSERTIONS=1
-sDEMANGLE_SUPPORT=1
--bind
--preload-file
${CMAKE_CURRENT_SOURCE_DIR}/polygons@/polygons
)
list(JOIN EMSCRIPTEN_LINK_FLAGS " " EMSCRIPTEN_LINK_FLAGS)
set_target_properties(
manifold_test
PROPERTIES LINK_FLAGS ${EMSCRIPTEN_LINK_FLAGS}
)
endif()
if(MSVC)
set_target_properties(manifold_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/bin )
set_target_properties(manifold_test PROPERTIES LIBRARY_OUTPUT_DIRECTORY
${CMAKE_BINARY_DIR}/bin )
set_target_properties(
manifold_test
PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
set_target_properties(
manifold_test
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
endif()
# Local Variables:
# tab-width: 8
# mode: cmake
# indent-tabs-mode: t
# End:
# ex: shiftwidth=2 tabstop=8