]> www.ginac.de Git - cln.git/blob - CMakeLists.txt
build/CMake: defined `long_long_(big|little)_endian` to intparam.h
[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 if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/config.status
23                 OR EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/libtool)
24         message(FATAL_ERROR
25                 "Source directory has been already configured by configure script. "
26                 "Please run `make distclean` in ${CMAKE_CURRENT_SOURCE_DIR} and try again."
27         )
28 endif()
29 include(GNUInstallDirs)
30
31 set(cl_config_files
32         include/cln/config.h
33         include/cln/host_cpu.h
34         include/cln/intparam.h
35         autoconf/cl_config.h
36         src/base/cl_base_config.h
37         src/base/cl_gmpconfig.h
38         src/timing/cl_t_config.h
39 )
40 set(cln_generated_headers)
41
42 include(CheckIncludeFile)
43 include(CheckLibraryExists)
44 include(CheckTypeSize)
45 include(TestBigEndian)
46 include(CheckFunctionExists)
47 include(CheckCXXSourceCompiles)
48 include(CheckTypeAlign)
49
50 enable_testing()
51 if (NOT TARGET check)
52         add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
53 endif()
54 if (NOT TARGET test_suite)
55         add_custom_target(test_suite)
56 endif()
57 if (NOT TARGET info)
58         add_custom_target(info ALL)
59 endif()
60 if (NOT TARGET html)
61         add_custom_target(html)
62 endif()
63 if (NOT TARGET pdf)
64         add_custom_target(pdf)
65 endif()
66
67 if (NOT DEFINED BUILD_SHARED_LIBS)
68         if (NOT MSVC)
69                 set(BUILD_SHARED_LIBS true)
70         else()
71                 set(BUILD_SHARED_LIBS false)
72         endif()
73 endif()
74 if (WIN32)
75         if (NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY)
76                 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
77         endif()
78 endif()
79
80 if (CLN_USE_GMP)
81 find_package(GMP REQUIRED)
82 endif()
83
84 if (GMP_FOUND)
85         set(CL_USE_GMP TRUE)
86 endif()
87
88 if (GMP_FOUND)
89         get_filename_component(GMP_LIBDIR ${GMP_LIBRARIES} PATH)
90         include(GMPLimbSize)
91 endif(GMP_FOUND)
92
93
94 check_type_size("long long" LONGLONG)
95 if (HAVE_LONGLONG)
96         set(SIZEOF_LONGLONG ${LONGLONG})
97 endif()
98 check_type_size("short" SIZEOF_SHORT)
99 check_type_size("int" SIZEOF_INT)
100 check_type_size("long" SIZEOF_LONG)
101 check_type_size("void *" SIZEOF_VOIDP)
102 check_type_align("void *" ALIGNOF_VOIDP)
103
104 # not guaranteed by the C standard, but holds in practice
105 set(cl_char_bitsize 8)
106 math(EXPR x "${SIZEOF_SHORT} * ${cl_char_bitsize}")
107 set(cl_short_bitsize ${x} CACHE INTERNAL "short_bitsize")
108 math(EXPR cl_int_bitsize "${SIZEOF_INT} * ${cl_char_bitsize}")
109 math(EXPR cl_long_bitsize "${SIZEOF_LONG} * ${cl_char_bitsize}")
110 math(EXPR cl_pointer_bitsize "${SIZEOF_VOIDP} * ${cl_char_bitsize}")
111 if (HAVE_LONGLONG)
112         math(EXPR cl_long_long_bitsize "${SIZEOF_LONGLONG} * ${cl_char_bitsize}")
113 endif()
114
115
116 check_include_file("unistd.h" HAVE_UNISTD_H)
117 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
118
119 set(_save_required_includes ${CMAKE_REQUIRED_INCLUDES})
120 set(_save_required_libraries ${CMAKE_REQUIRED_LIBRARIES})
121 set(_save_required_flags ${CMAKE_REQUIRED_FLAGS})
122 set(CMAKE_REQUIRED_FLAGS "-Werror")
123 set(CMAKE_REQUIRED_INCLUDES "")
124 set(CMAKE_REQUIRED_LIBRARIES "")
125 CHECK_CXX_SOURCE_COMPILES("
126         void f() __attribute__((flatten));
127         int main() { return 0; }
128         "
129         CL_HAVE_ATTRIBUTE_FLATTEN
130 )
131 set(CMAKE_REQUIRED_FLAGS ${_save_required_flags})
132 set(CMAKE_REQUIRED_INCLUDES ${_save_required_includes})
133 set(CMAKE_REQUIRED_LIBRARIES ${_save_required_libraries})
134
135
136 test_big_endian(cl_cv_bigendian_p)
137 if(cl_cv_bigendian_p)
138         set(short_big_endian 1 CACHE INTERNAL "CPU is big endian")
139         set(int_big_endian 1 CACHE INTERNAL "CPU is big endian")
140         set(long_big_endian 1 CACHE INTERNAL "CPU is big endian")
141         set(long_long_big_endian 1 CACHE INTERNAL "CPU is big endian")
142 else()
143         set(short_little_endian 1 CACHE INTERNAL "CPU is little endian")
144         set(int_little_endian 1 CACHE INTERNAL "CPU is little endian")
145         set(long_little_endian 1 CACHE INTERNAL "CPU is little endian")
146         set(long_long_little_endian 1 CACHE INTERNAL "CPU is little endian")
147 endif()
148
149 include(AsmUnderscore)
150 include(AsmNoexecstack)
151
152 set(GMP_LIBDIR_PC)
153
154 set(_cln_rpath_reloc "$ORIGIN/../lib")
155 set(_wl_rpath "${CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG}")
156 set(_wl_rpath_link "${CMAKE_SHARED_LIBRARY_RPATH_LINK_C_FLAG}")
157
158 # rpath for the pkg-config meta-data
159 set(_libcln_rpath "${_cln_rpath_reloc}")
160 set(_libcln_pc_rpath "${_wl_rpath}${_cln_rpath_reloc}")
161
162 list(FIND CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_FULL_LIBDIR}" isSystemDir)
163 if ("${isSystemDir}" STREQUAL "-1")
164         set(_libcln_pc_rpath "${_libcln_pc_rpath} ${_wl_rpath}\${libdir}")
165         list(APPEND _libcln_rpath ${CMAKE_INSTALL_FULL_LIBDIR})
166 endif()
167
168 list(FIND CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "${GMP_LIBDIR}" isSystemDir)
169 if ("${isSystemDir}" STREQUAL "-1")
170         list(APPEND _libcln_rpath ${GMP_LIBDIR})
171         set(_libcln_pc_rpath "${_libcln_pc_rpath} ${_wl_rpath_link}${GMP_LIBDIR}")
172         set(GMP_LIBDIR_PC "-L${GMP_LIBDIR}")
173 endif()
174 string(REPLACE ";" ":" libcln_rpath "${_libcln_rpath}")
175
176 if (NOT DEFINED CMAKE_INSTALL_RPATH_USE_LINK_RPATH)
177         set(CMAKE_INSTALL_RPATH_USE_LINK_RPATH TRUE)
178 endif()
179 if (NOT DEFINED CMAKE_INSTALL_RPATH)
180         set(CMAKE_INSTALL_RPATH ${libcln_rpath})
181         if (_wl_rpath)
182                 set(CLN_PC_RPATH ${_libcln_pc_rpath})
183         endif()
184 endif()
185 if (APPLE AND NOT DEFINED CMAKE_INSTALL_NAME_DIR)
186         set(CMAKE_INSTALL_NAME_DIR ${CMAKE_INSTALL_FULL_LIBDIR})
187 endif()
188
189 macro(cl_config_file relname)
190         set(_dst ${CMAKE_CURRENT_BINARY_DIR}/${relname})
191         configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${relname}.cmake ${_dst})
192         if ("${relname}" MATCHES "^include")
193                 list(APPEND cln_generated_headers "${_dst}")
194         endif()
195 endmacro()
196
197 foreach(_cf ${cl_config_files})
198         cl_config_file("${_cf}")
199 endforeach()
200 install(FILES ${cln_generated_headers} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/cln")
201
202 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cln.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/cln.pc @ONLY)
203 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cln.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
204
205 include(CMakePackageConfigHelpers)
206 write_basic_package_version_file(
207         ${CMAKE_CURRENT_BINARY_DIR}/cln-config-version.cmake
208         VERSION ${CL_VERSION}
209         COMPATIBILITY AnyNewerVersion
210 )
211 configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/cln-config.cmake.in
212         ${CMAKE_CURRENT_BINARY_DIR}/cln-config.cmake
213         INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/cln
214 )
215 install(FILES
216         ${CMAKE_CURRENT_LIST_DIR}/cmake/modules/FindGMP.cmake
217         ${CMAKE_CURRENT_BINARY_DIR}/cln-config.cmake
218         ${CMAKE_CURRENT_BINARY_DIR}/cln-config-version.cmake
219         DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/cln
220 )
221
222 add_subdirectory(src)
223 add_subdirectory(tests)
224 add_subdirectory(include)
225 add_subdirectory(examples)
226 add_subdirectory(doc)
227