1 cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
2 project(onak VERSION 0.6.3 LANGUAGES C)
4 include(CheckSymbolExists)
6 include(GNUInstallDirs)
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)
14 list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
16 # Configuration options from the user
17 set(DBTYPE "dynamic" CACHE STRING
18 "Configure the default database backend to use" )
20 "Enable the key daemon to handle communication with the key database"
23 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
24 TEST_BIG_ENDIAN(WORDS_BIGENDIAN)
26 include(CheckCSourceCompiles)
27 check_c_source_compiles(
30 static void f(__attribute__((unused))) {}
31 int main(void) { f(); return 0;}
33 HAVE___ATTRIBUTE__UNUSED
35 if (HAVE___ATTRIBUTE__UNUSED)
36 set(UNUSED_ATTRIB "__attribute__((unused))")
41 # Pick up a git based version number for development builds
43 if (GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
44 if (EXISTS "${CMAKE_SOURCE_DIR}/.git/refs/tags/onak-0.6.2")
46 COMMAND ${GIT_EXECUTABLE} describe --tags --dirty
47 OUTPUT_VARIABLE GIT_VERSION
48 OUTPUT_STRIP_TRAILING_WHITESPACE)
49 string(REPLACE "onak-" "" VERSION ${GIT_VERSION})
52 COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
53 OUTPUT_VARIABLE VERSION
54 OUTPUT_STRIP_TRAILING_WHITESPACE)
57 set(VERSION ${PROJECT_VERSION})
61 add_library(libonak STATIC armor.c charfuncs.c cleankey.c cleanup.c decodekey.c
62 hash.c hash-helper.c key-store.c keyarray.c keyid.c keyindex.c
63 ll.c log.c marshal.c mem.c merge.c onak-conf.c parsekey.c photoid.c
64 rsa.c sigcheck.c sendsync.c sha1x.c wordlist.c)
65 set(LIBONAK_LIBRARIES "")
67 # Ideally use Nettle, fall back to our own md5/sha1 routines otherwise
68 pkg_check_modules(NETTLE nettle)
71 target_include_directories(libonak SYSTEM PUBLIC ${NETTLE_INCLUDE_DIRS})
72 LIST(APPEND LIBONAK_LIBRARIES ${NETTLE_LIBRARIES})
74 target_sources(libonak PRIVATE md5.c sha1.c)
77 # We need libhogweed and libgmp to be able to do more than hash calculations
78 pkg_check_modules(HOGWEED hogweed)
84 target_include_directories(libonak SYSTEM PUBLIC
85 ${GMP_INCLUDE_DIRS} ${HOGWEED_INCLUDE_DIRS})
86 LIST(APPEND LIBONAK_LIBRARIES ${GMP_LIBRARY} ${HOGWEED_LIBRARIES})
88 set(CMAKE_REQUIRED_INCLUDES ${NETTLE_INCLUDE_DIRS})
89 set(CMAKE_REQUIRED_LIBRARIES ${NETTLE_LIBRARIES} ${HOGWEED_LIBRARIES})
90 # API change in later version of Nettle
91 CHECK_SYMBOL_EXISTS(nettle_get_secp_256r1 "nettle/ecc-curve.h" HAVE_NETTLE_GET_SECP_256R1)
92 CHECK_SYMBOL_EXISTS(nettle_get_secp_384r1 "nettle/ecc-curve.h" HAVE_NETTLE_GET_SECP_384R1)
93 CHECK_SYMBOL_EXISTS(nettle_get_secp_521r1 "nettle/ecc-curve.h" HAVE_NETTLE_GET_SECP_521R1)
96 # keyd will use this for socket activation, if it's available
97 pkg_check_modules(SYSTEMD libsystemd)
99 set(HAVE_SYSTEMD true)
102 # Build files that have substitutions in them
103 include_directories(${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR})
104 configure_file("${CMAKE_SOURCE_DIR}/build-config.h.in"
105 "${CMAKE_BINARY_DIR}/build-config.h" @ONLY)
107 configure_file("${CMAKE_SOURCE_DIR}/onak.ini.in"
108 "${CMAKE_BINARY_DIR}/onak.ini" @ONLY)
109 install(FILES ${CMAKE_BINARY_DIR}/onak.ini
110 DESTINATION ${CMAKE_INSTALL_SYSCONFDIR})
112 configure_file("${CMAKE_SOURCE_DIR}/onak-mail.pl.in"
113 "${CMAKE_BINARY_DIR}/onak-mail.pl" @ONLY)
114 install(PROGRAMS ${CMAKE_BINARY_DIR}/onak-mail.pl
115 DESTINATION ${CMAKE_INSTALL_LIBDIR}/onak/)
116 install(FILES onak-mail.pl.8 DESTINATION ${CMAKE_INSTALL_MANDIR}/man8/)
118 # Key database backends
119 add_subdirectory(keydb)
121 # Now we have the DB type confirmed we can tidy up the libonak options
123 if (DBTYPE STREQUAL "dynamic")
124 LIST(APPEND LIBONAK_LIBRARIES "dl")
126 list (FIND BACKENDS ${DBTYPE} _index)
127 if (${_index} LESS 0)
128 message(FATAL_ERROR "${DBTYPE} is not a supported DB backend.")
131 LIST(APPEND LIBONAK_LIBRARIES ${BACKEND_${DBTYPE}_LIBS})
134 # For onak-conf.o compilation
135 target_compile_definitions(libonak PRIVATE
136 CONFIGDIR="${CMAKE_INSTALL_FULL_SYSCONFDIR}"
137 DBINIT=keydb_${DBTYPE}_init)
139 # DB Backend related options are known, so finish off libonak configuration
140 target_sources(libonak PRIVATE keydb/keydb_${DBTYPE}.c)
141 target_link_libraries(libonak ${LIBONAK_LIBRARIES})
144 add_subdirectory(cgi)
146 # Executables start here
149 add_executable(onak onak.c)
150 target_link_libraries(onak libonak)
152 # Tools that operate on the key DB
153 add_executable(maxpath maxpath.c stats.c)
154 target_link_libraries(maxpath libonak)
155 add_executable(sixdegrees sixdegrees.c stats.c)
156 target_link_libraries(sixdegrees libonak)
157 add_executable(wotsap wotsap.c)
158 target_link_libraries(wotsap libonak)
161 add_executable(splitkeys splitkeys.c)
162 target_link_libraries(splitkeys libonak)
163 add_executable(stripkey stripkey.c)
164 target_link_libraries(stripkey libonak)
166 install(TARGETS onak splitkeys RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
167 install(FILES onak.1 splitkeys.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)
171 add_test(NAME syntaxtest COMMAND perl -cw ${CMAKE_BINARY_DIR}/onak-mail.pl)
172 add_test(NAME sanitytests COMMAND ${CMAKE_SOURCE_DIR}/runtests)