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 # libpthread and libmd are needed when linking statically on linux.
56 # these test aren't really checking particular functions, but
57 # they are here to make sure that program could be linked statically
58 unset(CMAKE_REQUIRED_LIBRARIES)
59 set(CMAKE_REQUIRED_LIBRARIES "pthread")
60 check_c_source_compiles(
61 "#include<pthread.h>\nint main(void){return 0;}"
62 HAVE_LIBPTHREAD_STATIC)
63
64 unset(CMAKE_REQUIRED_LIBRARIES)
65 set(CMAKE_REQUIRED_LIBRARIES "md")
66 check_c_source_compiles(
67 "#include<sha2.h>\nint main(void){return 0;}"
68 HAVE_LIBMD_STATIC)
69
70 if(NOT (HAVE_LIBBSD_STATIC
71 AND HAVE_LIBPTHREAD_STATIC
72 AND HAVE_LIBMD_STATIC))
73 message(WARNING ${WARNING_STATIC_BUILD})
74 endif()
75
76 list(APPEND EXTRA_LIBS bsd pthread md)
77 unset(CMAKE_REQUIRED_LIBRARIES)
78 unset(CMAKE_REQUIRED_LINK_OPTIONS)
79 endif()
80endif()
81
82if(OS_NAME MATCHES "(.*BSD)|(DragonFly)")
83 check_symbol_exists(strlcat "string.h" HAVE_STRLCAT)
84 if(HAVE_STRLCAT)
85 list(APPEND EXTRA_DEFINITIONS HAVE_STRLCAT)
86 endif()
87 check_symbol_exists(arc4random_uniform "stdlib.h" HAVE_ARC4RANDOM_UNIFORM)
88 if(HAVE_ARC4RANDOM_UNIFORM)
89 list(APPEND EXTRA_DEFINITIONS HAVE_ARC4RANDOM_UNIFORM)
90 endif()
91 check_symbol_exists(pledge "unistd.h" HAVE_PLEDGE)
92 if(HAVE_PLEDGE)
93 list(APPEND EXTRA_DEFINITIONS HAVE_PLEDGE)
94 endif()
95endif()
96
97set(CMAKE_REQUIRED_LINK_OPTIONS "-static")
98check_c_source_compiles(
99 "#include<stdio.h>\nint main(void){return 0;}" HAVE_LIBC_STATIC
100 )
101if(NOT HAVE_LIBC_STATIC)
102 message(WARNING ${WARNING_STATIC_BUILD})
103endif()
104
105target_link_libraries(nimisewi PUBLIC ${EXTRA_LIBS})
106target_compile_definitions(nimisewi PRIVATE ${EXTRA_DEFINITIONS})
107
108set(NIMISEWI_CGI_STATIC_BUILD FALSE)
109if(HAVE_LIBC_STATIC)
110 if(HAVE_BSD_STRING_H AND HAVE_BSD_STDLIB_H)
111 if(HAVE_LIBBSD_STATIC)
112 set(NIMISEWI_CGI_STATIC_BUILD TRUE)
113 endif()
114 else()
115 set(NIMISEWI_CGI_STATIC_BUILD TRUE)
116 endif()
117endif()
118
119# optional binaries
120
121option(BUILD_CGI "build cgi version of nimisewi" OFF)
122if(BUILD_CGI)
123 add_executable(nimisewi.cgi cgi.c nimisewi.c
124 ${PROJECT_BINARY_DIR}/nimitoki.c)
125 option(CGI_INSTALL_DIR "specify installation directory of cgi script")
126 if(CGI_INSTALL_DIR)
127 set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR
128 ${CGI_INSTALL_DIR})
129 else()
130 set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR
131 "var/www/htdocs/cgi-bin")
132 endif()
133 target_include_directories(nimisewi.cgi PUBLIC "${PROJECT_BINARY_DIR}")
134 target_compile_definitions(nimisewi.cgi PRIVATE ${EXTRA_DEFINITIONS})
135 target_link_libraries(nimisewi.cgi PUBLIC ${EXTRA_LIBS})
136 if(NIMISEWI_CGI_STATIC_BUILD)
137 target_link_options(nimisewi.cgi PUBLIC -static)
138 endif()
139endif()
140
141option(BUILD_GEMINI_CGI "build cgi version of nimisewi for gemini protocol" OFF)
142if(BUILD_GEMINI_CGI)
143 add_executable(nimisewi_gemini.cgi cgi_gemini.c nimisewi.c
144 ${PROJECT_BINARY_DIR}/nimitoki.c)
145 option(GEMINI_CGI_INSTALL_DIR "specify installation directory of cgi script")
146 if(GEMINI_CGI_INSTALL_DIR)
147 set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR
148 ${GEMINI_CGI_INSTALL_DIR})
149 else()
150 set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR
151 "var/gemini/cgi-bin")
152 endif()
153 target_include_directories(nimisewi_gemini.cgi PUBLIC "${PROJECT_BINARY_DIR}")
154 target_compile_definitions(nimisewi_gemini.cgi PRIVATE ${EXTRA_DEFINITIONS})
155 target_link_libraries(nimisewi_gemini.cgi PUBLIC ${EXTRA_LIBS})
156 if(NIMISEWI_CGI_STATIC_BUILD)
157 target_link_options(nimisewi_gemini.cgi PUBLIC -static)
158 endif()
159endif()
160
161# installation
162
163install(TARGETS nimisewi DESTINATION bin)
164if(BUILD_CGI)
165 install(TARGETS nimisewi.cgi
166 DESTINATION $<TARGET_PROPERTY:nimisewi.cgi,CGI_INSTALL_DIR>)
167endif()
168if(BUILD_GEMINI_CGI)
169 install(TARGETS nimisewi_gemini.cgi
170 DESTINATION $<TARGET_PROPERTY:nimisewi_gemini.cgi,GEMINI_CGI_INSTALL_DIR>)
171endif()
172
173include(InstallRequiredSystemLibraries)
174set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
175set(CPACK_PROJECT_VERSION_MAJOR ${nimisewi_VERSION_MAJOR})
176set(CPACK_PROJECT_VERSION_MINOR ${nimisewi_VERSION_MINOR})
177set(CPACK_PROJECT_VERSION_PATCH ${nimisewi_VERSION_PATCH})
178set(CPACK_PACKAGE_FILE_NAME
179 ${CMAKE_PROJECT_NAME}-${nimisewi_VERSION}
180 -${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR})
181set(CPACK_GENERATOR "TGZ" "ZIP")
182set(CPACK_SOURCE_GENERATOR "TGZ" "ZIP")
183set(CPACK_SOURCE_IGNORE_FILES
184 \.fslckout
185 \.fossil-settings
186 build/
187 utils/
188 download.md
189 )
190set(CPACK_STRIP_FILES TRUE)
191include(CPack)
192
193# testing
194
195enable_testing()
196
197add_test(NAME runs COMMAND nimisewi)
198
199add_test(NAME version COMMAND nimisewi -v)
200set_tests_properties(version
201 PROPERTIES PASS_REGULAR_EXPRESSION
202 "nimisewi [0-9]\.[0-9]\.[0-9]\n[a-z ]+(\nfeatures:\n([A-Z_]+(\n)?)+)?")
203
204if(BUILD_CGI)
205 add_test(NAME cgi COMMAND nimisewi.cgi)
206 set_tests_properties(cgi
207 PROPERTIES PASS_REGULAR_EXPRESSION
208 "Status: 200 OK\rContent-Type: text\/html\r\r<.*>")
209endif()
210if(BUILD_GEMINI_CGI)
211 add_test(NAME gemini_cgi COMMAND nimisewi_gemini.cgi)
212 set_tests_properties(gemini_cgi
213 PROPERTIES PASS_REGULAR_EXPRESSION "20 text\/gemini\r\n.*")
214endif()