-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
184 lines (141 loc) · 6.13 KB
/
CMakeLists.txt
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
set(PROJECT_NAME_STR ShellSolver)
project(${PROJECT_NAME_STR} C CXX)
# location of additional cmake modules
set(CMAKE_MODULE_PATH
${CMAKE_MODULE_PATH}
${CMAKE_CURRENT_SOURCE_DIR}/cmake
)
# create json file with compilation output
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
include(safeguards)
#https://github.com/Crascit/DownloadProject
include(cmake/DownloadProject.cmake)
if (CMAKE_VERSION VERSION_LESS 3.2)
set(UPDATE_DISCONNECTED_IF_AVAILABLE "")
else()
set(UPDATE_DISCONNECTED_IF_AVAILABLE "UPDATE_DISCONNECTED 1")
endif()
# some definitions
set(SRC_DIR ${PROJECT_SOURCE_DIR}/src)
set(TEST_SRC_DIR ${PROJECT_SOURCE_DIR}/test)
set(EXT_PROJECTS_DIR ${PROJECT_SOURCE_DIR}/external)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
# compilation flags
message(STATUS "We are on a ${CMAKE_SYSTEM_NAME} system")
message(STATUS "The host processor is ${CMAKE_HOST_SYSTEM_PROCESSOR}")
if(CMAKE_CXX_COMPILER_ID MATCHES GNU)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp -Wall -Wcast-align -Wextra -Wformat-nonliteral -Wformat=2 -Winvalid-pch -Wmissing-format-attribute -Wmissing-include-dirs -Wswitch-default -Wswitch-enum -Wno-switch-default -Wno-missing-braces -Wno-switch-enum -Wno-suggest-attribute=format")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3")
set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O3 -march=native -mtune=native")
endif()
# c++11
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED on)
set(CMAKE_CXX_EXTENSIONS off)
# find sources
file(GLOB SOURCES_SIM "${SRC_DIR}/simulations/*.cpp")
file(GLOB HEADERS_SIM "${SRC_DIR}/simulations/*.hpp")
file(GLOB SOURCES_LIB "${SRC_DIR}/libshell/*.cpp")
file(GLOB HEADERS_LIB "${SRC_DIR}/libshell/*.hpp")
file(GLOB SOURCES_HLBFGS "${EXT_PROJECTS_DIR}/HLBFGS/*.cpp")
file(GLOB SOURCES_TEST ${TEST_SRC_DIR}/testshell/*.cpp)
# compile main executable
add_executable(shell ${SOURCES_SIM} ${HEADERS_SIM})
# compile main library
add_library(libshell SHARED ${SOURCES_LIB} ${HEADERS_LIB})
target_link_libraries(shell libshell)
include_directories("${SRC_DIR}/libshell/")
# fix in case different compiler is specified (http://stackoverflow.com/questions/29898219/why-does-cmake-ignore-addsystem-header-files-when-cxx-is-defined)
SET(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem ")
# IGL
find_package(LIBIGL)
if(NOT LIBIGL_FOUND)
download_project(PROJ LIBIGL
GIT_REPOSITORY https://github.com/libigl/libigl.git
GIT_TAG main
#GIT_TAG v2.0.0
${UPDATE_DISCONNECTED_IF_AVAILABLE}
)
set(LIBIGL_INCLUDE_DIR "${LIBIGL_SOURCE_DIR}/include")
message("Downloaded libIGL in: ${LIBIGL_SOURCE_DIR}")
else()
message("Found libIGL in: ${LIBIGL_INCLUDE_DIR}")
endif()
include_directories(SYSTEM ${LIBIGL_INCLUDE_DIR}) # set to system to suppress deprecated warnings
# EIGEN
download_project(PROJ EIGEN3
GIT_REPOSITORY https://github.com/eigenteam/eigen-git-mirror.git
GIT_TAG master
#GIT_TAG 3.2.9
${UPDATE_DISCONNECTED_IF_AVAILABLE}
)
set(EIGEN3_INCLUDE_DIR "${EIGEN3_SOURCE_DIR}")
message("Downloaded Eigen3 in: ${EIGEN3_SOURCE_DIR}")
include_directories(SYSTEM "${EIGEN3_INCLUDE_DIR}") # set to system to suppress deprecated warnings
# TBB
# set variable to exclude debug versions
set(TBB_USE_DEBUG_BUILD FALSE)
find_package(TBB REQUIRED)
include_directories(${TBB_INCLUDE_DIRS})
target_link_libraries(libshell ${TBB_LIBRARIES})
# HLBFGS (create library)
include_directories("${EXT_PROJECTS_DIR}/HLBFGS/")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSEHLBFGS -DHLBFGS_EIGEN")
# shared library
add_library(hlbfgs SHARED ${SOURCES_HLBFGS})
target_link_libraries(libshell hlbfgs)
target_link_libraries(shell hlbfgs)
# TRIANGLE (download directly from LIBIGL and create library)
download_project(PROJ TRIANGLE
GIT_REPOSITORY https://github.com/libigl/triangle
GIT_TAG d284c4a843efac043c310f5fa640b17cf7d96170
${UPDATE_DISCONNECTED_IF_AVAILABLE}
)
include_directories(${TRIANGLE_SOURCE_DIR})
message("Included Triangle in: ${TRIANGLE_SOURCE_DIR}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSETRILIBRARY")
add_library(triangle SHARED "${TRIANGLE_SOURCE_DIR}/triangle.c")
target_compile_definitions(triangle PRIVATE -DTRILIBRARY)# -DNO_TIMER)
target_link_libraries(shell triangle)
target_link_libraries(libshell triangle)
# VTK (OPTIONAL BUT STRONGLY RECOMMENDED FOR IO)
set(VTK_DIR "/home/vlado/Desktop/Work/Elasticity_Optimal_Pattern/lib/VTK-8.2.0/VTK-build")
find_package(VTK)
if(VTK_FOUND)
message("Found vtk in: ${VTK_INCLUDE_DIRS}")
include(${VTK_USE_FILE})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSEVTK -DVTK_EXCLUDE_STRSTREAM_HEADERS")
target_link_libraries(shell ${VTK_LIBRARIES})
target_link_libraries(libshell ${VTK_LIBRARIES})
else()
message("Did not find VTK - compiling without")
endif()
### FOR TESTING
download_project(PROJ googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG main
${UPDATE_DISCONNECTED_IF_AVAILABLE}
)
# Prevent GoogleTest from overriding our compiler/linker options
# when building with Visual Studio
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
# When using CMake 2.8.11 or later, header path dependencies
# are automatically added to the gtest and gmock targets.
# For earlier CMake versions, we have to explicitly add the
# required directories to the header search path ourselves.
if (CMAKE_VERSION VERSION_LESS 2.8.11)
include_directories("${gtest_SOURCE_DIR}/include"
"${gmock_SOURCE_DIR}/include")
endif()
enable_testing()
# test example
set(PROJECT_TEST_NAME testshell)
add_executable(${PROJECT_TEST_NAME} ${SOURCES_TEST})
target_link_libraries(${PROJECT_TEST_NAME} gtest gmock_main libshell)
add_test(NAME test1 COMMAND ${PROJECT_TEST_NAME})
# make install
#include(install_target)