]> the.earth.li Git - onak.git/blob - CMakeLists.txt
Remove stray ; from keydb_keyring
[onak.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
2 project(onak VERSION 0.6.2 LANGUAGES C)
3
4 include(CheckSymbolExists)
5 include(FindPkgConfig)
6 include(GNUInstallDirs)
7 include(TestBigEndian)
8 # Fall back for earlier versions of CMake which lack RUNSTATEDIR
9 if ("x${CMAKE_INSTALL_FULL_RUNSTATEDIR}" STREQUAL "x")
10         set(CMAKE_INSTALL_FULL_RUNSTATEDIR
11                 ${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/run)
12 endif()
13
14 list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
15
16 # Configuration options from the user
17 set(DBTYPE "dynamic" CACHE STRING
18         "Configure the default database backend to use" )
19 option(KEYD
20         "Enable the key daemon to handle communication with the key database"
21         ON)
22
23 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
24 TEST_BIG_ENDIAN(WORDS_BIGENDIAN)
25
26 include(CheckCSourceCompiles)
27 check_c_source_compiles(
28         "
29                 #include <stdlib.h>
30                 static void f(__attribute__((unused))) {}
31                 int main(void) { f(); return 0;}
32         "
33         HAVE___ATTRIBUTE__UNUSED
34 )
35 if (HAVE___ATTRIBUTE__UNUSED)
36         set(UNUSED_ATTRIB "__attribute__((unused))")
37 else()
38         set(UNUSED_ATTRIB "")
39 endif()
40
41 # Pick up a git based version number for development builds
42 find_package(Git)
43 if (GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
44         EXECUTE_PROCESS(COMMAND ${GIT_EXECUTABLE} describe --tags --dirty
45                 OUTPUT_VARIABLE GIT_VERSION
46                 OUTPUT_STRIP_TRAILING_WHITESPACE)
47         string(REPLACE "onak-" "" VERSION ${GIT_VERSION})
48 else()
49         set(VERSION ${PROJECT_VERSION})
50 endif()
51
52 # Core objects
53 add_library(libonak STATIC armor.c charfuncs.c cleankey.c cleanup.c decodekey.c
54         getcgi.c hash.c hash-helper.c key-store.c keyarray.c keyid.c keyindex.c
55         ll.c log.c marshal.c mem.c merge.c onak-conf.c parsekey.c photoid.c
56         rsa.c sigcheck.c sendsync.c sha1x.c wordlist.c)
57 set(LIBONAK_LIBRARIES "")
58
59 # Ideally use Nettle, fall back to our own md5/sha1 routines otherwise
60 pkg_check_modules(NETTLE nettle)
61 if (NETTLE_FOUND)
62         set(HAVE_NETTLE true)
63         target_include_directories(libonak SYSTEM PUBLIC ${NETTLE_INCLUDE_DIRS})
64         LIST(APPEND LIBONAK_LIBRARIES ${NETTLE_LIBRARIES})
65 else()
66         target_sources(libonak PRIVATE md5.c sha1.c)
67 endif()
68
69 # We need libhogweed and libgmp to be able to do more than hash calculations
70 pkg_check_modules(HOGWEED hogweed)
71 if (HOGWEED_FOUND)
72         find_package(GMP)
73 endif()
74 if (GMP_FOUND)
75         set(HAVE_CRYPTO true)
76         target_include_directories(libonak SYSTEM PUBLIC
77                         ${GMP_INCLUDE_DIRS} ${HOGWEED_INCLUDE_DIRS})
78         LIST(APPEND LIBONAK_LIBRARIES ${GMP_LIBRARY} ${HOGWEED_LIBRARIES})
79
80         set(CMAKE_REQUIRED_INCLUDES ${NETTLE_INCLUDE_DIRS})
81         set(CMAKE_REQUIRED_LIBRARIES ${NETTLE_LIBRARIES} ${HOGWEED_LIBRARIES})
82         # API change in later version of Nettle
83         CHECK_SYMBOL_EXISTS(nettle_get_secp_256r1 "nettle/ecc-curve.h" HAVE_NETTLE_GET_SECP_256R1)
84         CHECK_SYMBOL_EXISTS(nettle_get_secp_384r1 "nettle/ecc-curve.h" HAVE_NETTLE_GET_SECP_384R1)
85         CHECK_SYMBOL_EXISTS(nettle_get_secp_521r1 "nettle/ecc-curve.h" HAVE_NETTLE_GET_SECP_521R1)
86 endif()
87
88 # Build files that have substitutions in them
89 include_directories(${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR})
90 configure_file("${CMAKE_SOURCE_DIR}/build-config.h.in"
91         "${CMAKE_BINARY_DIR}/build-config.h" @ONLY)
92
93 configure_file("${CMAKE_SOURCE_DIR}/onak.ini.in"
94         "${CMAKE_BINARY_DIR}/onak.ini" @ONLY)
95 install(FILES ${CMAKE_BINARY_DIR}/onak.ini
96         DESTINATION ${CMAKE_INSTALL_SYSCONFDIR})
97
98 configure_file("${CMAKE_SOURCE_DIR}/onak-mail.pl.in"
99         "${CMAKE_BINARY_DIR}/onak-mail.pl" @ONLY)
100 install(PROGRAMS ${CMAKE_BINARY_DIR}/onak-mail.pl
101         DESTINATION ${CMAKE_INSTALL_LIBDIR}/onak/)
102 install(FILES onak-mail.pl.8 DESTINATION ${CMAKE_INSTALL_MANDIR}/man8/)
103
104 # Key database backends
105 add_subdirectory(keydb)
106
107 # Now we have the DB type confirmed we can tidy up the libonak options
108
109 if (DBTYPE STREQUAL "dynamic")
110         LIST(APPEND LIBONAK_LIBRARIES "dl")
111 else()
112         list (FIND BACKENDS ${DBTYPE} _index)
113         if (${_index} LESS 0)
114                 message(FATAL_ERROR "${DBTYPE} is not a supported DB backend.")
115         endif()
116
117         LIST(APPEND LIBONAK_LIBRARIES ${BACKEND_${DBTYPE}_LIBS})
118 endif()
119
120 # For onak-conf.o compilation
121 target_compile_definitions(libonak PRIVATE
122         CONFIGDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}"
123         DBINIT=keydb_${DBTYPE}_init)
124
125 # DB Backend related options are known, so finish off libonak configuration
126 target_sources(libonak PRIVATE keydb/keydb_${DBTYPE}.c)
127 target_link_libraries(libonak ${LIBONAK_LIBRARIES})
128
129 # CGI directory
130 add_subdirectory(cgi)
131
132 # Executables start here
133
134 # Swiss Army tool
135 add_executable(onak onak.c)
136 target_link_libraries(onak libonak)
137
138 # Tools that operate on the key DB
139 add_executable(maxpath maxpath.c stats.c)
140 target_link_libraries(maxpath libonak)
141 add_executable(sixdegrees sixdegrees.c stats.c)
142 target_link_libraries(sixdegrees libonak)
143 add_executable(wotsap wotsap.c)
144 target_link_libraries(wotsap libonak)
145
146 # Stand alone tools
147 add_executable(splitkeys splitkeys.c)
148 target_link_libraries(splitkeys libonak)
149 add_executable(stripkey stripkey.c)
150 target_link_libraries(stripkey libonak)
151
152 install(TARGETS onak splitkeys RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
153 install(FILES onak.1 splitkeys.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)
154
155 # Basic unit tests
156 enable_testing()
157 add_test(NAME syntaxtest COMMAND perl -cw ${CMAKE_BINARY_DIR}/onak-mail.pl)
158 add_test(NAME sanitytests COMMAND ${CMAKE_SOURCE_DIR}/runtests)