diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index 170d138..e7ca2eb 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -14,7 +14,7 @@ jobs: - name: install meson run: apt-get -yq install meson - name: Install build dependencies - run: apt-get -yq install libusb-1.0-0-dev libspdlog-dev libfmt-dev libpango1.0-dev libcairo2-dev gcovr + run: apt-get -yq install libusb-1.0-0-dev libpango1.0-dev libcairo2-dev gcovr - name: get build environment versions run: | echo "=== Start meson version ===" @@ -32,25 +32,19 @@ jobs: echo "=== Start dependency package version ===" apt-cache policy libpango1.0-dev apt-cache policy libcairo2-dev - apt-cache policy libfmt-dev - apt-cache policy libspdlog-dev apt-cache policy libusb-1.0-0-dev echo "=== End dependency package version ===" - - name: setup builddir - run: meson setup builddir -Db_coverage=true - - name: run unit tests - run: ninja -C builddir test - - name: calculate coverage - run: ninja -C builddir coverage-text + - name: Build ptprnt debug + run: scripts/build.sh debug --coverage --test - name: Coverage report - run: cat ./builddir/meson-logs/coverage.txt - - name: build and test dist package - run: ninja -C builddir dist - - name: upload dist package + run: cat ./builddir-debug/meson-logs/coverage.txt + - name: build and release + run: scripts/build.sh release + - name: upload release binary uses: actions/upload-artifact@v3 with: name: ptprnt - path: ./builddir/meson-dist/* + path: ./builddir/ptprnt if-no-files-found: error - name: upload coverage report uses: actions/upload-artifact@v3 diff --git a/.gitignore b/.gitignore index eb39252..8082033 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # Folder -builddir/ +builddir*/ subprojects/* .cache/ coverageReport/ diff --git a/README.md b/README.md index 8126c1a..acb60d1 100644 --- a/README.md +++ b/README.md @@ -18,17 +18,24 @@ ptprnt --font "NotoMono Nerd Font" --fontsize 32 --text "🖶 ptprnt v0.2.0 🥰 Arch Linux: ```bash -pacman -S libusb spdlog pango cairo meson +pacman -S libusb pango cairo meson ``` Debian/Ubuntu: ```bash -apt-get install libusb-1.0-0-dev libspdlog-dev libfmt-dev libpango1.0-dev libcairo2-dev meson +apt-get install libusb-1.0-0-dev libpango1.0-dev libcairo2-dev meson ``` +Note: spdlog is built as a subproject and statically linked, so it's not required as a system dependency. + **Build and run:** Clone this repository first and enter the directory. Then build: ```bash +# Using the build script (recommended) +./scripts/build.sh release +builddir/ptprnt --help + +# Or manually with meson meson setup builddir ninja -C builddir builddir/ptprnt --help @@ -181,13 +188,43 @@ ptprnt \ This is a modern C++20 rewrite of [ptouch-print](https://git.familie-radermacher.ch/linux/ptouch-print.git). Credits to Dominic Rademacher for reverse engineering the USB protocol. +**Build script:** +```bash +# Release build +./scripts/build.sh release + +# Debug build +./scripts/build.sh debug + +# Debug with tests +./scripts/build.sh debug --test + +# Debug with coverage +./scripts/build.sh debug --coverage + +# Clean all build directories +./scripts/build.sh clean + +# Show all options +./scripts/build.sh --help +``` + **Running tests:** ```bash +# Using build script +./scripts/build.sh --test + +# Or manually ninja -C builddir test ``` **Coverage reports:** ```bash +# Using build script +./scripts/build.sh debug --coverage +./scripts/generate_coverage.sh + +# Or manually meson setup builddir -Db_coverage=true ninja -C builddir ninja -C builddir test diff --git a/meson.build b/meson.build index 15a659b..80c0be0 100644 --- a/meson.build +++ b/meson.build @@ -20,10 +20,16 @@ project( ) usb_dep = dependency('libusb-1.0') -log_dep = dependency('spdlog') -fmt_dep = dependency('fmt') pangocairo_dep = dependency('pangocairo') +# spdlog with std::format (C++20) - static library +spdlog_proj = subproject('spdlog', default_options: ['std_format=enabled', 'default_library=static', 'compile_library=true']) +log_dep = spdlog_proj.get_variable('spdlog_dep') + +if not log_dep.found() + error('spdlog not found, can not proceed') +endif + # CLI11 cli11_proj = subproject('cli11') cli11_dep = cli11_proj.get_variable('CLI11_dep') @@ -50,7 +56,7 @@ ptprnt_exe = executable( 'ptprnt', 'src/main.cpp', install: true, - dependencies: [usb_dep, log_dep, fmt_dep, pangocairo_dep, cli11_dep], + dependencies: [usb_dep, log_dep, pangocairo_dep, cli11_dep], include_directories: incdir, sources: [ptprnt_srcs], cpp_args: cpp_args, diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 0000000..157f169 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,157 @@ +#!/bin/bash + +# Build script for ptprnt - simplifies common build configurations +# Usage: ./scripts/build.sh [release|debug|clean] [options] + +set -e + +SCRIPT_PATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +PROJECT_ROOT="${SCRIPT_PATH}/.." + +# Color output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +print_usage() { + echo "Usage: $0 [build-type] [options]" + echo "" + echo "Build Types:" + echo " release Build optimized release version (default)" + echo " debug Build debug version with symbols" + echo " clean Clean build directories" + echo "" + echo "Options:" + echo " --coverage Enable coverage reporting (debug builds only)" + echo " --reconfigure Force reconfiguration" + echo " --test Run tests after building" + echo " -j N Use N parallel jobs (default: auto)" + echo "" + echo "Examples:" + echo " $0 # Build release" + echo " $0 debug --test # Build debug and run tests" + echo " $0 debug --coverage # Build debug with coverage" + echo " $0 clean # Clean all build directories" +} + +# Default values +BUILD_TYPE="release" +BUILDDIR="builddir" +COVERAGE=false +RECONFIGURE=false +RUN_TESTS=false +JOBS="" + +# Parse arguments +while [[ $# -gt 0 ]]; do + case $1 in + release|debug|clean) + BUILD_TYPE="$1" + shift + ;; + --coverage) + COVERAGE=true + shift + ;; + --reconfigure) + RECONFIGURE=true + shift + ;; + --test) + RUN_TESTS=true + shift + ;; + -j) + JOBS="-j $2" + shift 2 + ;; + -h|--help) + print_usage + exit 0 + ;; + *) + echo -e "${RED}Error: Unknown option: $1${NC}" + print_usage + exit 1 + ;; + esac +done + +cd "${PROJECT_ROOT}" + +# Handle clean +if [[ "${BUILD_TYPE}" == "clean" ]]; then + echo -e "${YELLOW}Cleaning build directories...${NC}" + rm -rf builddir builddir-debug + echo -e "${GREEN}Clean complete!${NC}" + exit 0 +fi + +# Set build directory and options based on build type +if [[ "${BUILD_TYPE}" == "debug" ]]; then + BUILDDIR="builddir-debug" + MESON_OPTS="--buildtype=debug" + + if [[ "${COVERAGE}" == true ]]; then + MESON_OPTS="${MESON_OPTS} -Db_coverage=true" + echo -e "${BLUE}Building debug with coverage enabled${NC}" + else + echo -e "${BLUE}Building debug version${NC}" + fi +else + BUILDDIR="builddir" + MESON_OPTS="--buildtype=release" + + if [[ "${COVERAGE}" == true ]]; then + echo -e "${YELLOW}Warning: Coverage is only supported for debug builds, ignoring --coverage${NC}" + fi + + echo -e "${BLUE}Building release version${NC}" +fi + +# Setup or reconfigure build directory +if [[ ! -d "${BUILDDIR}" ]] || [[ "${RECONFIGURE}" == true ]]; then + if [[ "${RECONFIGURE}" == true ]]; then + echo -e "${YELLOW}Reconfiguring build...${NC}" + meson setup "${BUILDDIR}" ${MESON_OPTS} --wipe --reconfigure + else + echo -e "${YELLOW}Setting up build directory...${NC}" + meson setup "${BUILDDIR}" ${MESON_OPTS} + fi +fi + +# Build +echo -e "${YELLOW}Building...${NC}" +ninja -C "${BUILDDIR}" ${JOBS} + +if [[ $? -eq 0 ]]; then + echo -e "${GREEN}Build successful!${NC}" + echo -e "Binary: ${BUILDDIR}/ptprnt" +else + echo -e "${RED}Build failed!${NC}" + exit 1 +fi + +# Run tests if requested +if [[ "${RUN_TESTS}" == true ]]; then + echo -e "${YELLOW}Running tests...${NC}" + ninja -C "${BUILDDIR}" test + + if [[ $? -eq 0 ]]; then + echo -e "${GREEN}All tests passed!${NC}" + else + echo -e "${RED}Tests failed!${NC}" + exit 1 + fi +fi + +# Show binary info +echo "" +echo -e "${BLUE}Build Information:${NC}" +echo " Build type: ${BUILD_TYPE}" +echo " Build dir: ${BUILDDIR}" +echo " Binary: $(ls -lh ${BUILDDIR}/ptprnt | awk '{print $5, $9}')" +echo "" +echo -e "${GREEN}Done!${NC}" diff --git a/src/PtouchPrint.cpp b/src/PtouchPrint.cpp index f52ae59..24aae23 100644 --- a/src/PtouchPrint.cpp +++ b/src/PtouchPrint.cpp @@ -18,7 +18,8 @@ */ #include "PtouchPrint.hpp" -#include +#include +#include #include #include #include @@ -104,11 +105,11 @@ bool PtouchPrint::handleListDrivers() { auto driverFactory = std::make_unique(); auto drivers = driverFactory->listAllDrivers(); - fmt::print("Available printer drivers:\n"); + std::cout << "Available printer drivers:\n"; for (const auto& driver : drivers) { - fmt::print(" - {}\n", driver); + std::cout << std::format(" - {}\n", driver); } - fmt::print("\nUse with: -p or --printer \n"); + std::cout << "\nUse with: -p or --printer \n"; return true; } diff --git a/src/cli/CliParser.cpp b/src/cli/CliParser.cpp index b4c7342..3885539 100644 --- a/src/cli/CliParser.cpp +++ b/src/cli/CliParser.cpp @@ -19,7 +19,8 @@ #include "CliParser.hpp" -#include +#include +#include namespace ptprnt::cli { @@ -92,7 +93,7 @@ void CliParser::reorderCommandsByArgv(int argc, char** argv) { void CliParser::setupParser() { // Version callback auto printVersion = [this](std::size_t) { - fmt::print("ptprnt version: {}\n", mVersionString); + std::cout << std::format("ptprnt version: {}\n", mVersionString); throw CLI::CallForVersion(); }; diff --git a/src/graphics/Label.cpp b/src/graphics/Label.cpp index 3f68d58..5721eec 100644 --- a/src/graphics/Label.cpp +++ b/src/graphics/Label.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -274,7 +275,7 @@ bool Label::append(const ILabel& other, uint32_t spacingPx) { int newStride = mCairoWrapper->cairo_image_surface_get_stride(newSurface.get()); // Clear the new surface (set to transparent/white) - std::memset(newData, 0x00, newStride * height); + memset(newData, 0x00, newStride * height); // Copy current label data for (int y = 0; y < height; ++y) { diff --git a/subprojects/spdlog.wrap b/subprojects/spdlog.wrap new file mode 100644 index 0000000..9f16f71 --- /dev/null +++ b/subprojects/spdlog.wrap @@ -0,0 +1,13 @@ +[wrap-file] +directory = spdlog-1.15.3 +source_url = https://github.com/gabime/spdlog/archive/refs/tags/v1.15.3.tar.gz +source_filename = spdlog-1.15.3.tar.gz +source_hash = 15a04e69c222eb6c01094b5c7ff8a249b36bb22788d72519646fb85feb267e67 +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/spdlog_1.15.3-5/spdlog-1.15.3.tar.gz +patch_filename = spdlog_1.15.3-5_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/spdlog_1.15.3-5/get_patch +patch_hash = 5e0eaf0002ff589cd8dac58e1b38c297422e7a0404d7d47ff0d2e285ed18169c +wrapdb_version = 1.15.3-5 + +[provide] +dependency_names = spdlog \ No newline at end of file