all repos — nimisewi_c @ 00981834d98546471e30441979a36dac52a76ecd

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