CMakeLists.txt (view raw)
1cmake_minimum_required(VERSION 3.10)
2
3project(nimisewi
4 VERSION 0.2.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
27# check libraries
28
29cmake_host_system_information(RESULT OS_NAME QUERY OS_NAME)
30message(VERBOSE "OS_NAME is ${OS_NAME}")
31if(OS_NAME MATCHES "Linux")
32 check_include_file("bsd/string.h" HAVE_BSD_STRING_H)
33 if(HAVE_BSD_STRING_H)
34 set(CMAKE_REQUIRED_LIBRARIES "bsd")
35 check_symbol_exists(strlcat "bsd/string.h" HAVE_STRLCAT)
36 if (HAVE_STRLCAT)
37 list(APPEND EXTRA_DEFINITIONS HAVE_BSD_STRING_H HAVE_STRLCAT)
38 endif()
39 set(CMAKE_REQUIRED_LINK_OPTIONS "-static")
40 check_c_source_compiles(
41 "#include<bsd/string.h>\nint main(void){return 0;}" HAVE_LIBBSD_STATIC)
42 if(NOT HAVE_LIBBSD_STATIC)
43 message(WARNING "static build won't work here")
44 endif()
45 list(APPEND EXTRA_LIBS bsd)
46 unset(CMAKE_REQUIRED_LIBRARIES)
47 unset(CMAKE_REQUIRED_LINK_OPTIONS)
48 endif()
49endif()
50if(OS_NAME MATCHES "(.*BSD)|(DragonFly)")
51 check_symbol_exists(strlcat "string.h" HAVE_STRLCAT)
52 if(HAVE_STRLCAT)
53 list(APPEND EXTRA_DEFINITIONS HAVE_STRLCAT)
54 endif()
55 check_symbol_exists(pledge "unistd.h" HAVE_PLEDGE)
56 if(HAVE_PLEDGE)
57 list(APPEND EXTRA_DEFINITIONS HAVE_PLEDGE)
58 endif()
59endif()
60
61set(CMAKE_REQUIRED_LINK_OPTIONS "-static")
62check_c_source_compiles(
63 "#include<stdio.h>\nint main(void){return 0;}" HAVE_LIBC_STATIC
64 )
65if(NOT HAVE_LIBC_STATIC)
66 message(WARNING "static build won't work here")
67endif()
68
69target_link_libraries(nimisewi PUBLIC ${EXTRA_LIBS})
70target_compile_definitions(nimisewi PRIVATE ${EXTRA_DEFINITIONS})
71
72set(NIMISEWI_CGI_STATIC_BUILD FALSE)
73if(HAVE_LIBC_STATIC)
74 if(HAVE_BSD_STRING_H)
75 if(HAVE_LIBBSD_STATIC)
76 set(NIMISEWI_CGI_STATIC_BUILD TRUE)
77 endif()
78 else()
79 set(NIMISEWI_CGI_STATIC_BUILD TRUE)
80 endif()
81endif()
82
83# optional binaries
84
85option(BUILD_CGI "build cgi version of nimisewi" OFF)
86if(BUILD_CGI)
87 add_executable(nimisewi.cgi cgi.c nimisewi.c
88 ${PROJECT_BINARY_DIR}/nimitoki.c)
89 option(CGI_INSTALL_DIR "specify installation directory of cgi script")
90 if(CGI_INSTALL_DIR)
91 set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR ${CGI_INSTALL_DIR})
92 else()
93 set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR "var/www/htdocs/cgi-bin")
94 endif()
95 target_include_directories(nimisewi.cgi PUBLIC "${PROJECT_BINARY_DIR}")
96 target_compile_definitions(nimisewi.cgi PRIVATE ${EXTRA_DEFINITIONS})
97 target_link_libraries(nimisewi.cgi PUBLIC ${EXTRA_LIBS})
98 if(NIMISEWI_CGI_STATIC_BUILD)
99 target_link_options(nimisewi.cgi PUBLIC -static)
100 endif()
101endif()
102
103option(BUILD_GEMINI_CGI "build cgi version of nimisewi for gemini protocol" OFF)
104if(BUILD_GEMINI_CGI)
105 add_executable(nimisewi_gemini.cgi cgi_gemini.c nimisewi.c
106 ${PROJECT_BINARY_DIR}/nimitoki.c)
107 option(GEMINI_CGI_INSTALL_DIR "specify installation directory of cgi script")
108 if(GEMINI_CGI_INSTALL_DIR)
109 set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR ${GEMINI_CGI_INSTALL_DIR})
110 else()
111 set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR "var/gemini/cgi-bin")
112 endif()
113 target_include_directories(nimisewi_gemini.cgi PUBLIC "${PROJECT_BINARY_DIR}")
114 target_compile_definitions(nimisewi_gemini.cgi PRIVATE ${EXTRA_DEFINITIONS})
115 target_link_libraries(nimisewi_gemini.cgi PUBLIC ${EXTRA_LIBS})
116 if(NIMISEWI_CGI_STATIC_BUILD)
117 target_link_options(nimisewi_gemini.cgi PUBLIC -static)
118 endif()
119endif()
120
121# installation
122
123install(TARGETS nimisewi DESTINATION bin)
124if(BUILD_CGI)
125 install(TARGETS nimisewi.cgi
126 DESTINATION $<TARGET_PROPERTY:nimisewi.cgi,CGI_INSTALL_DIR>)
127endif()
128if(BUILD_GEMINI_CGI)
129 install(TARGETS nimisewi_gemini.cgi
130 DESTINATION $<TARGET_PROPERTY:nimisewi_gemini.cgi,GEMINI_CGI_INSTALL_DIR>)
131endif()
132
133include(InstallRequiredSystemLibraries)
134set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
135set(CPACK_PROJECT_VERSION_MAJOR ${nimisewi_VERSION_MAJOR})
136set(CPACK_PROJECT_VERSION_MINOR ${nimisewi_VERSION_MINOR})
137set(CPACK_PROJECT_VERSION_PATCH ${nimisewi_VERSION_PATCH})
138set(CPACK_PACKAGE_FILE_NAME
139 ${CMAKE_PROJECT_NAME}-${nimisewi_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR})
140set(CPACK_GENERATOR "TGZ" "ZIP")
141set(CPACK_SOURCE_GENERATOR "TGZ" "ZIP")
142set(CPACK_SOURCE_IGNORE_FILES
143 \.fslckout
144 \.fossil-settings
145 build/
146 )
147set(CPACK_STRIP_FILES TRUE)
148include(CPack)
149
150# testing
151
152enable_testing()
153
154add_test(NAME runs COMMAND nimisewi)
155
156add_test(NAME version COMMAND nimisewi -v)
157set_tests_properties(version
158 PROPERTIES PASS_REGULAR_EXPRESSION
159 "nimisewi [0-9]\.[0-9]\.[0-9]\n[a-z ]+(\nfeatures:\n([A-Z_]+(\n)?)+)?")
160
161if(BUILD_CGI)
162 add_test(NAME cgi COMMAND nimisewi.cgi)
163 set_tests_properties(cgi
164 PROPERTIES PASS_REGULAR_EXPRESSION
165 "Status: 200 OK\rContent-Type: text\/html\r\r<.*>")
166endif()
167if(BUILD_GEMINI_CGI)
168 add_test(NAME gemini_cgi COMMAND nimisewi_gemini.cgi)
169 set_tests_properties(gemini_cgi
170 PROPERTIES PASS_REGULAR_EXPRESSION "20 text\/gemini\r\n.*")
171endif()