]> www.ginac.de Git - cln.git/blob - CMakeLists.txt
CLN can be built with CMake
[cln.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 3.10)
2 set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
3
4 project(CLN)
5 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/include/cln/version.h" _cl_vinfo REGEX "^#define[\t ]+CL_VERSION_.*")
6 string(REGEX REPLACE "^.*CL_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" CL_VERSION_MAJOR "${_cl_vinfo}")
7 string(REGEX REPLACE "^.*CL_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" CL_VERSION_MINOR "${_cl_vinfo}")
8 string(REGEX REPLACE "^.*CL_VERSION_PATCHLEVEL[ \t]+([0-9]+).*" "\\1" CL_VERSION_PATCHLEVEL "${_cl_vinfo}")
9 set(CL_VERSION "${CL_VERSION_MAJOR}.${CL_VERSION_MINOR}.${CL_VERSION_PATCHLEVEL}")
10
11 # Library
12 file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/include/cln/version.h _cl_vinfo REGEX "^#define[\t ]+CL_LT_.*")
13 string(REGEX REPLACE "^.*CL_LT_CURRENT[ \t]+([0-9]+).*" "\\1" cl_lt_current "${_cl_vinfo}")
14 string(REGEX REPLACE "^.*CL_LT_AGE[ \t]+([0-9]+).*" "\\1" cl_lt_age "${_cl_vinfo}")
15 string(REGEX REPLACE "^.*CL_LT_REVISION[ \t]+([0-9]+).*" "\\1" cl_lt_revision "${_cl_vinfo}")
16
17 # XXX: CMake has no portable library versioning?
18 math(EXPR libcln_soversion "${cl_lt_current} - ${cl_lt_age}")
19 set(libcln_version ${libcln_soversion}.${cl_lt_age}.${cl_lt_revision})
20 option(CLN_USE_GMP "Use GMP low level routines" ON)
21
22 include(GNUInstallDirs)
23
24 set(cl_config_files
25         include/cln/config.h
26         include/cln/host_cpu.h
27         include/cln/intparam.h
28         src/cl_config.h
29         src/base/cl_base_config.h
30         src/base/cl_gmpconfig.h
31         src/timing/cl_t_config.h
32 )
33 set(cln_generated_headers)
34
35 include(CheckIncludeFile)
36 include(CheckLibraryExists)
37 include(CheckTypeSize)
38 include(TestBigEndian)
39 include(CheckFunctionExists)
40 include(CheckCXXSourceCompiles)
41 include(CheckTypeAlign)
42
43 enable_testing()
44 if (NOT TARGET check)
45         add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
46 endif()
47 if (NOT TARGET test_suite)
48         add_custom_target(test_suite)
49 endif()
50 if (NOT TARGET info)
51         add_custom_target(info ALL)
52 endif()
53 if (NOT TARGET html)
54         add_custom_target(html)
55 endif()
56 if (NOT TARGET pdf)
57         add_custom_target(pdf)
58 endif()
59
60 if (NOT DEFINED BUILD_SHARED_LIBS)
61         if (NOT MSVC)
62                 set(BUILD_SHARED_LIBS true)
63         else()
64                 set(BUILD_SHARED_LIBS false)
65         endif()
66 endif()
67 if (WIN32)
68         if (NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY)
69                 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
70         endif()
71 endif()
72
73 if (CLN_USE_GMP)
74 find_package(GMP REQUIRED)
75 endif()
76
77 if (GMP_FOUND)
78         set(CL_USE_GMP TRUE)
79 endif()
80
81 if (GMP_FOUND)
82         get_filename_component(GMP_LIBDIR ${GMP_LIBRARIES} PATH)
83         include(GMPLimbSize)
84 endif(GMP_FOUND)
85
86
87 check_type_size("long long" LONGLONG)
88 if (HAVE_LONGLONG)
89         set(SIZEOF_LONGLONG ${LONGLONG})
90 endif()
91 check_type_size("short" SIZEOF_SHORT)
92 check_type_size("int" SIZEOF_INT)
93 check_type_size("long" SIZEOF_LONG)
94 check_type_size("void *" SIZEOF_VOIDP)
95 check_type_align("void *" ALIGNOF_VOIDP)
96
97 # not guaranteed by the C standard, but holds in practice
98 set(cl_char_bitsize 8)
99 math(EXPR x "${SIZEOF_SHORT} * ${cl_char_bitsize}")
100 set(cl_short_bitsize ${x} CACHE INTERNAL "short_bitsize")
101 math(EXPR cl_int_bitsize "${SIZEOF_INT} * ${cl_char_bitsize}")
102 math(EXPR cl_long_bitsize "${SIZEOF_LONG} * ${cl_char_bitsize}")
103 math(EXPR cl_pointer_bitsize "${SIZEOF_VOIDP} * ${cl_char_bitsize}")
104 if (HAVE_LONGLONG)
105         math(EXPR cl_long_long_bitsize "${SIZEOF_LONGLONG} * ${cl_char_bitsize}")
106 endif()
107
108
109 check_include_file("unistd.h" HAVE_UNISTD_H)
110 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
111
112 set(_save_required_includes ${CMAKE_REQUIRED_INCLUDES})
113 set(_save_required_libraries ${CMAKE_REQUIRED_LIBRARIES})
114 set(_save_required_flags ${CMAKE_REQUIRED_FLAGS})
115 set(CMAKE_REQUIRED_FLAGS "-Werror")
116 set(CMAKE_REQUIRED_INCLUDES "")
117 set(CMAKE_REQUIRED_LIBRARIES "")
118 CHECK_CXX_SOURCE_COMPILES("
119         void f() __attribute__((flatten));
120         int main() { return 0; }
121         "
122         CL_HAVE_ATTRIBUTE_FLATTEN
123 )
124 set(CMAKE_REQUIRED_FLAGS ${_save_required_flags})
125 set(CMAKE_REQUIRED_INCLUDES ${_save_required_includes})
126 set(CMAKE_REQUIRED_LIBRARIES ${_save_required_libraries})
127
128
129 test_big_endian(cl_cv_bigendian_p)
130 if(cl_cv_bigendian_p)
131         set(cln_cpu_big_endian 1)
132 else()
133         set(cln_cpu_big_endian 0)
134 endif()
135
136 include(AsmUnderscore)
137 include(AsmNoexecstack)
138
139 set(GMP_LIBDIR_PC)
140
141 set(_cln_rpath_reloc "$ORIGIN/../lib")
142 set(_wl_rpath "${CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG}")
143 set(_wl_rpath_link "${CMAKE_SHARED_LIBRARY_RPATH_LINK_C_FLAG}")
144
145 # rpath for the pkg-config meta-data
146 set(_libcln_rpath "${_cln_rpath_reloc}")
147 set(_libcln_pc_rpath "${_wl_rpath}${_cln_rpath_reloc}")
148
149 list(FIND CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_FULL_LIBDIR}" isSystemDir)
150 if ("${isSystemDir}" STREQUAL "-1")
151         set(_libcln_pc_rpath "${_libcln_pc_rpath} ${_wl_rpath}\${libdir}")
152         list(APPEND _libcln_rpath ${CMAKE_INSTALL_FULL_LIBDIR})
153 endif()
154
155 list(FIND CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "${GMP_LIBDIR}" isSystemDir)
156 if ("${isSystemDir}" STREQUAL "-1")
157         list(APPEND _libcln_rpath ${GMP_LIBDIR})
158         set(_libcln_pc_rpath "${_libcln_pc_rpath} ${_wl_rpath_link}${GMP_LIBDIR}")
159         set(GMP_LIBDIR_PC "-L${GMP_LIBDIR}")
160 endif()
161 string(REPLACE ";" ":" libcln_rpath "${_libcln_rpath}")
162
163 if (NOT DEFINED CMAKE_INSTALL_RPATH_USE_LINK_RPATH)
164         set(CMAKE_INSTALL_RPATH_USE_LINK_RPATH TRUE)
165 endif()
166 if (NOT DEFINED CMAKE_INSTALL_RPATH)
167         set(CMAKE_INSTALL_RPATH ${libcln_rpath})
168         if (_wl_rpath)
169                 set(CLN_PC_RPATH ${_libcln_pc_rpath})
170         endif()
171 endif()
172 if (APPLE AND NOT DEFINED CMAKE_INSTALL_NAME_DIR)
173         set(CMAKE_INSTALL_NAME_DIR ${CMAKE_INSTALL_FULL_LIBDIR})
174 endif()
175
176 macro(cl_config_file relname)
177         set(_dst ${CMAKE_CURRENT_BINARY_DIR}/${relname})
178         configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${relname}.cmake ${_dst})
179         if ("${relname}" MATCHES "^include")
180                 list(APPEND cln_generated_headers "${_dst}")
181         endif()
182 endmacro()
183
184 foreach(_cf ${cl_config_files})
185         cl_config_file("${_cf}")
186 endforeach()
187 install(FILES ${cln_generated_headers} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/cln")
188
189 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cln.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/cln.pc @ONLY)
190 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cln.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
191
192 include(CMakePackageConfigHelpers)
193 write_basic_package_version_file(
194         ${CMAKE_CURRENT_BINARY_DIR}/cln-config-version.cmake
195         VERSION ${CL_VERSION}
196         COMPATIBILITY AnyNewerVersion
197 )
198 configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/cln-config.cmake.in
199         ${CMAKE_CURRENT_BINARY_DIR}/cln-config.cmake
200         INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/cln
201 )
202 install(FILES
203         ${CMAKE_CURRENT_LIST_DIR}/cmake/modules/FindGMP.cmake
204         ${CMAKE_CURRENT_BINARY_DIR}/cln-config.cmake
205         ${CMAKE_CURRENT_BINARY_DIR}/cln-config-version.cmake
206         DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/cln
207 )
208
209 add_subdirectory(src)
210 add_subdirectory(tests)
211 add_subdirectory(include)
212 add_subdirectory(examples)
213 add_subdirectory(doc)
214