forked from Tudat/cspice
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCMakeLists.txt
209 lines (178 loc) · 9.03 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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# Copyright (c) 2010-2019, Delft University of Technology
# All rigths reserved
#
# This file is part of the Tudat. Redistribution and use in source and
# binary forms, with or without modification, are permitted exclusively
# under the terms of the Modified BSD license. You should have received
# a copy of the license with this file. If not, please or visit:
# http://tudat.tudelft.nl/LICENSE.
#
# Note that this license only applies to this CMakeLists.txt file, not the
# cspice library itself
#
# Specify minimum CMake version required to compile CSpice.
cmake_minimum_required(VERSION 3.3)
# Trick for recompiling changes for BUILD-TREE.
if (EXISTS "${CMAKE_BINARY_DIR}/CMakeCache.txt")
file(REMOVE "${CMAKE_BINARY_DIR}/CMakeCache.txt")
endif ()
# Set cmake policy.
cmake_policy(SET CMP0069 NEW)
# Specific project name.
project(CSpice VERSION 1.0.0 LANGUAGES C)
# Get lower string name of PROJECT_NAME for directory configuration.
string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER)
string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPER)
set(POSITION_INDEPENDENT_CODE True)
# +============================================================================
# BUILD OPTIONS
# Offer the user the choice of defining the build variation.
# +============================================================================
# Build static library instead of dynamic.
option(CSPICE_BUILD_STATIC_LIBRARY "Build sofa as a static library, instead of dynamic." ON)
# +============================================================================
# INSTALL TREE CONFIGURATION (Project name independent)
# Offer the user the choice of overriding the installation directories.
# +============================================================================
set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib/" CACHE PATH "Installation directory for libraries")
set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin/" CACHE PATH "Installation directory for executables")
set(INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include/" CACHE PATH "Installation directory for header files")
set(INSTALL_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data/" CACHE PATH "Installation directory for data files")
set(INSTALL_MAN_DIR "${CMAKE_INSTALL_PREFIX}/" CACHE PATH "Installation directory for man documentation")
set(INSTALL_TESTS_DIR "${CMAKE_BINARY_DIR}/tests/" CACHE PATH "Installation directory for tests (default=OFF)")
set(INSTALL_CMAKE_DIR "${INSTALL_LIB_DIR}/cmake/${PROJECT_NAME_LOWER}" CACHE PATH "Installation directory for cmake config files")
# Make relative paths absolute (needed later on)
foreach (p LIB BIN INCLUDE DATA CMAKE)
set(var INSTALL_${p}_DIR)
set(RELATIVE_INSTALL_${p}_DIR ${INSTALL_${p}_DIR})
if (NOT IS_ABSOLUTE "${${var}}")
set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
endif ()
endforeach ()
# Find relative paths for cmake-config file. (for find_package)
file(RELATIVE_PATH rel_include_dir "${INSTALL_CMAKE_DIR}" "${INSTALL_INCLUDE_DIR}")
file(RELATIVE_PATH rel_lib_dir "${INSTALL_CMAKE_DIR}" "${INSTALL_LIB_DIR}")
file(RELATIVE_PATH rel_data_dir "${INSTALL_CMAKE_DIR}" "${INSTALL_DATA_DIR}")
file(RELATIVE_PATH rel_bin_dir "${INSTALL_CMAKE_DIR}" "${INSTALL_BIN_DIR}")
file(RELATIVE_PATH rel_man_dir "${INSTALL_CMAKE_DIR}" "${INSTALL_MAN_DIR}")
# Set relative paths for config.cmake.
foreach (p include lib data bin man)
string(TOUPPER ${p} P)
set(RELATIVE_INSTALL_${P}_DIR ${rel_${p}_dir})
endforeach ()
## +============================================================================
## CMAKE BUILD TREE CONFIGURATION
## +============================================================================
#set(${PROJECT_NAME_UPPER}_BINARY_LIB_DIR "${CMAKE_BINARY_DIR}/lib/" CACHE PATH "Build directory for libraries")
#set(${PROJECT_NAME_UPPER}_BINARY_BIN_DIR "${CMAKE_BINARY_DIR}/bin/" CACHE PATH "Build directory for executables")
#set(${PROJECT_NAME_UPPER}_BINARY_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/" CACHE PATH "Build directory for header files")
#set(${PROJECT_NAME_UPPER}_BINARY_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data/${PROJECT_NAME_LOWER}/" CACHE PATH "Build directory for data files (default=OFF)")
#set(${PROJECT_NAME_UPPER}_BINARY_MAN_DIR "${CMAKE_BINARY_DIR}/" CACHE PATH "Build directory for man documentation")
#set(${PROJECT_NAME_UPPER}_BINARY_TESTS_DIR "${CMAKE_BINARY_DIR}/tests/" CACHE PATH "Build directory for tests")
#set(${PROJECT_NAME_UPPER}_BINARY_CMAKE_DIR "${BINARY_LIB_DIR}/cmake/${PROJECT_NAME_LOWER}" CACHE PATH "Build directory for cmake config files")
# Set the source and header files.
file(GLOB_RECURSE CSPICE_HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/cspice
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h)
file(GLOB_RECURSE CSPICE_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/cspice
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.c)
# Setup of library.
if (CSPICE_BUILD_STATIC_LIBRARY)
add_library(cspice STATIC "${CSPICE_SOURCE_FILES}")
else ()
add_library(cspice SHARED "${CSPICE_SOURCE_FILES}")
endif ()
# Add headers to library target.
target_include_directories(cspice PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/cspice>
$<INSTALL_INTERFACE:include/cspice>
)
# Setup of namespaced library.
add_library(CSpice::cspice ALIAS cspice)
# Silence warnings.'
if(NOT MSVC)
set_property(TARGET cspice APPEND PROPERTY COMPILE_OPTIONS
"-Wno-implicit-int"
"-Wunused-result"
"-Wno-incompatible-pointer-types"
"-Wno-pointer-to-int-cast"
"-Wno-shift-op-parentheses"
"-Wno-logical-op-parentheses"
"-Wno-parentheses"
"-Wno-tautological-compare"
"-Wno-format"
"-Wno-unsequenced")
endif(NOT MSVC)
set_target_properties(cspice
PROPERTIES
LINKER_LANGUAGE C
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
)
# Installation of the library.
install(TARGETS cspice
EXPORT cspice_export
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
)
# Set <project>_LIBRARIES for <project>-config.cmake.
set(CSpice_LIBRARIES CSpice::cspice)
# Add to parent scope if project is added via add_subdirectory().
if (NOT ${CMAKE_PROJECT_NAME} STREQUAL ${PROJECT_NAME})
set(CSpice_LIBRARIES CSpice::cspice PARENT_SCOPE)
endif ()
# Installation of the header files.
install(DIRECTORY include/ DESTINATION "${INSTALL_INCLUDE_DIR}")
# Installation of the data files.
install(DIRECTORY data/ DESTINATION "${INSTALL_DATA_DIR}/${PROJECT_NAME_LOWER}")
# Add all targets to the build-tree export set
export(TARGETS cspice NAMESPACE ${PROJECT_NAME}:: FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME_LOWER}_export.cmake")
# Installation of the export modules.
install(EXPORT ${PROJECT_NAME_LOWER}_export NAMESPACE ${PROJECT_NAME}:: DESTINATION "${RELATIVE_INSTALL_CMAKE_DIR}")
# Export the package for use from the build-tree
# (this registers the build-tree with a global CMake-registry)
set(CMAKE_EXPORT_PACKAGE_REGISTRY ON)
export(PACKAGE ${PROJECT_NAME})
# +============================================================================
# PROJECT CONFIG
# Add the targets, libraries and tests.
# +============================================================================
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME_LOWER}-config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config.cmake" @ONLY
)
install(
FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config.cmake"
DESTINATION "${INSTALL_CMAKE_DIR}"
)
# Take care of versioning.
include(CMakePackageConfigHelpers)
# NOTE: SameMinorVersion available only
# since CMake 3.11.
if (${CMAKE_VERSION} VERSION_LESS "3.11.0")
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config-version.cmake" VERSION ${${PROJECT_NAME}_VERSION}
COMPATIBILITY SameMajorVersion)
else ()
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config-version.cmake" VERSION ${${PROJECT_NAME}_VERSION}
COMPATIBILITY SameMinorVersion)
endif ()
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config-version.cmake" DESTINATION "${INSTALL_CMAKE_DIR}")
# +============================================================================
# CLEAN UP (Project name independent)
# Cleanup in case project is not top level.
# +============================================================================
unset(INSTALL_LIB_DIR)
unset(INSTALL_BIN_DIR)
unset(INSTALL_INCLUDE_DIR)
unset(INSTALL_DATA_DIR)
unset(INSTALL_MAN_DIR)
unset(INSTALL_TESTS_DIR)
unset(INSTALL_CMAKE_DIR)
unset(RELATIVE_INSTALL_LIB_DIR)
unset(RELATIVE_INSTALL_BIN_DIR)
unset(RELATIVE_INSTALL_INCLUDE_DIR)
unset(RELATIVE_INSTALL_DATA_DIR)
unset(RELATIVE_INSTALL_MAN_DIR)
unset(RELATIVE_INSTALL_TESTS_DIR)
unset(RELATIVE_INSTALL_CMAKE_DIR)