๐ŸŽ€ Toy Gemini Client Written in C99
cli retro gemini gemtext terminal tls lightweight minimal c99 gemini-protocol
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: migrate to cmkr

Fuwn f56035ef 97696859

+377 -54
+1
.gitignore
··· 3 3 4 4 # CMake 5 5 /cmake-build-* 6 + /build/
+125 -2
CMakeLists.txt
··· 1 + # This file is automatically generated from cmake.toml - DO NOT EDIT 2 + # See https://github.com/build-cpp/cmkr for more information 3 + 1 4 cmake_minimum_required(VERSION 3.13.4) 2 - project(viv C) 5 + 6 + if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) 7 + message(FATAL_ERROR "In-tree builds are not supported. Run CMake from a separate directory: cmake -B build") 8 + endif() 9 + 10 + # Regenerate CMakeLists.txt automatically in the root project 11 + set(CMKR_ROOT_PROJECT OFF) 12 + if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) 13 + set(CMKR_ROOT_PROJECT ON) 14 + 15 + # Bootstrap cmkr 16 + include("cmake/cmkr/cmkr.cmake" OPTIONAL RESULT_VARIABLE CMKR_INCLUDE_RESULT) 17 + if(CMKR_INCLUDE_RESULT) 18 + cmkr() 19 + endif() 20 + 21 + # Enable folder support 22 + set_property(GLOBAL PROPERTY USE_FOLDERS ON) 23 + endif() 24 + 25 + # Create a configure-time dependency on cmake.toml to improve IDE support 26 + if(CMKR_ROOT_PROJECT) 27 + configure_file(cmake.toml cmake.toml COPYONLY) 28 + endif() 29 + 30 + project(viv 31 + LANGUAGES 32 + C 33 + VERSION 34 + 0.1.0 35 + ) 36 + 37 + # Packages 38 + find_package(OpenSSL REQUIRED) 39 + 40 + find_package(Curses REQUIRED) 41 + 42 + # Target viv 43 + set(CMKR_TARGET viv) 44 + set(viv_SOURCES "") 45 + 46 + list(APPEND viv_SOURCES 47 + "viv/cli.c" 48 + "viv/dynamic_array.c" 49 + "viv/flag.c" 50 + "viv/gemini.c" 51 + "viv/log.c" 52 + "viv/ssl.c" 53 + "viv/ui.c" 54 + "viv/viv.c" 55 + ) 56 + 57 + list(APPEND viv_SOURCES 58 + cmake.toml 59 + ) 60 + 61 + set(CMKR_SOURCES ${viv_SOURCES}) 62 + add_executable(viv) 63 + 64 + if(viv_SOURCES) 65 + target_sources(viv PRIVATE ${viv_SOURCES}) 66 + endif() 67 + 68 + get_directory_property(CMKR_VS_STARTUP_PROJECT DIRECTORY ${PROJECT_SOURCE_DIR} DEFINITION VS_STARTUP_PROJECT) 69 + if(NOT CMKR_VS_STARTUP_PROJECT) 70 + set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT viv) 71 + endif() 72 + 73 + source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${viv_SOURCES}) 74 + 75 + target_compile_options(viv PRIVATE 76 + -std=c99 77 + -Wall 78 + -Wextra 79 + -Werror=pedantic 80 + -Wno-unused-function 81 + -Wpedantic 82 + -pedantic-errors 83 + -march=native 84 + -D_XOPEN_SOURCE=500 85 + ) 86 + 87 + target_include_directories(viv PRIVATE 88 + "include/" 89 + ) 90 + 91 + if(CURSES_FOUND AND CURSES_HAVE_NCURSES_H) # curses 92 + target_include_directories(viv PRIVATE 93 + ncurses 94 + menu 95 + ) 96 + endif() 97 + 98 + target_link_libraries(viv PRIVATE 99 + OpenSSL::SSL 100 + OpenSSL::Crypto 101 + ) 102 + 103 + if(CURSES_FOUND AND CURSES_HAVE_NCURSES_H) # curses 104 + target_link_libraries(viv PRIVATE 105 + ncurses 106 + menu 107 + ) 108 + endif() 109 + 110 + target_link_options(viv PRIVATE 111 + -fsanitize=address 112 + ) 113 + 114 + set_target_properties(viv PROPERTIES 115 + CMAKE_C_STANDARD_REQUIRED 116 + ON 117 + CMAKE_C_STANDARD 118 + 99 119 + CMAKE_C_EXTENSIONS 120 + OFF 121 + CURSES_NEED_NCURSES 122 + ON 123 + ) 124 + 125 + unset(CMKR_TARGET) 126 + unset(CMKR_SOURCES) 3 127 4 - add_subdirectory(${PROJECT_NAME})
+29
cmake.toml
··· 1 + # Reference: https://build-cpp.github.io/cmkr/cmake-toml 2 + 3 + [cmake] 4 + version = "3.13.4" 5 + cmkr-include = "cmake/cmkr/cmkr.cmake" 6 + 7 + [project] 8 + name = "viv" 9 + version = "0.1.0" 10 + description = "" 11 + languages = ["C"] 12 + 13 + [conditions] 14 + curses = "CURSES_FOUND AND CURSES_HAVE_NCURSES_H" 15 + 16 + [find-package] 17 + OpenSSL = { required = true } 18 + Curses = { required = true } 19 + 20 + [target.viv] 21 + type = "executable" 22 + sources = ["viv/*.c"] 23 + private-include-directories = ["include/"] 24 + properties = { CMAKE_C_STANDARD_REQUIRED = true, CMAKE_C_STANDARD = "99", CMAKE_C_EXTENSIONS = false, CURSES_NEED_NCURSES = true } 25 + compile-options = ["-std=c99", "-Wall", "-Wextra", "-Werror=pedantic", "-Wno-unused-function", "-Wpedantic", "-pedantic-errors", "-march=native", "-D_XOPEN_SOURCE=500"] # -03, -fsanitize=address 26 + link-options = ["-fsanitize=address"] 27 + link-libraries = ["OpenSSL::SSL", "OpenSSL::Crypto"] 28 + curses.private-include-directories = ["ncurses", "menu"] 29 + curses.private-link-libraries = ["ncurses", "menu"]
+222
cmake/cmkr/cmkr.cmake
··· 1 + include_guard() 2 + 3 + # Change these defaults to point to your infrastructure if desired 4 + set(CMKR_REPO "https://github.com/build-cpp/cmkr" CACHE STRING "cmkr git repository" FORCE) 5 + set(CMKR_TAG "v0.2.7" CACHE STRING "cmkr git tag (this needs to be available forever)" FORCE) 6 + 7 + # To bootstrap/generate a cmkr project: cmake -P cmkr.cmake 8 + if(CMAKE_SCRIPT_MODE_FILE) 9 + set(CMAKE_BINARY_DIR "${CMAKE_BINARY_DIR}/build") 10 + set(CMAKE_CURRENT_BINARY_DIR "${CMAKE_BINARY_DIR}") 11 + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}") 12 + endif() 13 + 14 + # Set these from the command line to customize for development/debugging purposes 15 + set(CMKR_EXECUTABLE "" CACHE FILEPATH "cmkr executable") 16 + set(CMKR_SKIP_GENERATION OFF CACHE BOOL "skip automatic cmkr generation") 17 + set(CMKR_BUILD_TYPE "Debug" CACHE STRING "cmkr build configuration") 18 + 19 + # Disable cmkr if generation is disabled 20 + if(DEFINED ENV{CI} OR CMKR_SKIP_GENERATION OR CMKR_BUILD_SKIP_GENERATION) 21 + message(STATUS "[cmkr] Skipping automatic cmkr generation") 22 + unset(CMKR_BUILD_SKIP_GENERATION CACHE) 23 + macro(cmkr) 24 + endmacro() 25 + return() 26 + endif() 27 + 28 + # Disable cmkr if no cmake.toml file is found 29 + if(NOT CMAKE_SCRIPT_MODE_FILE AND NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake.toml") 30 + message(AUTHOR_WARNING "[cmkr] Not found: ${CMAKE_CURRENT_SOURCE_DIR}/cmake.toml") 31 + macro(cmkr) 32 + endmacro() 33 + return() 34 + endif() 35 + 36 + # Convert a Windows native path to CMake path 37 + if(CMKR_EXECUTABLE MATCHES "\\\\") 38 + string(REPLACE "\\" "/" CMKR_EXECUTABLE_CMAKE "${CMKR_EXECUTABLE}") 39 + set(CMKR_EXECUTABLE "${CMKR_EXECUTABLE_CMAKE}" CACHE FILEPATH "" FORCE) 40 + unset(CMKR_EXECUTABLE_CMAKE) 41 + endif() 42 + 43 + # Helper macro to execute a process (COMMAND_ERROR_IS_FATAL ANY is 3.19 and higher) 44 + function(cmkr_exec) 45 + execute_process(COMMAND ${ARGV} RESULT_VARIABLE CMKR_EXEC_RESULT) 46 + if(NOT CMKR_EXEC_RESULT EQUAL 0) 47 + message(FATAL_ERROR "cmkr_exec(${ARGV}) failed (exit code ${CMKR_EXEC_RESULT})") 48 + endif() 49 + endfunction() 50 + 51 + # Windows-specific hack (CMAKE_EXECUTABLE_PREFIX is not set at the moment) 52 + if(WIN32) 53 + set(CMKR_EXECUTABLE_NAME "cmkr.exe") 54 + else() 55 + set(CMKR_EXECUTABLE_NAME "cmkr") 56 + endif() 57 + 58 + # Use cached cmkr if found 59 + if(DEFINED ENV{CMKR_CACHE} AND EXISTS "$ENV{CMKR_CACHE}") 60 + set(CMKR_DIRECTORY_PREFIX "$ENV{CMKR_CACHE}") 61 + string(REPLACE "\\" "/" CMKR_DIRECTORY_PREFIX "${CMKR_DIRECTORY_PREFIX}") 62 + if(NOT CMKR_DIRECTORY_PREFIX MATCHES "\\/$") 63 + set(CMKR_DIRECTORY_PREFIX "${CMKR_DIRECTORY_PREFIX}/") 64 + endif() 65 + else() 66 + set(CMKR_DIRECTORY_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/_cmkr_") 67 + endif() 68 + set(CMKR_DIRECTORY "${CMKR_DIRECTORY_PREFIX}${CMKR_TAG}") 69 + set(CMKR_CACHED_EXECUTABLE "${CMKR_DIRECTORY}/bin/${CMKR_EXECUTABLE_NAME}") 70 + 71 + # Handle upgrading logic 72 + if(CMKR_EXECUTABLE AND NOT CMKR_CACHED_EXECUTABLE STREQUAL CMKR_EXECUTABLE) 73 + if(CMKR_EXECUTABLE MATCHES "^${CMAKE_CURRENT_BINARY_DIR}/_cmkr") 74 + if(DEFINED ENV{CMKR_CACHE} AND EXISTS "$ENV{CMKR_CACHE}") 75 + message(AUTHOR_WARNING "[cmkr] Switching to cached cmkr: '${CMKR_CACHED_EXECUTABLE}'") 76 + if(EXISTS "${CMKR_CACHED_EXECUTABLE}") 77 + set(CMKR_EXECUTABLE "${CMKR_CACHED_EXECUTABLE}" CACHE FILEPATH "Full path to cmkr executable" FORCE) 78 + else() 79 + unset(CMKR_EXECUTABLE CACHE) 80 + endif() 81 + else() 82 + message(AUTHOR_WARNING "[cmkr] Upgrading '${CMKR_EXECUTABLE}' to '${CMKR_CACHED_EXECUTABLE}'") 83 + unset(CMKR_EXECUTABLE CACHE) 84 + endif() 85 + elseif(DEFINED ENV{CMKR_CACHE} AND EXISTS "$ENV{CMKR_CACHE}" AND CMKR_EXECUTABLE MATCHES "^${CMKR_DIRECTORY_PREFIX}") 86 + message(AUTHOR_WARNING "[cmkr] Upgrading cached '${CMKR_EXECUTABLE}' to '${CMKR_CACHED_EXECUTABLE}'") 87 + unset(CMKR_EXECUTABLE CACHE) 88 + endif() 89 + endif() 90 + 91 + if(CMKR_EXECUTABLE AND EXISTS "${CMKR_EXECUTABLE}") 92 + message(VERBOSE "[cmkr] Found cmkr: '${CMKR_EXECUTABLE}'") 93 + elseif(CMKR_EXECUTABLE AND NOT CMKR_EXECUTABLE STREQUAL CMKR_CACHED_EXECUTABLE) 94 + message(FATAL_ERROR "[cmkr] '${CMKR_EXECUTABLE}' not found") 95 + elseif(NOT CMKR_EXECUTABLE AND EXISTS "${CMKR_CACHED_EXECUTABLE}") 96 + set(CMKR_EXECUTABLE "${CMKR_CACHED_EXECUTABLE}" CACHE FILEPATH "Full path to cmkr executable" FORCE) 97 + message(STATUS "[cmkr] Found cached cmkr: '${CMKR_EXECUTABLE}'") 98 + else() 99 + set(CMKR_EXECUTABLE "${CMKR_CACHED_EXECUTABLE}" CACHE FILEPATH "Full path to cmkr executable" FORCE) 100 + message(VERBOSE "[cmkr] Bootstrapping '${CMKR_EXECUTABLE}'") 101 + 102 + message(STATUS "[cmkr] Fetching cmkr...") 103 + if(EXISTS "${CMKR_DIRECTORY}") 104 + cmkr_exec("${CMAKE_COMMAND}" -E rm -rf "${CMKR_DIRECTORY}") 105 + endif() 106 + find_package(Git QUIET REQUIRED) 107 + cmkr_exec("${GIT_EXECUTABLE}" 108 + clone 109 + --config advice.detachedHead=false 110 + --branch ${CMKR_TAG} 111 + --depth 1 112 + ${CMKR_REPO} 113 + "${CMKR_DIRECTORY}" 114 + ) 115 + message(STATUS "[cmkr] Building cmkr (using system compiler)...") 116 + cmkr_exec("${CMAKE_COMMAND}" 117 + --no-warn-unused-cli 118 + "${CMKR_DIRECTORY}" 119 + "-B${CMKR_DIRECTORY}/build" 120 + "-DCMAKE_BUILD_TYPE=${CMKR_BUILD_TYPE}" 121 + "-DCMAKE_UNITY_BUILD=ON" 122 + "-DCMAKE_INSTALL_PREFIX=${CMKR_DIRECTORY}" 123 + "-DCMKR_GENERATE_DOCUMENTATION=OFF" 124 + ) 125 + cmkr_exec("${CMAKE_COMMAND}" 126 + --build "${CMKR_DIRECTORY}/build" 127 + --config "${CMKR_BUILD_TYPE}" 128 + --parallel 129 + ) 130 + cmkr_exec("${CMAKE_COMMAND}" 131 + --install "${CMKR_DIRECTORY}/build" 132 + --config "${CMKR_BUILD_TYPE}" 133 + --prefix "${CMKR_DIRECTORY}" 134 + --component cmkr 135 + ) 136 + if(NOT EXISTS ${CMKR_EXECUTABLE}) 137 + message(FATAL_ERROR "[cmkr] Failed to bootstrap '${CMKR_EXECUTABLE}'") 138 + endif() 139 + cmkr_exec("${CMKR_EXECUTABLE}" version) 140 + message(STATUS "[cmkr] Bootstrapped ${CMKR_EXECUTABLE}") 141 + endif() 142 + execute_process(COMMAND "${CMKR_EXECUTABLE}" version 143 + RESULT_VARIABLE CMKR_EXEC_RESULT 144 + ) 145 + if(NOT CMKR_EXEC_RESULT EQUAL 0) 146 + message(FATAL_ERROR "[cmkr] Failed to get version, try clearing the cache and rebuilding") 147 + endif() 148 + 149 + # Use cmkr.cmake as a script 150 + if(CMAKE_SCRIPT_MODE_FILE) 151 + if(NOT EXISTS "${CMAKE_SOURCE_DIR}/cmake.toml") 152 + execute_process(COMMAND "${CMKR_EXECUTABLE}" init 153 + RESULT_VARIABLE CMKR_EXEC_RESULT 154 + ) 155 + if(NOT CMKR_EXEC_RESULT EQUAL 0) 156 + message(FATAL_ERROR "[cmkr] Failed to bootstrap cmkr project. Please report an issue: https://github.com/build-cpp/cmkr/issues/new") 157 + else() 158 + message(STATUS "[cmkr] Modify cmake.toml and then configure using: cmake -B build") 159 + endif() 160 + else() 161 + execute_process(COMMAND "${CMKR_EXECUTABLE}" gen 162 + RESULT_VARIABLE CMKR_EXEC_RESULT 163 + ) 164 + if(NOT CMKR_EXEC_RESULT EQUAL 0) 165 + message(FATAL_ERROR "[cmkr] Failed to generate project.") 166 + else() 167 + message(STATUS "[cmkr] Configure using: cmake -B build") 168 + endif() 169 + endif() 170 + endif() 171 + 172 + # This is the macro that contains black magic 173 + macro(cmkr) 174 + # When this macro is called from the generated file, fake some internal CMake variables 175 + get_source_file_property(CMKR_CURRENT_LIST_FILE "${CMAKE_CURRENT_LIST_FILE}" CMKR_CURRENT_LIST_FILE) 176 + if(CMKR_CURRENT_LIST_FILE) 177 + set(CMAKE_CURRENT_LIST_FILE "${CMKR_CURRENT_LIST_FILE}") 178 + get_filename_component(CMAKE_CURRENT_LIST_DIR "${CMAKE_CURRENT_LIST_FILE}" DIRECTORY) 179 + endif() 180 + 181 + # File-based include guard (include_guard is not documented to work) 182 + get_source_file_property(CMKR_INCLUDE_GUARD "${CMAKE_CURRENT_LIST_FILE}" CMKR_INCLUDE_GUARD) 183 + if(NOT CMKR_INCLUDE_GUARD) 184 + set_source_files_properties("${CMAKE_CURRENT_LIST_FILE}" PROPERTIES CMKR_INCLUDE_GUARD TRUE) 185 + 186 + file(SHA256 "${CMAKE_CURRENT_LIST_FILE}" CMKR_LIST_FILE_SHA256_PRE) 187 + 188 + # Generate CMakeLists.txt 189 + cmkr_exec("${CMKR_EXECUTABLE}" gen 190 + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" 191 + ) 192 + 193 + file(SHA256 "${CMAKE_CURRENT_LIST_FILE}" CMKR_LIST_FILE_SHA256_POST) 194 + 195 + # Delete the temporary file if it was left for some reason 196 + set(CMKR_TEMP_FILE "${CMAKE_CURRENT_SOURCE_DIR}/CMakerLists.txt") 197 + if(EXISTS "${CMKR_TEMP_FILE}") 198 + file(REMOVE "${CMKR_TEMP_FILE}") 199 + endif() 200 + 201 + if(NOT CMKR_LIST_FILE_SHA256_PRE STREQUAL CMKR_LIST_FILE_SHA256_POST) 202 + # Copy the now-generated CMakeLists.txt to CMakerLists.txt 203 + # This is done because you cannot include() a file you are currently in 204 + configure_file(CMakeLists.txt "${CMKR_TEMP_FILE}" COPYONLY) 205 + 206 + # Add the macro required for the hack at the start of the cmkr macro 207 + set_source_files_properties("${CMKR_TEMP_FILE}" PROPERTIES 208 + CMKR_CURRENT_LIST_FILE "${CMAKE_CURRENT_LIST_FILE}" 209 + ) 210 + 211 + # 'Execute' the newly-generated CMakeLists.txt 212 + include("${CMKR_TEMP_FILE}") 213 + 214 + # Delete the generated file 215 + file(REMOVE "${CMKR_TEMP_FILE}") 216 + 217 + # Do not execute the rest of the original CMakeLists.txt 218 + return() 219 + endif() 220 + # Resume executing the unmodified CMakeLists.txt 221 + endif() 222 + endmacro()
-52
viv/CMakeLists.txt
··· 1 - add_executable(${PROJECT_NAME} 2 - cli.c 3 - dynamic_array.c 4 - gemini.c 5 - flag.c 6 - log.c 7 - ssl.c 8 - ui.c 9 - viv.c 10 - ) 11 - 12 - target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/include) 13 - 14 - set_target_properties(${PROJECT_NAME} PROPERTIES 15 - CMAKE_C_STANDARD_REQUIRED ON 16 - CMAKE_C_STANDARD 99 17 - CMAKE_C_EXTENSIONS OFF 18 - ) 19 - 20 - target_compile_options(${PROJECT_NAME} PUBLIC 21 - -std=c99 22 - -Wall 23 - -Wextra 24 - -Werror=pedantic 25 - -Wno-unused-function 26 - -Wpedantic 27 - -pedantic-errors 28 - -march=native 29 - # -03 30 - -D_XOPEN_SOURCE=500 31 - # -fsanitize=address 32 - ) 33 - # target_link_options(${PROJECT_NAME} PUBLIC -fsanitize=address) 34 - 35 - find_package(OpenSSL REQUIRED) 36 - target_link_libraries(${PROJECT_NAME} PRIVATE 37 - OpenSSL::SSL 38 - OpenSSL::Crypto 39 - ) 40 - 41 - set(CURSES_NEED_NCURSES ON) 42 - find_package(Curses REQUIRED) 43 - if (CURSES_FOUND AND CURSES_HAVE_NCURSES_H) 44 - target_include_directories(${PROJECT_NAME} PRIVATE 45 - ncurses 46 - menu 47 - ) 48 - target_link_libraries(${PROJECT_NAME} PRIVATE 49 - ncurses 50 - menu 51 - ) 52 - endif ()