diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..979d0c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +build +cmake-build-* + +TAGS +tags +core* + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f866d03 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,52 @@ +cmake_minimum_required(VERSION 3.25) +project(sc3dev + VERSION 0.0.1 + LANGUAGES CXX + HOMEPAGE_URL "https://git.wntrmute.dev/sc/sc3dev" + DESCRIPTION "") +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_VERBOSE_MAKEFILES ON) + +find_package(scsl REQUIRED) + +include(CTest) +enable_testing() + +# compile options: +# -Wall Default to all errors. +# -Wextra And a few extra. +# -Werror And require them to be fixed to build. +# -Wno-unused-function This is a library. Not every function is used here. +# -Wno-unused-parameter Some functions have parameters defined for compatibility, +# and aren't used in the implementation. +add_compile_options( + "-static" + "-Wall" + "-Wextra" + "-Werror" + "-Wno-unused-function" + "-Wno-unused-parameter" + "-g" + "$<$:-O2>" +) +if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + add_compile_options("-stdlib=libc++") +else () + # nothing special for gcc at the moment +endif () + +set(HEADERS) +set(SOURCES) + +include_directories(SYSTEM include) + +### THE REAL TARGETS ### + +add_executable(${PROJECT_NAME}-packager src/packager.cc ${SOURCES} ${HEADERS}) +target_link_libraries(${PROJECT_NAME}-packager ${SCSL_LIBRARIES}) + +### INCLUDES ### + +#include(cmake/docs.cmake) +#include(cmake/install.cmake) +#include(cmake/packaging.cmake) diff --git a/Containerfile b/Containerfile index 798c146..25e2957 100644 --- a/Containerfile +++ b/Containerfile @@ -1,9 +1,7 @@ FROM docker.io/library/ubuntu:jammy LABEL maintainer="K. Isom " - ARG DEBIAN_FRONTEND=noninteractive ARG AUTOMATED_MODE=yes -ARG USE_CLANG=yes ENV TZ=America/Los_Angeles # prepare build diff --git a/Containerfile.alpine b/Containerfile.alpine index 0aabcce..1eb3cf4 100644 --- a/Containerfile.alpine +++ b/Containerfile.alpine @@ -1,7 +1,6 @@ FROM docker.io/library/alpine:3.18 LABEL maintainer="K. Isom " ARG AUTOMATED_MODE=yes -ARG USE_CLANG=yes ENV TZ=America/Los_Angeles # prepare build diff --git a/Containerfile.debian b/Containerfile.debian index 23d178b..7529cb3 100644 --- a/Containerfile.debian +++ b/Containerfile.debian @@ -2,7 +2,6 @@ FROM docker.io/library/debian:12.2 LABEL maintainer="K. Isom " ARG DEBIAN_FRONTEND=noninteractive ARG AUTOMATED_MODE=yes -ARG USE_CLANG=yes ENV TZ=America/Los_Angeles # prepare build diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5e54054 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 K. Isom + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index e25dc93..b5733c3 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ used across shimmering clarity projects. systems. - `install-development-tools.sh` installs the tools needed to build and package projects. +- `is-current-tag.sh` determines if the current commit is tagged. - `validate-container.sh` attempts to clone a few repos and build/test them, validating that the image contains the correct tools to build them. diff --git a/cmake/docs.cmake b/cmake/docs.cmake new file mode 100644 index 0000000..10b5ee2 --- /dev/null +++ b/cmake/docs.cmake @@ -0,0 +1,53 @@ +# Doxygen support for scsl. + +set(DISABLE_DOXYGEN OFF CACHE BOOL "Don't use Doxygen for documentation.") +set(DISABLE_SCDOC OFF CACHE BOOL "Don't use scdoc to generate man pages.") +add_custom_target(manpages) + +### Generate man pages from markdown ### + +# md2man uses scdoc to produce a man page from a markdown document. +if (LINUX and not DISABLE_SCDOC) +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/man + DESTINATION share) + +macro(md2man source) + block() + set(SOURCE_MANPAGE) + set(SOURCE_SECTION) + string(REGEX REPLACE "^.+/([^/]+)\.md$" "\\1" SOURCE_MANPAGE ${source}) + string(REGEX REPLACE "^.+/[^/]+\.([0-9])\.md$" "\\1" SOURCE_SECTION ${source}) + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/man/man${SOURCE_SECTION}) + configure_file(${source} ${SOURCE_MANPAGE}.scdoc) + add_custom_command(TARGET manpages + COMMAND scdoc < ${SOURCE_MANPAGE}.scdoc > man/man${SOURCE_SECTION}/${SOURCE_MANPAGE}) + endblock() +endmacro() + +md2man(docs/lib${PROJECT_NAME}.7.md) +endif () + +### Build documentation with Doxygen ### + +if (not DISABLE_DOXYGEN) +find_package(Doxygen) +if (${DOXYGEN_FOUND}) +# prefer scdocs for manpages. +set(DOXYGEN_GENERATE_MAN NO) +set(DOXYGEN_GENERATE_LATEX YES) +set(DOXYGEN_EXTRACT_ALL YES) +set(DOXYGEN_USE_MDFILE_AS_MAINPAGE "docs/mainpage.md") +message(STATUS "Doxygen found, building docs.") + +doxygen_add_docs(${PROJECT_NAME}_docs + ${HEADER_FILES} + ${SOURCE_FILES} + USE_STAMP_FILE) +add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}_docs) +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html + ${CMAKE_CURRENT_BINARY_DIR}/latex + DESTINATION share/doc/${PROJECT_NAME}/doxygen) +add_dependencies(${PROJECT_NAME}_docs manpages) +endif () # DOXYGEN_FOUND? +endif () # DISABLE_DOXYGEN? + diff --git a/cmake/install.cmake b/cmake/install.cmake new file mode 100644 index 0000000..c6e7bc4 --- /dev/null +++ b/cmake/install.cmake @@ -0,0 +1,27 @@ +### Install ### + +include(CMakePackageConfigHelpers) + +### library packaging for CMake and pkgconfig to find built targets. +write_basic_package_version_file( + ${PROJECT_NAME}Config.cmake + VERSION ${PACKAGE_VERSION} + COMPATIBILITY SameMajorVersion +) +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion) +configure_file(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) + +### set up installation targets. + +install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION lib) +install(FILES ${HEADERS} DESTINATION include/${PROJECT_NAME}) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc + DESTINATION lib/pkgconfig) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + DESTINATION share/${PROJECT_CMAKE_CONFIG_NAME}/cmake) + + diff --git a/cmake/packaging.cmake b/cmake/packaging.cmake new file mode 100644 index 0000000..5b20442 --- /dev/null +++ b/cmake/packaging.cmake @@ -0,0 +1,39 @@ +### Packaging ### + +include(InstallRequiredSystemLibraries) + +set(CPACK_PACKAGE_VENDOR "K. Isom") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${PROJECT_DESCRIPTION}) +set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) +set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) +set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) + +set(CPACK_PACKAGE_FILE_NAME + ${PROJECT_NAME}-${PROJECT_VERSION}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_ARCH}${CMAKE_HOST_SYSTEM_PROCESSOR}) + +# Debian settings +set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_VENDOR}) +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${CPACK_PACKAGE_DESCRIPTION}) +set(CPACK_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION}) +set(CPACK_PACKAGE_DEPENDS) +set(CPACK_DEBIAN_PACKAGE_SECTION devel) +set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS ON) +set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) + +if (LINUX) + set(CPACK_GENERATOR "DEB;STGZ;TGZ") +elseif (APPLE) + set(CPACK_GENERATOR "productbuild") +elseif (MSVC OR MSYS OR MINGW) + set(CPACK_GENERATOR "NSIS;ZIP") +else () + set(CPACK_GENERATOR "ZIP") +endif () + +set(CPACK_SOURCE_GENERATOR "TGZ;ZIP") +set(CPACK_SOURCE_IGNORE_FILES + /.git + /.*build.*) + +include (CPack) +add_custom_target(package_docs DEPENDS ${PROJECT_NAME}_docs package package_source) diff --git a/cmake/testing.cmake b/cmake/testing.cmake new file mode 100644 index 0000000..86898e7 --- /dev/null +++ b/cmake/testing.cmake @@ -0,0 +1,13 @@ +### TESTS ### + +set(TEST_SOURCES) # common test source code +macro(generate_test name) + add_executable(test_${name} test_${name}.cc ${TEST_SOURCES} ${ARGN}) + target_link_libraries(${name} ${PROJECT_NAME}) + add_test(${name} ${name}) +endmacro() + +### ADD TESTS HERE ### + +generate_test(${PROJECT_NAME}_test) + diff --git a/is-current-tag.sh b/is-current-tag.sh new file mode 100644 index 0000000..7c1b867 --- /dev/null +++ b/is-current-tag.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env sh + +######################################################################### +# @author : kyle (kyle@imap.cc) # +# @file : is-current-tag.sh # +# @created : Wednesday Oct 18, 2023 18:36:55 PDT # +# # +# @description : determines if the current git commit is a tagged # +# commit. # +# # +# This is used for determining whether this is a current release, and # +# build artifacts should be generated. # +######################################################################### + +if [ ! -z "$(git status -s)" ] +then + echo "[-] work tree is dirty - not proceeding." + exit 0 +fi + +if [ -z "$(git tag --contains $(git rev-parse --verify HEAD))" ] +then + echo "[-] current HEAD isn't tagged." + exit 0 +fi + +# we are in a tagged commit + diff --git a/src/packager.cc b/src/packager.cc new file mode 100644 index 0000000..0c7df62 --- /dev/null +++ b/src/packager.cc @@ -0,0 +1,41 @@ +/// +/// \file packager.cc +/// \author K. Isom +/// \date 2023-10-18 +/// \brief Packaging tools for shimmering-clarity. +/// + +#include +#include + +#include +#include + + +static struct { + scsl::Flags *flags; + std::string owner; + std::string distribution; + std::string component; + std::string password; + std::string username; + std::string version; +} config; + + +int +main(int argc, char *argv[]) +{ + config.flags = new scsl::Flags("sc3dev-packager", "package tooling for shimmering clarity"); + config.flags->Register("--component", "main", "Debian package component"); + config.flags->Register("--distribution", "ubuntu", "Debian package distribution"); + config.flags->Register("--owner", "sc", "package repository owner"); + + auto status = config.flags->Parse(argc, argv); + if (status != scsl::Flags::ParseStatus::OK) { + std::cerr << "failed to parse flags: " + << scsl::Flags::ParseStatusToString(status) + << "\n"; + exit(1); + } +}