Welcome to mirror list, hosted at ThFree Co, Russian Federation.

CMakeLists.txt « libnest2d « src - github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 514498ee8e19a305b1d9707e6047b37b5e4ac444 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
cmake_minimum_required(VERSION 3.0)

project(Libnest2D)

if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
    # Update if necessary
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long ")
endif()

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED)

# Add our own cmake module path.
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules/)

option(LIBNEST2D_UNITTESTS "If enabled, googletest framework will be downloaded
    and the provided unit tests will be included in the build." OFF)

option(LIBNEST2D_BUILD_EXAMPLES "If enabled, examples will be built." OFF)

option(LIBNEST2D_HEADER_ONLY "If enabled static library will not be built." ON)

set(GEOMETRY_BACKENDS clipper boost eigen)
set(LIBNEST2D_GEOMETRIES clipper CACHE STRING "Geometry backend")
set_property(CACHE LIBNEST2D_GEOMETRIES PROPERTY STRINGS ${GEOMETRY_BACKENDS})
list(FIND GEOMETRY_BACKENDS ${LIBNEST2D_GEOMETRIES} GEOMETRY_TYPE)
if(${GEOMETRY_TYPE} EQUAL -1)
    message(FATAL_ERROR "Option ${LIBNEST2D_GEOMETRIES} not supported, valid entries are ${GEOMETRY_BACKENDS}")
endif()

set(OPTIMIZERS nlopt optimlib)
set(LIBNEST2D_OPTIMIZER nlopt CACHE STRING "Optimization backend")
set_property(CACHE LIBNEST2D_OPTIMIZER PROPERTY STRINGS ${OPTIMIZERS})
list(FIND OPTIMIZERS ${LIBNEST2D_OPTIMIZER} OPTIMIZER_TYPE)
if(${OPTIMIZER_TYPE} EQUAL -1)
    message(FATAL_ERROR "Option ${LIBNEST2D_OPTIMIZER} not supported, valid entries are ${OPTIMIZERS}")
endif()

add_library(libnest2d INTERFACE)

set(SRC_DIR ${PROJECT_SOURCE_DIR}/include)

set(LIBNEST2D_SRCFILES
    ${SRC_DIR}/libnest2d/libnest2d.hpp         # Templates only
    ${SRC_DIR}/libnest2d/geometry_traits.hpp
    ${SRC_DIR}/libnest2d/geometry_traits_nfp.hpp
    ${SRC_DIR}/libnest2d/common.hpp
    ${SRC_DIR}/libnest2d/optimizer.hpp
    ${SRC_DIR}/libnest2d/utils/metaloop.hpp
    ${SRC_DIR}/libnest2d/utils/rotfinder.hpp
    ${SRC_DIR}/libnest2d/placers/placer_boilerplate.hpp
    ${SRC_DIR}/libnest2d/placers/bottomleftplacer.hpp
    ${SRC_DIR}/libnest2d/placers/nfpplacer.hpp
    ${SRC_DIR}/libnest2d/selections/selection_boilerplate.hpp
    ${SRC_DIR}/libnest2d/selections/filler.hpp
    ${SRC_DIR}/libnest2d/selections/firstfit.hpp
    ${SRC_DIR}/libnest2d/selections/djd_heuristic.hpp
    )

set(TBB_STATIC ON)
find_package(TBB QUIET)
if(TBB_FOUND)
    message(STATUS "Parallelization with Intel TBB")
    target_include_directories(libnest2d INTERFACE ${TBB_INCLUDE_DIRS})
    target_compile_definitions(libnest2d INTERFACE ${TBB_DEFINITIONS} -DUSE_TBB)
    if(MSVC)
       # Suppress implicit linking of the TBB libraries by the Visual Studio compiler.
       target_compile_definitions(libnest2d INTERFACE -D__TBB_NO_IMPLICIT_LINKAGE)
    endif()
    # The Intel TBB library will use the std::exception_ptr feature of C++11.
    target_compile_definitions(libnest2d INTERFACE -DTBB_USE_CAPTURED_EXCEPTION=0)

    target_link_libraries(libnest2d INTERFACE tbb)
    # The following breaks compilation on Visual Studio in Debug mode.
    #find_package(Threads REQUIRED)
    #target_link_libraries(libnest2d INTERFACE ${TBB_LIBRARIES} ${CMAKE_DL_LIBS}
    #    Threads::Threads
    #    )
else()
   find_package(OpenMP QUIET)

   if(OpenMP_CXX_FOUND)
       message(STATUS "Parallelization with OpenMP")
       target_include_directories(libnest2d INTERFACE OpenMP::OpenMP_CXX)
       target_link_libraries(libnest2d INTERFACE OpenMP::OpenMP_CXX)
   else()
       message("Parallelization with C++11 threads")
       find_package(Threads REQUIRED)
       target_link_libraries(libnest2d INTERFACE Threads::Threads)
   endif()
endif()

add_subdirectory(${SRC_DIR}/libnest2d/backends/${LIBNEST2D_GEOMETRIES})
add_subdirectory(${SRC_DIR}/libnest2d/optimizers/${LIBNEST2D_OPTIMIZER})

target_sources(libnest2d INTERFACE ${LIBNEST2D_SRCFILES})
target_include_directories(libnest2d INTERFACE ${SRC_DIR})

if(NOT LIBNEST2D_HEADER_ONLY)
    set(LIBNAME libnest2d_${LIBNEST2D_GEOMETRIES}_${LIBNEST2D_OPTIMIZER})
    add_library(${LIBNAME} ${PROJECT_SOURCE_DIR}/src/libnest2d.cpp)
    target_link_libraries(${LIBNAME} PUBLIC libnest2d)
    target_compile_definitions(${LIBNAME} PUBLIC LIBNEST2D_STATIC)
endif()

if(LIBNEST2D_BUILD_EXAMPLES)

    add_executable(example     examples/main.cpp
    #                           tools/libnfpglue.hpp
    #                           tools/libnfpglue.cpp
                               tools/nfp_svgnest.hpp
                               tools/nfp_svgnest_glue.hpp
                               tools/svgtools.hpp
                               tests/printer_parts.cpp
                               tests/printer_parts.h
                               )

    if(NOT LIBNEST2D_HEADER_ONLY)
        target_link_libraries(example ${LIBNAME})
    else()
        target_link_libraries(example libnest2d)
    endif()
endif()

if(LIBNEST2D_UNITTESTS)
    add_subdirectory(${PROJECT_SOURCE_DIR}/tests)
endif()