all repos — nimisewi_c @ 4b3585f934062f1d2928a9a47c5bab64362698f8

simple random toki pona phrase generator

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})
138include(CPack)
139
140# testing
141
142enable_testing()
143
144add_test(NAME runs COMMAND nimisewi)
145
146add_test(NAME version COMMAND nimisewi -v)
147set_tests_properties(version
148  PROPERTIES PASS_REGULAR_EXPRESSION
149  "nimisewi [0-9]\.[0-9]\.[0-9]\n[a-z ]+(\nfeatures:\n([A-Z_]+(\n)?)+)?")
150
151if(BUILD_CGI)
152  add_test(NAME cgi COMMAND nimisewi.cgi)
153  set_tests_properties(cgi
154    PROPERTIES PASS_REGULAR_EXPRESSION
155    "Status: 200 OK\rContent-Type: text\/html\r\r<.*>")
156endif()
157if(BUILD_GEMINI_CGI)
158  add_test(NAME gemini_cgi COMMAND nimisewi_gemini.cgi)
159  set_tests_properties(gemini_cgi
160    PROPERTIES PASS_REGULAR_EXPRESSION "20 text\/gemini\r\n.*")
161endif()