all repos — nimisewi_c @ 60d1b0c720c58dc08b070dd9d39d72f93a07b028

simple random toki pona phrase generator

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()