-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
142 lines (117 loc) · 4.25 KB
/
CMakeLists.txt
File metadata and controls
142 lines (117 loc) · 4.25 KB
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
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
project(libxs
VERSION 0.0.0
LANGUAGES C)
option(LIBXS_HEADER_ONLY "Header-only usage (no library target)" OFF)
option(LIBXS_SHARED "Build shared library instead of static" OFF)
option(LIBXS_FORTRAN "Build Fortran module interface" OFF)
if(LIBXS_FORTRAN)
set(LIBXS_HEADER_ONLY OFF CACHE BOOL "" FORCE)
enable_language(Fortran)
endif()
message(STATUS "******** Build Summary ********")
message(STATUS " CMake version : ${CMAKE_VERSION}")
message(STATUS " System : ${CMAKE_SYSTEM_NAME}")
message(STATUS " LIBXS_HEADER_ONLY : ${LIBXS_HEADER_ONLY}")
message(STATUS " LIBXS_SHARED : ${LIBXS_SHARED}")
message(STATUS " LIBXS_FORTRAN : ${LIBXS_FORTRAN}")
set(LIBXS_ROOT_DIR ${PROJECT_SOURCE_DIR})
set(LIBXS_INCLUDE_DIR ${LIBXS_ROOT_DIR}/include)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Generate include/libxs_version.h
set(LIBXS_VERSION_HEADER "${LIBXS_INCLUDE_DIR}/libxs_version.h")
set(LIBXS_VERSION_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/scripts/tool_version.sh")
if(NOT EXISTS "${LIBXS_VERSION_SCRIPT}")
message(FATAL_ERROR "Missing ${LIBXS_VERSION_SCRIPT}")
endif()
find_program(SH_EXECUTABLE NAMES sh bash REQUIRED)
# -1 means "emit full C header" (see tool_version.sh)
execute_process(
COMMAND "${SH_EXECUTABLE}" "${LIBXS_VERSION_SCRIPT}" libxs -1
OUTPUT_FILE "${LIBXS_VERSION_HEADER}"
RESULT_VARIABLE LIBXS_VERSION_RC
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)
if(NOT LIBXS_VERSION_RC EQUAL 0)
message(FATAL_ERROR "tool_version.sh failed with code ${LIBXS_VERSION_RC}")
endif()
# Re-run on reconfigure whenever the script changes
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
"${LIBXS_VERSION_SCRIPT}")
if(LIBXS_HEADER_ONLY)
add_library(libxs INTERFACE)
target_include_directories(libxs INTERFACE
$<BUILD_INTERFACE:${LIBXS_INCLUDE_DIR}>
$<INSTALL_INTERFACE:include>)
add_library(libxs::libxs ALIAS libxs)
else()
file(GLOB LIBXS_SRCS LIST_DIRECTORIES false CONFIGURE_DEPENDS
${LIBXS_ROOT_DIR}/src/*.c)
if(LIBXS_FORTRAN)
list(APPEND LIBXS_SRCS ${LIBXS_INCLUDE_DIR}/libxs.f)
endif()
if(LIBXS_SHARED)
add_library(libxs SHARED ${LIBXS_SRCS})
else()
add_library(libxs STATIC ${LIBXS_SRCS})
endif()
add_library(libxs::libxs ALIAS libxs)
set_target_properties(libxs PROPERTIES OUTPUT_NAME xs)
target_compile_definitions(libxs PRIVATE LIBXS_BUILD=1)
target_include_directories(libxs
PUBLIC
$<BUILD_INTERFACE:${LIBXS_INCLUDE_DIR}>
$<INSTALL_INTERFACE:include>
PRIVATE
${LIBXS_ROOT_DIR}/src)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(libxs PUBLIC Threads::Threads)
target_link_libraries(libxs PUBLIC ${CMAKE_DL_LIBS})
include(CheckLibraryExists)
check_library_exists(m sqrt "" LIBXS_HAS_LIBM)
if(LIBXS_HAS_LIBM)
target_link_libraries(libxs PUBLIC m)
endif()
check_library_exists(rt clock_gettime "" LIBXS_HAS_LIBRT)
if(LIBXS_HAS_LIBRT)
target_link_libraries(libxs PUBLIC rt)
endif()
if(LIBXS_FORTRAN)
set(LIBXS_Fortran_MODULE_DIR ${CMAKE_CURRENT_BINARY_DIR}/mod)
set_target_properties(libxs PROPERTIES Fortran_MODULE_DIRECTORY ${LIBXS_Fortran_MODULE_DIR})
target_include_directories(libxs PUBLIC
$<BUILD_INTERFACE:${LIBXS_Fortran_MODULE_DIR}>
$<INSTALL_INTERFACE:include>)
endif()
endif()
# Installation rules
include(GNUInstallDirs)
if(LIBXS_HEADER_ONLY)
install(TARGETS libxs
EXPORT libxsTargets
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
else()
install(TARGETS libxs
EXPORT libxsTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
endif()
# Install public headers (picks up the freshly generated libxs_version.h)
install(DIRECTORY ${LIBXS_INCLUDE_DIR}/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING
PATTERN "*.h"
PATTERN "*.f"
PATTERN "*.mod")
if(LIBXS_FORTRAN)
install(DIRECTORY ${LIBXS_Fortran_MODULE_DIR}/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.mod")
endif()
# CMake package config export
install(EXPORT libxsTargets
FILE libxsTargets.cmake
NAMESPACE libxs::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/libxs)