cmake_minimum_required(VERSION 3.10) project(nimisewi VERSION 0.2.0 DESCRIPTION "small program that generates random toki pona noun phrase" HOMEPAGE_URL "https://fsl.aaoth.xyz/nimisewi.c/home") configure_file(config.h.in config.h) add_executable(nimisewi main.c nimisewi.c ${PROJECT_BINARY_DIR}/nimitoki.c) target_include_directories(nimisewi PUBLIC "${PROJECT_BINARY_DIR}") add_executable(makenimitoki makenimitoki.c) target_include_directories(makenimitoki PUBLIC "${PROJECT_BINARY_DIR}") add_custom_command( OUTPUT ${PROJECT_BINARY_DIR}/nimitoki.c ${PROJECT_BINARY_DIR}/nimitoki.h COMMAND makenimitoki ${PROJECT_SOURCE_DIR}/nimitoki.txt DEPENDS makenimitoki) include(CheckIncludeFile) include(CheckSymbolExists) include(CheckCSourceCompiles) # check libraries cmake_host_system_information(RESULT OS_NAME QUERY OS_NAME) message(VERBOSE "OS_NAME is ${OS_NAME}") if(OS_NAME MATCHES "Linux") check_include_file("bsd/string.h" HAVE_BSD_STRING_H) if(HAVE_BSD_STRING_H) set(CMAKE_REQUIRED_LIBRARIES "bsd") check_symbol_exists(strlcat "bsd/string.h" HAVE_STRLCAT) if (HAVE_STRLCAT) list(APPEND EXTRA_DEFINITIONS HAVE_BSD_STRING_H HAVE_STRLCAT) endif() set(CMAKE_REQUIRED_LINK_OPTIONS "-static") check_c_source_compiles( "#include\nint main(void){return 0;}" HAVE_LIBBSD_STATIC) if(NOT HAVE_LIBBSD_STATIC) message(WARNING "static build won't work here") endif() list(APPEND EXTRA_LIBS bsd) unset(CMAKE_REQUIRED_LIBRARIES) unset(CMAKE_REQUIRED_LINK_OPTIONS) endif() endif() if(OS_NAME MATCHES "(.*BSD)|(DragonFly)") check_symbol_exists(strlcat "string.h" HAVE_STRLCAT) if(HAVE_STRLCAT) list(APPEND EXTRA_DEFINITIONS HAVE_STRLCAT) endif() check_symbol_exists(pledge "unistd.h" HAVE_PLEDGE) if(HAVE_PLEDGE) list(APPEND EXTRA_DEFINITIONS HAVE_PLEDGE) endif() endif() set(CMAKE_REQUIRED_LINK_OPTIONS "-static") check_c_source_compiles( "#include\nint main(void){return 0;}" HAVE_LIBC_STATIC ) if(NOT HAVE_LIBC_STATIC) message(WARNING "static build won't work here") endif() target_link_libraries(nimisewi PUBLIC ${EXTRA_LIBS}) target_compile_definitions(nimisewi PRIVATE ${EXTRA_DEFINITIONS}) set(NIMISEWI_CGI_STATIC_BUILD FALSE) if(HAVE_LIBC_STATIC) if(HAVE_BSD_STRING_H) if(HAVE_LIBBSD_STATIC) set(NIMISEWI_CGI_STATIC_BUILD TRUE) endif() else() set(NIMISEWI_CGI_STATIC_BUILD TRUE) endif() endif() # optional binaries option(BUILD_CGI "build cgi version of nimisewi" OFF) if(BUILD_CGI) add_executable(nimisewi.cgi cgi.c nimisewi.c ${PROJECT_BINARY_DIR}/nimitoki.c) option(CGI_INSTALL_DIR "specify installation directory of cgi script") if(CGI_INSTALL_DIR) set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR ${CGI_INSTALL_DIR}) else() set_property(TARGET nimisewi.cgi PROPERTY CGI_INSTALL_DIR "var/www/htdocs/cgi-bin") endif() target_include_directories(nimisewi.cgi PUBLIC "${PROJECT_BINARY_DIR}") target_compile_definitions(nimisewi.cgi PRIVATE ${EXTRA_DEFINITIONS}) target_link_libraries(nimisewi.cgi PUBLIC ${EXTRA_LIBS}) if(NIMISEWI_CGI_STATIC_BUILD) target_link_options(nimisewi.cgi PUBLIC -static) endif() endif() option(BUILD_GEMINI_CGI "build cgi version of nimisewi for gemini protocol" OFF) if(BUILD_GEMINI_CGI) add_executable(nimisewi_gemini.cgi cgi_gemini.c nimisewi.c ${PROJECT_BINARY_DIR}/nimitoki.c) option(GEMINI_CGI_INSTALL_DIR "specify installation directory of cgi script") if(GEMINI_CGI_INSTALL_DIR) set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR ${GEMINI_CGI_INSTALL_DIR}) else() set_property(TARGET nimisewi_gemini.cgi PROPERTY GEMINI_CGI_INSTALL_DIR "var/gemini/cgi-bin") endif() target_include_directories(nimisewi_gemini.cgi PUBLIC "${PROJECT_BINARY_DIR}") target_compile_definitions(nimisewi_gemini.cgi PRIVATE ${EXTRA_DEFINITIONS}) target_link_libraries(nimisewi_gemini.cgi PUBLIC ${EXTRA_LIBS}) if(NIMISEWI_CGI_STATIC_BUILD) target_link_options(nimisewi_gemini.cgi PUBLIC -static) endif() endif() # installation install(TARGETS nimisewi DESTINATION bin) if(BUILD_CGI) install(TARGETS nimisewi.cgi DESTINATION $) endif() if(BUILD_GEMINI_CGI) install(TARGETS nimisewi_gemini.cgi DESTINATION $) endif() include(InstallRequiredSystemLibraries) set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") set(CPACK_PROJECT_VERSION_MAJOR ${nimisewi_VERSION_MAJOR}) set(CPACK_PROJECT_VERSION_MINOR ${nimisewi_VERSION_MINOR}) set(CPACK_PROJECT_VERSION_PATCH ${nimisewi_VERSION_PATCH}) include(CPack) # testing enable_testing() add_test(NAME runs COMMAND nimisewi) add_test(NAME version COMMAND nimisewi -v) set_tests_properties(version PROPERTIES PASS_REGULAR_EXPRESSION "nimisewi [0-9]\.[0-9]\.[0-9]\n[a-z ]+(\nfeatures:\n([A-Z_]+(\n)?)+)?") if(BUILD_CGI) add_test(NAME cgi COMMAND nimisewi.cgi) set_tests_properties(cgi PROPERTIES PASS_REGULAR_EXPRESSION "Status: 200 OK\rContent-Type: text\/html\r\r<.*>") endif() if(BUILD_GEMINI_CGI) add_test(NAME gemini_cgi COMMAND nimisewi_gemini.cgi) set_tests_properties(gemini_cgi PROPERTIES PASS_REGULAR_EXPRESSION "20 text\/gemini\r\n.*") endif()