-
Notifications
You must be signed in to change notification settings - Fork 0
/
CMakeLists.txt
120 lines (93 loc) · 3.45 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
cmake_minimum_required(VERSION 3.9)
if(${CMAKE_VERSION} VERSION_LESS 3.12)
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
endif()
cmake_policy(SET CMP0069 NEW)
project(NRGmin VERSION 1.0
DESCRIPTION "Energy minimization utility"
LANGUAGES C)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
option(BUILD_TESTS "Build tests" ON)
option(USE_LTO "Link Time Optimization" ON)
option(USE_SANITIZER "Build with address sanitizer" OFF)
option(OPENMP "Add OPENMP executable" OFF)
option(NOE "Build with NOE feature" ON)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/")
if (UNIX AND CMAKE_BUILD_TYPE STREQUAL "Debug")
add_compile_options(-pg -Wall -Wshadow -Wpointer-arith -Wcast-qual -Winline -Werror -Wextra -Wfatal-errors -Wstrict-prototypes)
endif()
if (USE_SANITIZER)
set(SANITIZER_FLAGS "-fno-omit-frame-pointer -fsanitize=address,undefined")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZER_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${SANITIZER_FLAGS}")
endif()
if (NOE)
add_definitions(-D NOE)
endif()
find_package(Jansson REQUIRED)
find_package(mol2 REQUIRED)
set(LIBRARY_LIST
"${MOL2_LIBRARIES}"
"${JANSSON_LIBRARIES}"
m)
set(INCLUDE_LIST
"${MOL2_INCLUDE_DIRS}"
"${JANSSON_INCLUDE_DIRS}")
# Read help text from the file and plug it in parse_options.c.in
file(STRINGS ${PROJECT_SOURCE_DIR}/src/usage.txt USAGE_LINES)
# Join lines using "\" character. Can't use string(JOIN ..) here,
# because it exists only in the newer versions of cmake
set(USAGE_TEXT "")
list(LENGTH USAGE_LINES USAGE_N_LINES)
math(EXPR USAGE_LAST_LINE "${USAGE_N_LINES} - 1")
foreach(LINE_ID RANGE ${USAGE_LAST_LINE})
list(GET USAGE_LINES ${LINE_ID} LINE)
set(USAGE_TEXT "${USAGE_TEXT}\\n${LINE}")
endforeach()
configure_file (
"${PROJECT_SOURCE_DIR}/src/parse_options.c.in"
"${PROJECT_BINARY_DIR}/parse_options.c"
)
if (USE_LTO)
include(CheckIPOSupported)
check_ipo_supported(RESULT result)
if(NOT result)
set(USE_LTO OFF)
endif()
endif()
set(SRC_LIST
${PROJECT_SOURCE_DIR}/src/setup.c
${PROJECT_SOURCE_DIR}/src/utils.c
${PROJECT_SOURCE_DIR}/src/energy.c
${PROJECT_BINARY_DIR}/parse_options.c)
add_executable(nrgmin ${PROJECT_SOURCE_DIR}/src/minimize.c ${SRC_LIST})
if (USE_LTO)
set_target_properties(nrgmin PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE)
endif()
target_include_directories(nrgmin
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
"$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>"
PRIVATE ${INCLUDE_LIST})
target_link_libraries(nrgmin ${LIBRARY_LIST})
if (OPENMP)
find_package(OpenMP REQUIRED)
add_executable(nrgmin.omp ${PROJECT_SOURCE_DIR}/src/minimize.c ${SRC_LIST})
if (USE_LTO)
set_target_properties(nrgmin.omp PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE)
endif()
target_include_directories(nrgmin.omp
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
"$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>"
PRIVATE ${INCLUDE_LIST})
target_link_libraries(nrgmin.omp ${LIBRARY_LIST} OpenMP::OpenMP_C)
target_compile_definitions(nrgmin.omp PUBLIC OPENMP)
endif()
if (BUILD_TESTS)
find_package(Check REQUIRED)
enable_testing()
add_subdirectory("test")
endif()