CMakeLists.txt (view raw)
1cmake_minimum_required(VERSION 3.10)
2
3project(nimisewi
4 VERSION 0.3.0
5 DESCRIPTION "small program that generates random toki pona noun phrase"
6 HOMEPAGE_URL "https://fsl.aaoth.xyz/nimisewi.c/home")
7
8configure_file(config.h.in config.h)
9
10add_executable(nimisewi main.c nimisewi.c
11 ${PROJECT_BINARY_DIR}/nimitoki.c)
12target_include_directories(nimisewi PUBLIC "${PROJECT_BINARY_DIR}")
13
14add_executable(makenimitoki makenimitoki.c)
15target_include_directories(makenimitoki PUBLIC "${PROJECT_BINARY_DIR}")
16
17add_custom_command(
18 OUTPUT ${PROJECT_BINARY_DIR}/nimitoki.c
19 ${PROJECT_BINARY_DIR}/nimitoki.h
20 COMMAND makenimitoki ${PROJECT_SOURCE_DIR}/nimitoki.txt
21 DEPENDS makenimitoki)
22
23include(CheckIncludeFile)
24include(CheckSymbolExists)
25include(CheckCSourceCompiles)
26
27set(WARNING_STATIC_BUILD "static build won't work here")
28
29# check libraries
30
31cmake_host_system_information(RESULT OS_NAME QUERY OS_NAME)
32message(VERBOSE "OS_NAME is ${OS_NAME}")
33if(OS_NAME MATCHES "Linux")
34 check_include_file("bsd/string.h" HAVE_BSD_STRING_H)
35 check_include_file("bsd/stdlib.h" HAVE_BSD_STDLIB_H)
36 if(HAVE_BSD_STRING_H AND HAVE_BSD_STDLIB_H)
37 set(CMAKE_REQUIRED_LIBRARIES "bsd")
38
39 check_symbol_exists(strlcat "bsd/string.h" HAVE_STRLCAT)
40 if (HAVE_STRLCAT)
41 list(APPEND EXTRA_DEFINITIONS HAVE_BSD_STRING_H HAVE_STRLCAT)
42 endif()
43
44 check_symbol_exists(arc4random_uniform "bsd/stdlib.h"
45 HAVE_ARC4RANDOM_UNIFORM)
46 if (HAVE_ARC4RANDOM_UNIFORM)
47 list(APPEND EXTRA_DEFINITIONS HAVE_BSD_STDLIB_H HAVE_ARC4RANDOM_UNIFORM)
48 endif()
49
50 # check static libraries
51 set(CMAKE_REQUIRED_LINK_OPTIONS "-static")
52 check_c_source_compiles(
53 "#include<bsd/string.h>\nint main(void){return 0;}"
54 HAVE_LIBBSD_STATIC)
55
56 if(NOT ANDROID)
57 # libpthread and libmd are needed when linking statically on linux.
58 # these test aren't really checking particular functions, but
59 # they are here to make sure that program could be linked statically
60 unset(CMAKE_REQUIRED_LIBRARIES)
61 set(CMAKE_REQUIRED_LIBRARIES "pthread")
62 check_c_source_compiles(
63 "#include<pthread.h>\nint main(void){return 0;}"
64 HAVE_LIBPTHREAD_STATIC)
65
66 unset(CMAKE_REQUIRED_LIBRARIES)
67 set(CMAKE_REQUIRED_LIBRARIES "md")
68 check_c_source_compiles(
69 "#include<sha2.h>\nint main(void){return 0;}"
70 HAVE_LIBMD_STATIC)
71
72 if(NOT (HAVE_LIBBSD_STATIC
73 AND HAVE_LIBPTHREAD_STATIC
74 AND HAVE_LIBMD_STATIC))
75 message(WARNING ${WARNING_STATIC_BUILD})
76 list(APPEND EXTRA_LIBS bsd pthread md)
77 endif()
78
79 else()
80 if(NOT (HAVE_LIBBSD_STATIC))
81 message(WARNING ${WARNING_STATIC_BUILD})
82 endif()
83 list(APPEND EXTRA_LIBS bsd)
84 endif()
85
86 unset(CMAKE_REQUIRED_LIBRARIES)
87 unset(CMAKE_REQUIRED_LINK_OPTIONS)
88 endif()
89endif()
90
91if(OS_NAME MATCHES "(.*BSD)|(DragonFly)")
92 check_symbol_exists(strlcat "string.h" HAVE_STRLCAT)
93 if(HAVE_STRLCAT)
94 list(APPEND EXTRA_DEFINITIONS HAVE_STRLCAT)
95 endif()
96 check_symbol_exists(arc4random_uniform "stdlib.h" HAVE_ARC4RANDOM_UNIFORM)
97 if(HAVE_ARC4RANDOM_UNIFORM)
98 list(APPEND EXTRA_DEFINITIONS HAVE_ARC4RANDOM_UNIFORM)
99 endif()
100 check_symbol_exists(pledge "unistd.h" HAVE_PLEDGE)
101 if(HAVE_PLEDGE)
102 list(APPEND EXTRA_DEFINITIONS HAVE_PLEDGE)
103 endif()
104endif()
105
106set(CMAKE_REQUIRED_LINK_OPTIONS "-static")
107check_c_source_compiles(
108 "#include<stdio.h>\nint main(void){return 0;}" HAVE_LIBC_STATIC
109 )
110if(NOT HAVE_LIBC_STATIC)
111 message(WARNING ${WARNING_STATIC_BUILD})
112endif()
113
114target_link_libraries(nimisewi PUBLIC ${EXTRA_LIBS})
115target_compile_definitions(nimisewi PRIVATE ${EXTRA_DEFINITIONS})
116
117set(NIMISEWI_CGI_STATIC_BUILD FALSE)
118if(HAVE_LIBC_STATIC)
119 if(HAVE_BSD_STRING_H AND HAVE_BSD_STDLIB_H)
120 if(HAVE_LIBBSD_STATIC)
121 set(NIMISEWI_CGI_STATIC_BUILD TRUE)
122 endif()
123 else()
124 set(NIMISEWI_CGI_STATIC_BUILD TRUE)
125 endif()
126endif()
127
128# optional binaries
129
130option(BUILD_CGI "build cgi version of nimisewi" OFF)
131if(BUILD_CGI)
132 add_executable(nimisewi.cgi cgi.c nimisewi.c
133 ${PROJECT_BINARY_DIR}/nimitoki.c)
134 option(CGI_INSTALL_DIR "specify installation directory of cgi script")
135 if(CGI_INSTALL_DIR)
136 set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR
137 ${CGI_INSTALL_DIR})
138 else()
139 set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR
140 "var/www/htdocs/cgi-bin")
141 endif()
142 target_include_directories(nimisewi.cgi PUBLIC "${PROJECT_BINARY_DIR}")
143 target_compile_definitions(nimisewi.cgi PRIVATE ${EXTRA_DEFINITIONS})
144 target_link_libraries(nimisewi.cgi PUBLIC ${EXTRA_LIBS})
145 if(NIMISEWI_CGI_STATIC_BUILD)
146 target_link_options(nimisewi.cgi PUBLIC -static)
147 endif()
148endif()
149
150option(BUILD_GEMINI_CGI "build cgi version of nimisewi for gemini protocol" OFF)
151if(BUILD_GEMINI_CGI)
152 add_executable(nimisewi_gemini.cgi cgi_gemini.c nimisewi.c
153 ${PROJECT_BINARY_DIR}/nimitoki.c)
154 option(GEMINI_CGI_INSTALL_DIR "specify installation directory of cgi script")
155 if(GEMINI_CGI_INSTALL_DIR)
156 set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR
157 ${GEMINI_CGI_INSTALL_DIR})
158 else()
159 set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR
160 "var/gemini/cgi-bin")
161 endif()
162 target_include_directories(nimisewi_gemini.cgi PUBLIC "${PROJECT_BINARY_DIR}")
163 target_compile_definitions(nimisewi_gemini.cgi PRIVATE ${EXTRA_DEFINITIONS})
164 target_link_libraries(nimisewi_gemini.cgi PUBLIC ${EXTRA_LIBS})
165 if(NIMISEWI_CGI_STATIC_BUILD)
166 target_link_options(nimisewi_gemini.cgi PUBLIC -static)
167 endif()
168endif()
169
170# installation
171
172install(TARGETS nimisewi DESTINATION bin)
173if(BUILD_CGI)
174 install(TARGETS nimisewi.cgi
175 DESTINATION $<TARGET_PROPERTY:nimisewi.cgi,CGI_INSTALL_DIR>)
176endif()
177if(BUILD_GEMINI_CGI)
178 install(TARGETS nimisewi_gemini.cgi
179 DESTINATION $<TARGET_PROPERTY:nimisewi_gemini.cgi,GEMINI_CGI_INSTALL_DIR>)
180endif()
181
182include(InstallRequiredSystemLibraries)
183set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
184set(CPACK_PROJECT_VERSION_MAJOR ${nimisewi_VERSION_MAJOR})
185set(CPACK_PROJECT_VERSION_MINOR ${nimisewi_VERSION_MINOR})
186set(CPACK_PROJECT_VERSION_PATCH ${nimisewi_VERSION_PATCH})
187set(CPACK_PACKAGE_FILE_NAME
188 ${CMAKE_PROJECT_NAME}-${nimisewi_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR})
189set(CPACK_GENERATOR "TGZ" "ZIP")
190set(CPACK_SOURCE_GENERATOR "TGZ" "ZIP")
191set(CPACK_SOURCE_IGNORE_FILES
192 \.fslckout
193 \.fossil-settings
194 build/
195 utils/
196 download.md
197 )
198set(CPACK_STRIP_FILES TRUE)
199include(CPack)
200
201# testing
202
203enable_testing()
204
205add_test(NAME runs COMMAND nimisewi)
206
207add_test(NAME version COMMAND nimisewi -v)
208set_tests_properties(version
209 PROPERTIES PASS_REGULAR_EXPRESSION
210 "nimisewi [0-9]\.[0-9]\.[0-9]\n[a-z ]+(\nfeatures:\n([A-Z_]+(\n)?)+)?")
211
212if(BUILD_CGI)
213 add_test(NAME cgi COMMAND nimisewi.cgi)
214 set_tests_properties(cgi
215 PROPERTIES PASS_REGULAR_EXPRESSION
216 "Status: 200 OK\rContent-Type: text\/html\r\r<.*>")
217endif()
218if(BUILD_GEMINI_CGI)
219 add_test(NAME gemini_cgi COMMAND nimisewi_gemini.cgi)
220 set_tests_properties(gemini_cgi
221 PROPERTIES PASS_REGULAR_EXPRESSION "20 text\/gemini\r\n.*")
222endif()