From 716753ea21ef9fe56469be1072c2963951b754a4 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 17:45:34 +1000 Subject: [PATCH 01/30] .gitattributes --- .gitattributes | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..e6605d1 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,17 @@ +*.c linguist-language=C +*.cmake linguist-language=CMake +*.cmd linguist-detectable=false +*.cpp linguist-language=C++ +*.cxx linguist-language=C++ +*.dsp linguist-detectable=false +*.dsw linguist-detectable=false +*.h linguist-language=C +*.hpp linguist-language=C++ +*.html linguist-detectable=false +*.hxx linguist-language=C++ +*.sh linguist-detectable=false +*.sln linguist-detectable=false +*.vcxproj linguist-detectable=false +*.vimrc linguist-detectable=false +CMakeLists.txt linguist-language=CMake +makefile linguist-detectable=false From 0694f5ff19baffc1a5e5d105032163b257f15f14 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 17:47:01 +1000 Subject: [PATCH 02/30] .vimrc --- .vimrc | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 .vimrc diff --git a/.vimrc b/.vimrc new file mode 100644 index 0000000..1bf33a0 --- /dev/null +++ b/.vimrc @@ -0,0 +1,70 @@ +" Synesis C/C++ project .vimrc — aligned with .sis/.vscode/c_cxx/settings.json + +set nocompatible +filetype indent plugin on +syntax enable +set autoindent +set backspace=indent,eol,start +set hlsearch +set incsearch +set number + +" files.insertFinalNewline +set eol +set fixeol + +" editor.renderWhitespace: all +set list +set listchars=tab:->,trail:-,extends:>,precedes:<,nbsp:+ + +" editor.detectIndentation: false — global defaults (editor.tabSize: 4, insertSpaces: true) +set colorcolumn=76 +set expandtab +set shiftwidth=4 +set softtabstop=4 +set tabstop=4 + +" colorcolumn draws a full-column tint in Vim (not a VS Code-style 1px line). +" Keep it subtle via the ColorColumn highlight group; reapply after colorscheme changes. +if has('termguicolors') + " set termguicolors +endif + +function! s:ConfigureColorColumn() abort + highlight ColorColumn ctermbg=236 guibg=#2a2a2a cterm=NONE gui=NONE +endfunction + +call s:ConfigureColorColumn() +autocmd ColorScheme * call s:ConfigureColorColumn() + +" files.trimTrailingWhitespace +autocmd BufWritePre * %s/\s\+$//e + +augroup sis_c_cxx + autocmd! + + " [c] / [cpp] + autocmd FileType c,cpp setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,64,68,72,76 + + " [rust] + autocmd FileType rs setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=76 + + " [cmake] + autocmd FileType cmake setlocal noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 + + " [shellscript] + autocmd FileType sh,bash,zsh setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2 colorcolumn=60,76 + + " [bat] + autocmd FileType bat,dosbatch setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,76 + + " [json] / [markdown] / [yaml] / [ruby] + autocmd FileType json,markdown,yaml,ruby setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2 + + " [python] + autocmd FileType python setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,76 + + " [toml] + autocmd FileType toml setlocal noexpandtab tabstop=2 shiftwidth=2 softtabstop=2 +augroup END + From e2f89f23261b2b39141a185ccf397e0f59e48480 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 17:50:22 +1000 Subject: [PATCH 03/30] chore: VS Code settings --- .vscode/settings.json | 49 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index ff73ad0..4044afc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,18 +6,18 @@ }, "[c]": { "editor.insertSpaces": true, - "editor.rulers": [ 60, 76 ], - "editor.tabSize": 4, - }, - "[cpp]": { - "editor.insertSpaces": true, - "editor.rulers": [ 60, 64, 68, 76 ], + "editor.rulers": [ 60, 64, 68, 72, 76 ], "editor.tabSize": 4, }, "[cmake]": { "editor.insertSpaces": false, "editor.tabSize": 4, }, + "[cpp]": { + "editor.insertSpaces": true, + "editor.rulers": [ 60, 64, 68, 72, 76 ], + "editor.tabSize": 4, + }, "[json]": { "editor.insertSpaces": true, "editor.tabSize": 2, @@ -26,6 +26,12 @@ "editor.insertSpaces": true, "editor.tabSize": 2, }, + "[python]": { + "diffEditor.ignoreTrimWhitespace": false, + "editor.insertSpaces": true, + "editor.rulers": [ 51, 60, 61, 76 ], + "editor.tabSize": 4, + }, "[ruby]": { "editor.insertSpaces": true, "editor.tabSize": 2, @@ -35,10 +41,18 @@ "editor.rulers": [ 60, 76 ], "editor.tabSize": 2, }, + "[toml]": { + "editor.insertSpaces": false, + "editor.tabSize": 2, + }, + "[yaml]": { + "editor.insertSpaces": true, + "editor.tabSize": 2, + }, "cmake.configureOnOpen": false, "editor.detectIndentation": false, "editor.insertSpaces": false, - "editor.renderWhitespace" : "all", + "editor.renderWhitespace": "all", "editor.rulers": [ 76 ], "editor.tabSize": 2, "files.associations": { @@ -75,6 +89,8 @@ "complex": "cpp", "concepts": "cpp", "console_functions.h": "c", + "corecrt.h": "c", + "crtdefs.h": "c", "cstdarg": "cpp", "cstddef": "cpp", "cstdint": "cpp", @@ -87,10 +103,13 @@ "deque": "cpp", "exception": "cpp", "execution": "cpp", + "fcntl.h": "c", "format": "cpp", + "forward_list": "cpp", "functional": "cpp", "implicit_link.h": "c", "initializer_list": "cpp", + "io.h": "c", "iomanip": "cpp", "ios": "cpp", "iosfwd": "cpp", @@ -105,30 +124,43 @@ "memory_resource": "cpp", "mutex": "cpp", "new": "cpp", + "numbers": "cpp", "numeric": "cpp", "optional": "cpp", "ostream": "cpp", "queue": "cpp", + "random": "cpp", + "ranges": "cpp", "ratio": "cpp", + "semaphore": "cpp", "set": "cpp", + "setenv.h": "c", "shwild.h": "c", + "span": "cpp", "sstream": "cpp", "stack": "cpp", "stdexcept": "cpp", "stdio.h": "c", + "stop_token": "cpp", "streambuf": "cpp", "string": "cpp", "string_view": "cpp", "system_error": "cpp", + "terse-api.h": "c", + "text_encoding": "cpp", "thread": "cpp", "tuple": "cpp", "type_traits": "cpp", "typeinfo": "cpp", + "uio.h": "c", + "unixem.h": "c", "unordered_map": "cpp", + "util.h": "c", "utility": "cpp", "variant": "cpp", "vector": "cpp", "xfacet": "cpp", + "xhash": "cpp", "xiosbase": "cpp", "xlocale": "cpp", "xlocbuf": "cpp", @@ -139,10 +171,13 @@ "xloctime": "cpp", "xmemory": "cpp", "xstring": "cpp", + "xtests.internal.string.c": "cpp", "xtr1common": "cpp", "xtree": "cpp", "xutility": "cpp", }, "files.insertFinalNewline": true, "files.trimTrailingWhitespace": true, + "git.mergeEditor": false, } + From d4f1a8630ab06bf4b11bd4d3e4fe115cc82cc265 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 18:01:14 +1000 Subject: [PATCH 04/30] chore: added **NEWS.md** --- NEWS.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 NEWS.md diff --git a/NEWS.md b/NEWS.md new file mode 100644 index 0000000..a4bf825 --- /dev/null +++ b/NEWS.md @@ -0,0 +1,10 @@ +# realpath - News + + +| Date | News Item | +| -------------------- | -------------------------------------------------- | + + + + + From a2a1f0bc0072cc62f0acdedbee506d0f8cf3a6b1 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 18:13:44 +1000 Subject: [PATCH 05/30] chore: markdown files structure --- README.md | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..6d6c201 --- /dev/null +++ b/README.md @@ -0,0 +1,67 @@ +# realpath + + +## Table of Contents + +- [Introduction](#introduction) +- [Installation](#installation) +- [Components](#components) +- [Examples](#examples) +- [Project Information](#project-information) + - [Where to get help](#where-to-get-help) + - [Contribution guidelines](#contribution-guidelines) + - [Tests-only Dependencies](#tests-only-dependencies) + - [Related projects](#related-projects) + - [License](#license) + + +## Introduction + +T.B.C. + + +## Installation + +T.B.C. + + +## Components + +T.B.C. + + +## Examples + +T.B.C. + + +## Project Information + + +### Where to get help + +T.B.C. + + +### Contribution guidelines + +T.B.C. + + +#### Tests-only Dependencies + +T.B.C. + + +### Related projects + +T.B.C. + + +### License + +**lstrip** is released under the 3-clause BSD license. See [LICENSE](./LICENSE) for details. + + + + From 714e30d1c12747554711168689bda44146be24fc Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 18:18:45 +1000 Subject: [PATCH 06/30] chore: added **README.md** badges --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 6d6c201..46235e0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,13 @@ # realpath +![C++](https://img.shields.io/badge/C%2B%2B-00599C?style=flat&logo=c%2B%2B&logoColor=white) +[![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) +[![GitHub release](https://img.shields.io/github/v/release/sistools/realpath.svg)](https://github.com/sistools/realpath/releases/latest) +[![Last Commit](https://img.shields.io/github/last-commit/sistools/realpath)](https://github.com/sistools/realpath/commits/master) +[![CI](https://github.com/sistools/realpath/actions/workflows/ci.yml/badge.svg)](https://github.com/sistools/realpath/actions/workflows/ci.yml) + + ## Table of Contents - [Introduction](#introduction) From 25c796f8461d359b7cf62b6f7c098f33c55e983e Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 18:24:19 +1000 Subject: [PATCH 07/30] chore: added boilerplate files --- AUTHORS.md | 0 CHANGES.md | 0 INSTALL.md | 0 LICENSE | 0 TODO.md | 0 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 AUTHORS.md create mode 100644 CHANGES.md create mode 100644 INSTALL.md create mode 100644 LICENSE create mode 100644 TODO.md diff --git a/AUTHORS.md b/AUTHORS.md new file mode 100644 index 0000000..e69de29 diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 0000000..e69de29 diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 0000000..e69de29 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..e69de29 From 41a2b08a4a5521c4e96cbd28f8dc64c64e798148 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 18:36:13 +1000 Subject: [PATCH 08/30] chore: .sis abstraction of the helper scripts --- .sis/script_info_lines.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .sis/script_info_lines.txt diff --git a/.sis/script_info_lines.txt b/.sis/script_info_lines.txt new file mode 100644 index 0000000..a48be4e --- /dev/null +++ b/.sis/script_info_lines.txt @@ -0,0 +1,2 @@ +realpath is a version of the Unix system tool implemented in terms of the STLSoft C/C++ libraries +Copyright (c) 2024-2026, Matthew Wilson and Synesis Information Systems From 11a9e48a2a5ad0256241dd3c3fb7f9b6aa5ff2df Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 18:36:42 +1000 Subject: [PATCH 09/30] LICENSE --- LICENSE | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/LICENSE b/LICENSE index e69de29..7fea35c 100644 --- a/LICENSE +++ b/LICENSE @@ -0,0 +1,31 @@ +realpath - BSD 3-Clause License + +Copyright (c) 2024-2026, Synesis Information Systems +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + From 2ba1ccb7c0796470bc7a94acf77ca340f7e82aa8 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 18:38:48 +1000 Subject: [PATCH 10/30] .gitignore --- .gitignore | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 145 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 49613f7..f369e23 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,152 @@ -/_build +# directories (by name) -*.*~ +/.svn/ +/.vs/ + +/_build/ +/_internal/ + +/bin/ +/doc/ +/include/ +/lib/ +/node_modules/ + +/include/b64/ +/include/shwild/ +/include/xcontract/ +/include/xcover/ +/include/xtests/ + +/src/b64/ +/src/shwild/ +/src/xcontract/ +/src/xcover/ +/src/xtests/ + +Debug Multithreaded DLL/ +Debug Multithreaded Dll/ +Debug Multithreaded pseudoUNIX/ +Debug Multithreaded pseudoUnix/ +Debug Multithreaded/ +Debug/ +DebugDLLUNIX/ +DebugDll/ +DebugMTDLL/ +DebugMt/ +DebugNox/ +DebugUNIX/ +DebugUnix/ +Release Multithreaded DLL/ +Release Multithreaded Dll/ +Release Multithreaded pseudoUNIX/ +Release Multithreaded pseudoUnix/ +Release Multithreaded/ +Release/ +ReleaseDLLUNIX/ +ReleaseDll/ +ReleaseMTDLL/ +ReleaseMt/ +ReleaseNox/ +ReleaseUnix/ +UDebug/ +UDebugMt/ +URelease/ +UReleaseMt/ +Unicode Debug Multithreaded DLL/ +Unicode Debug Multithreaded Dll/ +Unicode Debug Multithreaded/ +Unicode Debug/ +Unicode Release Multithreaded DLL/ +Unicode Release Multithreaded Dll/ +Unicode Release Multithreaded/ +Unicode Release/ + +Win32/ +ipch/ +x64/ + + +# directories (by pattern) + + +# files (by name) + +.DS_Store +.ruby-version +.svnignore +.svnignore-at-root +.update_deps + +list_changes.cmd +logging-bailout.txt +prepare.cmd +sh.exe.stackdump +update_deps.cmd + +build/makefile.tmpl +build/makefile.tools.xml + +realpath +realpath_test + + +# files (by pattern) + +RCa0* +RCb0* + +*~ +*.???_obj +*.a +*.app +*.aps +*.b64 +*.bak +*.chm +*.class +*.csproj*user +*.d +*.dll +*.dylib *.exe +*.gch +*.gem +*.idb +*.ilk +*.iobj +*.ipch +*.ipdb +*.la +*.lai +*.lib +*.lo +*.log +*.ncb +*.o *.obj +*.opensdf +*.opt +*.org +*.out +*.pch +*.pdb +*.pyc +*.rar +*.res +*.sbr +*.scc +*.sdf +*.slo +*.so +*.suo *.swp +*.tlog +*.tmp +*.unsuccessfulbuild +*.vcproj*user +*.vcxproj*user +*.xcuserstate *.zip From 53c7987f94a600bcfab1db4076e3ee71860900b2 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 18:50:52 +1000 Subject: [PATCH 11/30] chore --- AUTHORS.md | 18 ++++++++++++++++++ CHANGES.md | 9 +++++++++ 2 files changed, 27 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index e69de29..c3bd1d8 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -0,0 +1,18 @@ +# realpath - Authors + + +## Major Contributors: + +* Matt Wilson ([mwsis](https://github.com/mwsis)) + + +## Defect reports, fixes and suggestions (for which we are very grateful): + +* \ (yet) + + +Contributions are welcomed. + + + + diff --git a/CHANGES.md b/CHANGES.md index e69de29..4addf22 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -0,0 +1,9 @@ +# **realpath** Changes + + +## T.B.C. + + + + + From 0e902035ca55f36f1fbc24052e3ada28f73fbddb Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 18:54:43 +1000 Subject: [PATCH 12/30] fix: CMake dependencies --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 15633a3..b78fd43 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ # Purpose: Top-level CMake lists file for realpath # # Created: 31st December 2024 -# Updated: 25th April 2025 +# Updated: 2nd August 2026 # # ######################################################################## # From 2a52ecceb17c9cf55076c99c797e2acf76a40287 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 2 Aug 2026 20:06:14 +1000 Subject: [PATCH 13/30] chore: added (empty) makefile --- makefile | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 makefile diff --git a/makefile b/makefile new file mode 100644 index 0000000..e69de29 From b1709365fd9d4c04c766f8b079afbc8b266820ee Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 3 Aug 2026 06:47:40 +1000 Subject: [PATCH 14/30] chore: canonicalising helper scripts --- build_cmake.sh | 130 ++++++++++++++++++++++++++ clean_cmake.sh | 92 +++++++++++++++++++ prepare_cmake.sh | 186 ++++++++++++++++++++++++++++++++++++++ remove_cmake_artefacts.sh | 151 +++++++++++++++++++++++++++++++ run_all_unit_tests.sh | 141 +++++++++++++++++++++++++++++ 5 files changed, 700 insertions(+) create mode 100755 build_cmake.sh create mode 100755 clean_cmake.sh create mode 100755 prepare_cmake.sh create mode 100755 remove_cmake_artefacts.sh create mode 100755 run_all_unit_tests.sh diff --git a/build_cmake.sh b/build_cmake.sh new file mode 100755 index 0000000..cca1448 --- /dev/null +++ b/build_cmake.sh @@ -0,0 +1,130 @@ +#! /bin/bash + +ScriptPath=$0 +Dir=$(cd $(dirname "$ScriptPath"); pwd) +Basename=$(basename "$ScriptPath") +CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} +if [[ -n "$MSYSTEM" ]]; then + + DefaultMakeCmd=mingw32-make.exe + MinGW=1 +else + + DefaultMakeCmd=make +fi +MakeCmd=${SIS_CMAKE_MAKE_COMMAND:-${SIS_CMAKE_COMMAND:-$DefaultMakeCmd}} + +IgnoreRemainingFlagsAndOptions=0 +Targets=() + + +# ########################################################## +# functions + +function join_by { local IFS="$1"; shift; echo "$*"; } + + +# ########################################################## +# command-line handling + +while [[ $# -gt 0 ]]; do + + if [ $IgnoreRemainingFlagsAndOptions -ne 0 ]; then + + Targets+=($1) + + shift + + continue + else + + if [ ! ${1:0:1} = '-' ]; then + + Targets+=($1) + + shift + + continue + fi + fi + + case $1 in + --) + + IgnoreRemainingFlagsAndOptions=1 + ;; + --help) + + [ -f "$Dir/.sis/script_info_lines.txt" ] && cat "$Dir/.sis/script_info_lines.txt" + cat << EOF +Executes CMake-generated artefacts to (re)build project + +$ScriptPath [ ... flags/options ... ] + +Flags/options: + + behaviour: + + + standard flags: + + --help + displays this help and terminates + +EOF + + exit 0 + ;; + *) + + >&2 echo "$ScriptPath: unrecognised argument '$1'; use --help for usage" + + exit 1 + ;; + esac + + shift +done + + +# ########################################################## +# main() + +if [ ! -d "$CMakeDir" ]; then + + >&2 echo "$ScriptPath: CMake build directory '$CMakeDir' not found so nothing to do; use script 'prepare_cmake.sh' if you wish to prepare CMake artefacts" + + exit 1 +else + + cd $CMakeDir + + if [ ! -f "$CMakeDir/Makefile" ]; then + + >&2 echo "$ScriptPath: CMake build directory '$CMakeDir' does not contain expected file 'Makefile', so a clean cannot be performed. It is recommended that you remove all CMake artefacts using script 'remove_cmake_artefacts.sh' followed by regeneration via 'prepare_cmake.sh'" + + cd ->/dev/null + + exit 1 + else + + if [ -z "$Targets" ]; then + + echo "Executing build (via command \`$MakeCmd\`)" + else + + echo "Executing build (via command \`$MakeCmd\`) with specific target(s) $(join_by , "${Targets[@]}")" + fi + + $MakeCmd ${Targets[*]} + status=$? + + cd ->/dev/null + + exit $status + fi +fi + + +# ############################## end of file ############################# # + diff --git a/clean_cmake.sh b/clean_cmake.sh new file mode 100755 index 0000000..886a201 --- /dev/null +++ b/clean_cmake.sh @@ -0,0 +1,92 @@ +#! /bin/bash + +ScriptPath=$0 +Dir=$(cd $(dirname "$ScriptPath"); pwd) +Basename=$(basename "$ScriptPath") +CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} +if [[ -n "$MSYSTEM" ]]; then + + DefaultMakeCmd=mingw32-make.exe + MinGW=1 +else + + DefaultMakeCmd=make +fi +MakeCmd=${SIS_CMAKE_MAKE_COMMAND:-${SIS_CMAKE_COMMAND:-$DefaultMakeCmd}} + + +# ########################################################## +# command-line handling + +while [[ $# -gt 0 ]]; do + + case $1 in + --help) + + [ -f "$Dir/.sis/script_info_lines.txt" ] && cat "$Dir/.sis/script_info_lines.txt" + cat << EOF +Executes CMake-generated artefacts to clean project + +$ScriptPath [ ... flags/options ... ] + +Flags/options: + + behaviour: + + + standard flags: + + --help + displays this help and terminates + +EOF + + exit 0 + ;; + *) + + >&2 echo "$ScriptPath: unrecognised argument '$1'; use --help for usage" + + exit 1 + ;; + esac + + shift +done + + +# ########################################################## +# main() + +if [ ! -d "$CMakeDir" ]; then + + >&2 echo "$ScriptPath: CMake build directory '$CMakeDir' not found so nothing to do; use script 'prepare_cmake.sh' if you wish to prepare CMake artefacts" + + exit 1 +else + + cd $CMakeDir + + if [ ! -f "$CMakeDir/Makefile" ]; then + + >&2 echo "$ScriptPath: CMake build directory '$CMakeDir' does not contain expected file 'Makefile', so a clean cannot be performed. It is recommended that you remove all CMake artefacts using script 'remove_cmake_artefacts.sh' followed by regeneration via 'prepare_cmake.sh'" + + cd ->/dev/null + + exit 1 + else + + echo "Cleaning build (via command \`$MakeCmd clean\`)" + + $MakeCmd clean + status=$? + + cd ->/dev/null + + exit $status + fi +fi + + +# ############################## end of file ############################# # + diff --git a/prepare_cmake.sh b/prepare_cmake.sh new file mode 100755 index 0000000..d837045 --- /dev/null +++ b/prepare_cmake.sh @@ -0,0 +1,186 @@ +#! /bin/bash + +ScriptPath=$0 +Dir=$(cd $(dirname "$ScriptPath"); pwd) +Basename=$(basename "$ScriptPath") +CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} +if [[ -n "$MSYSTEM" ]]; then + + DefaultMakeCmd=mingw32-make.exe + MinGW=1 +else + + DefaultMakeCmd=make +fi +MakeCmd=${SIS_CMAKE_MAKE_COMMAND:-${SIS_CMAKE_COMMAND:-$DefaultMakeCmd}} + +Configuration=Release +MSVC_MT=0 +MinGW="${MinGW:=0}" +RunMake=0 +STLSoftDirGiven= +TestingDisabled=0 +VerboseMakefile=0 + + +# ########################################################## +# command-line handling + +while [[ $# -gt 0 ]]; do + + case $1 in + --cmake-verbose-makefile|-v) + + VerboseMakefile=1 + ;; + --debug-configuration|-d) + + Configuration=Debug + ;; + --disable-testing|-T) + + TestingDisabled=1 + ;; + --mingw) + + MinGW=1 + ;; + --msvc-mt) + + MSVC_MT=1 + ;; + --run-make|-m) + + RunMake=1 + ;; + --stlsoft-root-dir|-s) + + shift + STLSoftDirGiven=$1 + ;; + --help) + + [ -f "$Dir/.sis/script_info_lines.txt" ] && cat "$Dir/.sis/script_info_lines.txt" + cat << EOF +Creates/reinitialises the CMake build script(s) + +$ScriptPath [ ... flags/options ... ] + +Flags/options: + + behaviour: + + -v + --cmake-verbose-makefile + configures CMake to run verbosely (by setting CMAKE_VERBOSE_MAKEFILE + to be ON) + + -d + --debug-configuration + use Debug configuration (by setting CMAKE_BUILD_TYPE=Debug). Default + is to use Release + + -T + --disable-testing + disables building of tests (by setting BUILD_TESTING=OFF) + + --mingw + uses explicitly the "MinGW Makefiles" generator, and defaults the + make-command to "mingw32-make.exe" + + --msvc-mt + when using Visual C++ (MSVC), the static runtime library will be + selected; the default is the dynamic runtime library + + -m + --run-make + executes make after a successful running of CMake + + -s + --stlsoft-root-dir + specifies the STLSoft root-directory, which will be passed to CMake + as the variable STLSOFT, and which will override the environment + variable STLSOFT (if present) + + + standard flags: + + --help + displays this help and terminates + +EOF + + exit 0 + ;; + *) + + >&2 echo "$ScriptPath: unrecognised argument '$1'; use --help for usage" + + exit 1 + ;; + esac + + shift +done + + +# ########################################################## +# main() + +mkdir -p $CMakeDir || exit 1 + +cd $CMakeDir + +echo "Executing CMake (in ${CMakeDir})" + +if [ $MSVC_MT -eq 0 ]; then CMakeMsvcMtFlag="OFF" ; else CMakeMsvcMtFlag="ON" ; fi +if [ -z $STLSoftDirGiven ]; then CMakeSTLSoftVariable="" ; else CMakeSTLSoftVariable="-DSTLSOFT=$STLSoftDirGiven/" ; fi +if [ $TestingDisabled -eq 0 ]; then CMakeBuildTestingFlag="ON" ; else CMakeBuildTestingFlag="OFF" ; fi +if [ $VerboseMakefile -eq 0 ]; then CMakeVerboseMakefileFlag="OFF" ; else CMakeVerboseMakefileFlag="ON" ; fi + +if [ $MinGW -ne 0 ]; then + + cmake \ + $CMakeSTLSoftVariable \ + -DBUILD_TESTING:BOOL=$CMakeBuildTestingFlag \ + -DCMAKE_BUILD_TYPE=$Configuration \ + -G "MinGW Makefiles" \ + -S $Dir \ + -B $CMakeDir \ + || (cd ->/dev/null ; exit 1) +else + + cmake \ + $CMakeSTLSoftVariable \ + -DBUILD_TESTING:BOOL=$CMakeBuildTestingFlag \ + -DCMAKE_BUILD_TYPE=$Configuration \ + -DCMAKE_VERBOSE_MAKEFILE:BOOL=$CMakeVerboseMakefileFlag \ + -DMSVC_USE_MT:BOOL=$CMakeMsvcMtFlag \ + -S $Dir \ + -B $CMakeDir \ + || (cd ->/dev/null ; exit 1) +fi + +status=0 + +if [ $RunMake -ne 0 ]; then + + echo "Executing build (via command \`$MakeCmd\`)" + + $MakeCmd + status=$? +fi + +cd ->/dev/null + +if [ $VerboseMakefile -ne 0 ]; then + + echo -e "contents of $CMakeDir:" + ls -al $CMakeDir +fi + +exit $status + + +# ############################## end of file ############################# # + diff --git a/remove_cmake_artefacts.sh b/remove_cmake_artefacts.sh new file mode 100755 index 0000000..7416db9 --- /dev/null +++ b/remove_cmake_artefacts.sh @@ -0,0 +1,151 @@ +#! /bin/bash + +ScriptPath=$0 +Dir=$(cd $(dirname "$ScriptPath"); pwd) +Basename=$(basename "$ScriptPath") +CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} + +Directories=( + CMakeFiles + Testing + cmake + examples + projects + src + test +) +Files=( + CMakeCache.txt + CTestTestfile.cmake + DartConfiguration.tcl + Makefile + cmake_install.cmake + install_manifest.txt +) + + +# ########################################################## +# operating environment detection + +OsName="$(uname -s)" +case "${OsName}" in + CYGWIN*|MINGW*|MSYS_NT*) + + Directories+=( + ARM64 + Win32 + x64 + ) + Files+=( + "*.filters" + "*.sln" + "*.vcxproj" + ) + ;; + *) + + ;; +esac + + +# ########################################################## +# command-line handling + +while [[ $# -gt 0 ]]; do + + case $1 in + --help) + + [ -f "$Dir/.sis/script_info_lines.txt" ] && cat "$Dir/.sis/script_info_lines.txt" + cat << EOF +Removes all known CMake artefacts + +$ScriptPath [ ... flags/options ... ] + +Flags/options: + + behaviour: + + + standard flags: + + --help + displays this help and terminates + +EOF + + exit 0 + ;; + *) + + >&2 echo "$ScriptPath: unrecognised argument '$1'; use --help for usage" + + exit 1 + ;; + esac + + shift +done + + +# ########################################################## +# main() + +if [ ! -d "$CMakeDir" ]; then + + echo "$ScriptPath: CMake build directory '$CMakeDir' not found so nothing to do; use script 'prepare_cmake.sh' if you wish to prepare CMake artefacts" + + exit 0 +else + + echo "Removing all cmake artefacts in '$CMakeDir'" + + num_dirs_removed=0 + num_files_removed=0 + + for d in ${Directories[@]} + do + + fq_dir_path="$CMakeDir/$d" + + [ -d "$fq_dir_path" ] || continue + + echo "removing directory '$d'" + + rm -dfr "$fq_dir_path" + + num_dirs_removed=$((num_dirs_removed+1)) + done + + cd "$CMakeDir" + + for f in ${Files[@]} + do + + for fq_file_path in $f + do + + [ -f "$fq_file_path" ] || continue + + echo "removing file '$fq_file_path'" + + rm -f "$fq_file_path" + + num_files_removed=$((num_files_removed+1)) + done + done + + cd ->/dev/null + + if [ 0 -eq $num_dirs_removed ] && [ 0 -eq $num_files_removed ]; then + + echo "nothing to do" + else + + echo "removed $num_dirs_removed directories and $num_files_removed files" + fi +fi + + +# ############################## end of file ############################# # + diff --git a/run_all_unit_tests.sh b/run_all_unit_tests.sh new file mode 100755 index 0000000..ffad7f8 --- /dev/null +++ b/run_all_unit_tests.sh @@ -0,0 +1,141 @@ +#! /bin/bash + +ScriptPath=$0 +Dir=$(cd $(dirname "$ScriptPath"); pwd) +Basename=$(basename "$ScriptPath") +CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} +if [[ -n "$MSYSTEM" ]]; then + + DefaultMakeCmd=mingw32-make.exe + MinGW=1 +else + + DefaultMakeCmd=make +fi +MakeCmd=${SIS_CMAKE_MAKE_COMMAND:-${SIS_CMAKE_COMMAND:-$DefaultMakeCmd}} + +ListOnly=0 +RunMake=1 + + +# ########################################################## +# command-line handling + +while [[ $# -gt 0 ]]; do + + case $1 in + --list-only|-l) + + ListOnly=1 + ;; + --no-make|-M) + + RunMake=0 + ;; + --help) + + [ -f "$Dir/.sis/script_info_lines.txt" ] && cat "$Dir/.sis/script_info_lines.txt" + cat << EOF +Runs all (matching) component and unit test programs + +$ScriptPath [ ... flags/options ... ] + +Flags/options: + + behaviour: + + -l + --list-only + lists the target programs but does not execute them + + -M + --no-make + does not execute CMake and make before running tests + + + standard flags: + + --help + displays this help and terminates + +EOF + + exit 0 + ;; + *) + + >&2 echo "$ScriptPath: unrecognised argument '$1'; use --help for usage" + + exit 1 + ;; + esac + + shift +done + + +# ########################################################## +# main() + +status=0 + +if [ $RunMake -ne 0 ]; then + + if [ $ListOnly -eq 0 ]; then + + echo "Executing build (via command \`$MakeCmd\`) and then running all component and unit test programs" + + mkdir -p $CMakeDir || exit 1 + + cd $CMakeDir + + $MakeCmd + status=$? + + cd ->/dev/null + fi +else + + if [ ! -d "$CMakeDir" ] || [ ! -f "$CMakeDir/CMakeCache.txt" ] || [ ! -d "$CMakeDir/CMakeFiles" ]; then + + >&2 echo "$ScriptPath: cannot run in '--no-make' mode without a previous successful build step" + fi +fi + +if [ $status -eq 0 ]; then + + if [ $ListOnly -ne 0 ]; then + + echo "Listing all component and unit test programs" + else + + echo "Running all component and unit test programs" + fi + + for f in $(find $CMakeDir -type f '(' -name '*test*' ')' -exec test -x {} \; -print) + do + + if [ $ListOnly -ne 0 ]; then + + echo "would execute $f:" + + continue + fi + + if $f; then + + : + else + + status=$? + + break 1 + fi + done +fi + +exit $status + + +# ############################## end of file ############################# # + From 0ae566da5a7819c7cffe0abb2c8be3be76ee3b49 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 3 Aug 2026 07:07:48 +1000 Subject: [PATCH 15/30] chore: canonicalising helper scripts --- .sis/project_name.txt | 1 + run_all_unit_tests.sh | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .sis/project_name.txt diff --git a/.sis/project_name.txt b/.sis/project_name.txt new file mode 100644 index 0000000..cffa451 --- /dev/null +++ b/.sis/project_name.txt @@ -0,0 +1 @@ +realpath \ No newline at end of file diff --git a/run_all_unit_tests.sh b/run_all_unit_tests.sh index ffad7f8..38bdd3b 100755 --- a/run_all_unit_tests.sh +++ b/run_all_unit_tests.sh @@ -13,6 +13,7 @@ else DefaultMakeCmd=make fi MakeCmd=${SIS_CMAKE_MAKE_COMMAND:-${SIS_CMAKE_COMMAND:-$DefaultMakeCmd}} +ProjectName=$(cat "$Dir/.sis/project_name.txt") ListOnly=0 RunMake=1 @@ -112,7 +113,7 @@ if [ $status -eq 0 ]; then echo "Running all component and unit test programs" fi - for f in $(find $CMakeDir -type f '(' -name '*test*' ')' -exec test -x {} \; -print) + for f in $(find $CMakeDir -type f '(' -name "*${ProjectName}*test*" ')' -exec test -x {} \; -print) do if [ $ListOnly -ne 0 ]; then From f6efb2ae36a586bc9ed67d65b95a10bdeef868f6 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 3 Aug 2026 07:11:28 +1000 Subject: [PATCH 16/30] chore: canonicalising CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b78fd43..3ae2648 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ # Purpose: Top-level CMake lists file for realpath # # Created: 31st December 2024 -# Updated: 2nd August 2026 +# Updated: 3rd August 2026 # # ######################################################################## # From 4294cbd34f8d66d93b4bebc67b661179436e75b1 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 3 Aug 2026 07:29:53 +1000 Subject: [PATCH 17/30] chore: canonicalising CMakeLists.txt --- CMakeLists.txt | 49 ++++++++++++++++++++++++++++++++--- cmake/BuildType.cmake | 59 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 cmake/BuildType.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ae2648..7442a7e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,21 +66,62 @@ set(CMAKE_CXX_EXTENSIONS ON) if(MSVC) + if(MSVC_VERSION GREATER_EQUAL 1914) + + add_compile_options("/Zc:__cplusplus") + + add_definitions(-D_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING) + endif() + if(MSVC_VERSION LESS 1930) set(CMAKE_C_STANDARD 90) set(CMAKE_CXX_STANDARD 98) endif() - if(MSVC_VERSION GREATER_EQUAL 1914) + if(MSVC_USE_MT) - add_compile_options("/Zc:__cplusplus") + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + endif(MSVC_USE_MT) +else(MSVC) - add_definitions(-D_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING) - endif() + if(MSVC_USE_MT) + + # this here just to absorb warning about not using `MSVC_USE_MT` (to + # enable **prepare_cmake.sh** to be simple) + endif(MSVC_USE_MT) endif(MSVC) +# ########################################################## +# dependencies, includes, options + +# ################################################ +# includes - 1 + +include(BuildType) +#[====[ +include(LanguageFullVersion) +include(TargetMacros) +#]====] + + +# ################################################ +# dependencies, features, and options + + +# ###################################### +# options + +option(BUILD_EXAMPLES "Build examples" ON) + +option(BUILD_TESTING "Build tests" ON) + + +# ###################################### +# features + + # ########################################################## # dependencies (required) diff --git a/cmake/BuildType.cmake b/cmake/BuildType.cmake new file mode 100644 index 0000000..a315b8d --- /dev/null +++ b/cmake/BuildType.cmake @@ -0,0 +1,59 @@ + +# ######################################################################## # +# File: /cmake/BuildType.cmake +# +# Purpose: CMake module file (for BuildType) +# +# Created: 16th October 2019 +# Updated: 25th October 2024 +# +# ######################################################################## # + + +# Including this module sets the `CMAKE_BUILD_TYPE` value as follows: +# +# 1. If user specifies on the command line, then `CMAKE_BUILD_TYPE` already +# has a valid, so this is accepted; +# 2. If the top-level .git directory is specified, then "Debug" is used; +# otherwise +# 3. "Release" is used. +# +# Note: +# - `CMAKE_BUILD_TYPE` is the build (configuration) type; +# - `CMAKE_CONFIGURATION_TYPES` is, if specified, a list of valid +# configurations (see +# https://cmake.org/cmake/help/latest/variable/CMAKE_CONFIGURATION_TYPES.html); +# +# Example usage: +# +#[========[ + +# CMakeLists.txt + +include(BuildType) + +]========] + + +if(EXISTS "${CMAKE_SOURCE_DIR}/.git") + set(DEFAULT_BUILD_TYPE "Debug") +else() + set(DEFAULT_BUILD_TYPE "Release") +endif() + +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + + message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.") + + set(CACHE CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" + STRING "Choose the type of build." FORCE + ) + + # Set the possible values of build type for cmake-gui + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Release" "MinSizeRel" "RelWithDebInfo" + ) +endif() + +# ############################## end of file ############################# # + From e37996ae00d6389578a1e3fc724755fd401a11aa Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 3 Aug 2026 07:59:36 +1000 Subject: [PATCH 18/30] feature: CMakeLists.txt --- CMakeLists.txt | 92 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 74 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7442a7e..127c7ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,3 @@ - # ######################################################################## # # File: /CMakeLists.txt # @@ -121,32 +120,72 @@ option(BUILD_TESTING "Build tests" ON) # ###################################### # features +# This tool targets Windows only (WinSTL). +if(NOT WIN32) -# ########################################################## -# dependencies (required) + message(FATAL_ERROR "${PROJECT_NAME} targets Windows only") +endif() -set(STLSoft_REQUIRED_VERSION_ 1.11.1) -find_package(STLSoft ${STLSoft_REQUIRED_VERSION_} REQUIRED) +# ###################################### +# dependencies +# +# required: +# - STLSoft; +# +# required if testing enabled: +# - (none); +# +# optional: -message("-- CMake package STLSoft found (version ${STLSoft_VERSION}; ${STLSoft_REQUIRED_VERSION_} requested)") +# ############################ +# STLSoft -# ########################################################## -# install +if(DEFINED STLSOFT) + + message("-- STLSOFT provided as CMake variable with value '${STLSOFT}'") + + set(STLSOFT_INCLUDE_DIR ${STLSOFT}/include) +elseif(DEFINED ENV{STLSOFT}) + + message("-- STLSOFT provided as environment variable with value '$ENV{STLSOFT}'") + + set(STLSOFT_INCLUDE_DIR $ENV{STLSOFT}/include) +else() + + set(STLSoft_REQUIRED_VERSION_ 1.11.1) + + find_package(STLSoft ${STLSoft_REQUIRED_VERSION_} REQUIRED) + + message("-- CMake package STLSoft found (version ${STLSoft_VERSION}; ${STLSoft_REQUIRED_VERSION_} requested)") +endif() + +if(DEFINED STLSOFT_INCLUDE_DIR) -# provides install directory variables as defined by the GNU Coding Standards. + include_directories(${STLSOFT_INCLUDE_DIR}) +endif() + + +# ################################################ +# includes - 2 + +include(CMakePackageConfigHelpers) +if(BUILD_TESTING) + + include(CTest) +endif(BUILD_TESTING) include(GNUInstallDirs) # ########################################################## -# tool - realpath +# tool -add_executable(realpath - realpath.cpp +add_executable(${PROJECT_NAME_LOWER} + ${PROJECT_NAME_LOWER}.cpp ) -target_compile_options(realpath +target_compile_options(${PROJECT_NAME_LOWER} PRIVATE $<$,$,$>: -Werror -Wall -Wextra -pedantic @@ -155,18 +194,36 @@ target_compile_options(realpath -Wno-incompatible-pointer-types-discards-qualifiers -Wno-unused-parameter > - $<$: /WX /W4> + $<$: + /WX /W4 + > ) -target_link_libraries(realpath - STLSoft::STLSoft +target_link_libraries(${PROJECT_NAME_LOWER} + $<$:STLSoft::STLSoft> ) -install(TARGETS realpath +install(TARGETS ${PROJECT_NAME_LOWER} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) +# ################################################ +# examples + + +# ################################################ +# tests + +if(BUILD_TESTING) + + message("-- enabled building of tests ...") +else(BUILD_TESTING) + + message("-- disabled building of tests - define BUILD_TESTING to enable") +endif(BUILD_TESTING) + + # ########################################################## # completion @@ -174,4 +231,3 @@ message(NOTICE "Generating CMake build scripts for ${PROJECT_NAME} ${PROJECT_VER # ############################## end of file ############################# # - From 7b724dc3261f4c643494c5d38b7069a07aa8f96c Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 3 Aug 2026 07:59:55 +1000 Subject: [PATCH 19/30] chore: project files --- INSTALL.md | 6 ++++++ TODO.md | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/INSTALL.md b/INSTALL.md index e69de29..fdf6151 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -0,0 +1,6 @@ +# realpath - Installation and Use + + + + + diff --git a/TODO.md b/TODO.md index e69de29..7c2dfb1 100644 --- a/TODO.md +++ b/TODO.md @@ -0,0 +1,10 @@ +# realpath - TODO list + + +## mksock 0.0.x TODOs: + +* \ + + + + From f69c775692a50019a02dab82dcfe9303b793a9d0 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 3 Aug 2026 08:05:24 +1000 Subject: [PATCH 20/30] feature: added GitHub Actions CI --- .github/workflows/ci-cell.yml | 263 ++++++++++++++++++++++++++++++++++ .github/workflows/ci.yml | 39 +++++ 2 files changed, 302 insertions(+) create mode 100644 .github/workflows/ci-cell.yml create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci-cell.yml b/.github/workflows/ci-cell.yml new file mode 100644 index 0000000..a22f43f --- /dev/null +++ b/.github/workflows/ci-cell.yml @@ -0,0 +1,263 @@ +name: CI cell + +on: + workflow_call: + inputs: + cell-id: + required: true + type: string + os: + required: true + type: string + c-compiler: + required: true + type: string + cpp-compiler: + required: true + type: string + build-type: + required: false + type: string + default: Release + with-clasp: + required: false + type: boolean + default: true + with-cstring: + required: false + type: boolean + default: false + with-test-deps: + required: false + type: boolean + default: true + run-tests: + required: false + type: boolean + default: true + +jobs: + cell: + name: ${{ inputs.cell-id }} + runs-on: ${{ inputs.os }} + + steps: + - uses: actions/checkout@v4 + + - name: Install Clang (Ubuntu) + if: runner.os == 'Linux' && inputs.c-compiler == 'clang' + run: sudo apt-get update && sudo apt-get install -y clang + + - name: Setup MSYS2 MinGW + if: runner.os == 'Windows' && inputs.c-compiler == 'mingw' + uses: msys2/setup-msys2@v2 + with: + msystem: MINGW64 + update: true + install: >- + mingw-w64-x86_64-toolchain + mingw-w64-x86_64-cmake + mingw-w64-x86_64-make + + - name: Install dependencies + shell: bash + run: | + set -euxo pipefail + + DEPS="${RUNNER_TEMP}/sis-deps" + mkdir -p "$DEPS" + echo "SIS_DEPS=$DEPS" >> "$GITHUB_ENV" + + if [ "${{ inputs.c-compiler }}" = "mingw" ]; then + export PATH="/mingw64/bin:$PATH" + fi + + cmake_configure() { + local src="$1" bld="$2" + shift 2 + if [ "${{ inputs.c-compiler }}" = "cl" ]; then + cmake -S "$src" -B "$bld" \ + -DCMAKE_DISABLE_FIND_PACKAGE_MFC=TRUE \ + -DCMAKE_INSTALL_PREFIX="$DEPS" \ + -DCMAKE_PREFIX_PATH="$DEPS" \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_TESTING=OFF \ + "$@" + elif [ "${{ inputs.c-compiler }}" = "mingw" ]; then + cmake -S "$src" -B "$bld" -G "MinGW Makefiles" \ + -DCMAKE_BUILD_TYPE="${{ inputs.build-type }}" \ + -DCMAKE_INSTALL_PREFIX="$DEPS" \ + -DCMAKE_PREFIX_PATH="$DEPS" \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_TESTING=OFF \ + "$@" + else + cmake -S "$src" -B "$bld" \ + -DCMAKE_BUILD_TYPE="${{ inputs.build-type }}" \ + -DCMAKE_C_COMPILER="${{ inputs.c-compiler }}" \ + -DCMAKE_CXX_COMPILER="${{ inputs.cpp-compiler }}" \ + -DCMAKE_INSTALL_PREFIX="$DEPS" \ + -DCMAKE_PREFIX_PATH="$DEPS" \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_TESTING=OFF \ + "$@" + fi + } + + cmake_build_install() { + local bld="$1" + if [ "${{ inputs.c-compiler }}" = "cl" ]; then + cmake --build "$bld" --config "${{ inputs.build-type }}" --parallel + cmake --install "$bld" --config "${{ inputs.build-type }}" + elif [ "${{ inputs.c-compiler }}" = "mingw" ]; then + cmake --build "$bld" --parallel 2 + cmake --install "$bld" + else + cmake --build "$bld" --parallel + cmake --install "$bld" + fi + } + + # STLSoft (required) + STLSRC="${RUNNER_TEMP}/stlsoft-src" + STLBUILD="${RUNNER_TEMP}/stlsoft-build" + git clone --depth 1 https://github.com/synesissoftware/STLSoft "$STLSRC" + cmake_configure "$STLSRC" "$STLBUILD" + cmake_build_install "$STLBUILD" + + # Catch2 v2 + xTests (test-only) + if [ "${{ inputs.with-test-deps }}" = "true" ]; then + CATCHSRC="${RUNNER_TEMP}/catch2-src" + CATCHBUILD="${RUNNER_TEMP}/catch2-build" + git clone --depth 1 --branch v2.x https://github.com/catchorg/Catch2 "$CATCHSRC" + cmake_configure "$CATCHSRC" "$CATCHBUILD" \ + -DCATCH_BUILD_TESTING=OFF \ + -DCATCH_ENABLE_WERROR=OFF \ + -DCATCH_INSTALL_DOCS=OFF + cmake_build_install "$CATCHBUILD" + + XTSRC="${RUNNER_TEMP}/xtests-src" + XTBUILD="${RUNNER_TEMP}/xtests-build" + git clone --depth 1 https://github.com/synesissoftware/xTests "$XTSRC" + cmake_configure "$XTSRC" "$XTBUILD" -DNO_SHWILD=TRUE + cmake_build_install "$XTBUILD" + fi + + # CLASP + if [ "${{ inputs.with-clasp }}" = "true" ]; then + CLASPSRC="${RUNNER_TEMP}/clasp-src" + CLASPBUILD="${RUNNER_TEMP}/clasp-build" + git clone --depth 1 https://github.com/synesissoftware/CLASP "$CLASPSRC" + cmake_configure "$CLASPSRC" "$CLASPBUILD" + cmake_build_install "$CLASPBUILD" + fi + + # cstring + if [ "${{ inputs.with-cstring }}" = "true" ]; then + CSTRSRC="${RUNNER_TEMP}/cstring-src" + CSTRBUILD="${RUNNER_TEMP}/cstring-build" + git clone --depth 1 https://github.com/synesissoftware/cstring "$CSTRSRC" + cmake_configure "$CSTRSRC" "$CSTRBUILD" + cmake_build_install "$CSTRBUILD" + fi + + - name: Configure + shell: bash + run: | + set -euo pipefail + DEPS="${{ env.SIS_DEPS }}" + + if [ "${{ inputs.c-compiler }}" = "mingw" ]; then + export PATH="/mingw64/bin:$PATH" + fi + + # Bare `cstring` link (rstrip) needs include/lib search paths beyond + # find_package(CLASP)-style imported targets. + if [ "${{ inputs.with-cstring }}" = "true" ]; then + if [ "${{ inputs.c-compiler }}" = "cl" ]; then + export INCLUDE="$(cygpath -w "$DEPS/include");${INCLUDE:-}" + export LIB="$(cygpath -w "$DEPS/lib");${LIB:-}" + else + export CPATH="$DEPS/include${CPATH:+:$CPATH}" + export LIBRARY_PATH="$DEPS/lib${LIBRARY_PATH:+:$LIBRARY_PATH}" + fi + fi + + if [ "${{ inputs.c-compiler }}" = "cl" ]; then + cmake -B build -S . \ + -DCMAKE_DISABLE_FIND_PACKAGE_MFC=TRUE \ + -DCMAKE_PREFIX_PATH="$DEPS" \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_TESTING=ON + elif [ "${{ inputs.c-compiler }}" = "mingw" ]; then + cmake -B build -G "MinGW Makefiles" \ + -DCMAKE_BUILD_TYPE="${{ inputs.build-type }}" \ + -DCMAKE_C_COMPILER=gcc \ + -DCMAKE_CXX_COMPILER=g++ \ + -DCMAKE_PREFIX_PATH="$DEPS" \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_TESTING=ON + else + cmake -B build -S . \ + -DCMAKE_BUILD_TYPE="${{ inputs.build-type }}" \ + -DCMAKE_C_COMPILER="${{ inputs.c-compiler }}" \ + -DCMAKE_CXX_COMPILER="${{ inputs.cpp-compiler }}" \ + -DCMAKE_PREFIX_PATH="$DEPS" \ + -DBUILD_EXAMPLES=OFF \ + -DBUILD_TESTING=ON + fi + + - name: Build + shell: bash + run: | + set -euo pipefail + if [ "${{ inputs.c-compiler }}" = "mingw" ]; then + export PATH="/mingw64/bin:$PATH" + fi + if [ "${{ inputs.with-cstring }}" = "true" ]; then + DEPS="${{ env.SIS_DEPS }}" + if [ "${{ inputs.c-compiler }}" = "cl" ]; then + export INCLUDE="$(cygpath -w "$DEPS/include");${INCLUDE:-}" + export LIB="$(cygpath -w "$DEPS/lib");${LIB:-}" + else + export CPATH="$DEPS/include${CPATH:+:$CPATH}" + export LIBRARY_PATH="$DEPS/lib${LIBRARY_PATH:+:$LIBRARY_PATH}" + fi + fi + if [ "${{ inputs.c-compiler }}" = "cl" ]; then + cmake --build build --config "${{ inputs.build-type }}" --parallel + elif [ "${{ inputs.c-compiler }}" = "mingw" ]; then + cmake --build build --parallel 2 + else + cmake --build build --parallel + fi + + - name: Run tests + if: inputs.run-tests + shell: bash + run: | + set -euo pipefail + if [ "${{ inputs.c-compiler }}" = "mingw" ]; then + export PATH="/mingw64/bin:$PATH" + fi + SIS_CMAKE_BUILD_DIR="${{ github.workspace }}/build" ./run_all_unit_tests.sh -M + + - name: Install and verify + shell: bash + run: | + set -euo pipefail + PREFIX="${RUNNER_TEMP}/install-prefix" + PROJECT="$(tr -d '[:space:]' < .sis/project_name.txt)" + if [ "${{ inputs.c-compiler }}" = "mingw" ]; then + export PATH="/mingw64/bin:$PATH" + fi + if [ "${{ inputs.c-compiler }}" = "cl" ]; then + cmake --install build --config "${{ inputs.build-type }}" --prefix "$PREFIX" + else + cmake --install build --prefix "$PREFIX" + fi + if [ "${{ inputs.c-compiler }}" = "cl" ] || [ "${{ inputs.c-compiler }}" = "mingw" ]; then + test -f "$PREFIX/bin/${PROJECT}.exe" + else + test -x "$PREFIX/bin/${PROJECT}" + fi diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..05d1e48 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,39 @@ +name: CI + +on: + push: + branches: + - master + - boilerplate + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + cell: + name: CI (${{ matrix.id }}) + strategy: + fail-fast: false + matrix: + include: + - id: windows-cl + os: windows-latest + c_compiler: cl + cpp_compiler: cl + - id: windows-mingw + os: windows-latest + c_compiler: mingw + cpp_compiler: g++ + uses: ./.github/workflows/ci-cell.yml + with: + cell-id: ${{ matrix.id }} + os: ${{ matrix.os }} + c-compiler: ${{ matrix.c_compiler }} + cpp-compiler: ${{ matrix.cpp_compiler }} + build-type: Release + with-clasp: false + with-cstring: false + with-test-deps: false + run-tests: true From c4ae4277bca5d364117e4f8c0e988f78be7cafc6 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 3 Aug 2026 08:16:24 +1000 Subject: [PATCH 21/30] fix --- realpath.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/realpath.cpp b/realpath.cpp index 8cd4bab..dcd0ba2 100644 --- a/realpath.cpp +++ b/realpath.cpp @@ -13,12 +13,14 @@ #include #include +#include +#include #include #define REALPATH_VER_MAJOR 0 #define REALPATH_VER_MINOR 0 -#define REALPATH_VER_PATCH 2 +#define REALPATH_VER_PATCH 3 int main(int argc, char* argv[]) From a85aa06673f8b77137fba17532722c97d0e24347 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 3 Aug 2026 09:15:42 +1000 Subject: [PATCH 22/30] fix --- .github/workflows/ci-cell.yml | 7 +- run_all_unit_tests.cmd | 141 +++++++++++++++++++++++++++++++++ run_all_unit_tests.sh | 142 ---------------------------------- 3 files changed, 147 insertions(+), 143 deletions(-) create mode 100644 run_all_unit_tests.cmd delete mode 100755 run_all_unit_tests.sh diff --git a/.github/workflows/ci-cell.yml b/.github/workflows/ci-cell.yml index a22f43f..c17166d 100644 --- a/.github/workflows/ci-cell.yml +++ b/.github/workflows/ci-cell.yml @@ -240,7 +240,12 @@ jobs: if [ "${{ inputs.c-compiler }}" = "mingw" ]; then export PATH="/mingw64/bin:$PATH" fi - SIS_CMAKE_BUILD_DIR="${{ github.workspace }}/build" ./run_all_unit_tests.sh -M + export SIS_CMAKE_BUILD_DIR="${{ github.workspace }}/build" + if [ "${{ runner.os }}" = "Windows" ]; then + cmd.exe //c "run_all_unit_tests.cmd -M -v" + else + ./run_all_unit_tests.sh -M -v + fi - name: Install and verify shell: bash diff --git a/run_all_unit_tests.cmd b/run_all_unit_tests.cmd new file mode 100644 index 0000000..8c88eae --- /dev/null +++ b/run_all_unit_tests.cmd @@ -0,0 +1,141 @@ +@echo off + +SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION + +SET SCRIPT_DIRECTORY=%~dp0 +SET SCRIPT_PATH_DOC=%~n0[%~x0] +IF DEFINED SIS_CMAKE_BUILD_DIR ( + + SET "CMAKE_DIR=%SIS_CMAKE_BUILD_DIR%" +) ELSE ( + + SET "CMAKE_DIR=%SCRIPT_DIRECTORY%_build" +) + +SET ListOnly=0 +SET Verbose=0 +SET status=0 + +FOR %%a IN (%*) DO ( + IF /I {--help}=={%%a} ( + IF EXIST "%SCRIPT_DIRECTORY%.sis\script_info_lines.txt" ( + + type "%SCRIPT_DIRECTORY%.sis\script_info_lines.txt" + ) + ECHO ^ + +Runs all ^(matching^) component and unit test programs ^ + +^ + +%SCRIPT_PATH_DOC% [ ... flags/options ... ] ^ + +^ + +Flags/options: ^ + + behaviour: ^ + +^ + + -l ^ + + --list-only ^ + + lists the target programs but does not execute them ^ + +^ + + -M ^ + + --no-make ^ + + accepted for parity with the .sh script ^(build is not invoked^) ^ + +^ + + -v ^ + + --verbose ^ + + lists each test program before executing it ^ + +^ + + standard flags: ^ + +^ + + --help ^ + + displays this help and terminates ^ + + + EXIT /B 0 + ) ELSE IF /I {-l}=={%%a} ( + SET ListOnly=1 + ) ELSE IF /I {--list-only}=={%%a} ( + SET ListOnly=1 + ) ELSE IF /I {-M}=={%%a} ( + REM no-op: this .cmd never invokes the build + ) ELSE IF /I {--no-make}=={%%a} ( + REM no-op: this .cmd never invokes the build + ) ELSE IF /I {-v}=={%%a} ( + SET Verbose=1 + ) ELSE IF /I {--verbose}=={%%a} ( + SET Verbose=1 + ) ELSE ( + ECHO %SCRIPT_PATH_DOC%: unrecognised argument '%%a'; use --help for usage 1>&2 + + EXIT /B 1 + ) +) + +IF NOT EXIST "%CMAKE_DIR%" ( + + ECHO %SCRIPT_PATH_DOC%: CMake build directory '%CMAKE_DIR%' does not exist 1>&2 + + EXIT /B 1 +) + +SET "ProjectName=" +FOR /F "usebackq delims=" %%p IN ("%SCRIPT_DIRECTORY%.sis\project_name.txt") DO SET "ProjectName=%%p" + +IF NOT DEFINED ProjectName ( + + ECHO %SCRIPT_PATH_DOC%: could not read project name from .sis\project_name.txt 1>&2 + + EXIT /B 1 +) + +IF !ListOnly! EQU 1 ( + + ECHO Listing all component and unit test programs +) ELSE ( + + ECHO Running all component and unit test programs +) + +FOR /F "usebackq delims=" %%f IN (`DIR /A:-D /B /S "%CMAKE_DIR%\*.exe" 2^>NUL ^| FINDSTR /I /R "!ProjectName!.*test.*\.exe$"`) DO ( + IF !ListOnly! EQU 1 ( + + ECHO would execute %%f: + ) ELSE ( + + IF !Verbose! EQU 1 ( + + ECHO executing %%f: + ) + + "%%f" + IF ERRORLEVEL 1 ( + + SET status=1 + + GOTO :done + ) + ) +) + +:done +EXIT /B !status! diff --git a/run_all_unit_tests.sh b/run_all_unit_tests.sh deleted file mode 100755 index 38bdd3b..0000000 --- a/run_all_unit_tests.sh +++ /dev/null @@ -1,142 +0,0 @@ -#! /bin/bash - -ScriptPath=$0 -Dir=$(cd $(dirname "$ScriptPath"); pwd) -Basename=$(basename "$ScriptPath") -CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} -if [[ -n "$MSYSTEM" ]]; then - - DefaultMakeCmd=mingw32-make.exe - MinGW=1 -else - - DefaultMakeCmd=make -fi -MakeCmd=${SIS_CMAKE_MAKE_COMMAND:-${SIS_CMAKE_COMMAND:-$DefaultMakeCmd}} -ProjectName=$(cat "$Dir/.sis/project_name.txt") - -ListOnly=0 -RunMake=1 - - -# ########################################################## -# command-line handling - -while [[ $# -gt 0 ]]; do - - case $1 in - --list-only|-l) - - ListOnly=1 - ;; - --no-make|-M) - - RunMake=0 - ;; - --help) - - [ -f "$Dir/.sis/script_info_lines.txt" ] && cat "$Dir/.sis/script_info_lines.txt" - cat << EOF -Runs all (matching) component and unit test programs - -$ScriptPath [ ... flags/options ... ] - -Flags/options: - - behaviour: - - -l - --list-only - lists the target programs but does not execute them - - -M - --no-make - does not execute CMake and make before running tests - - - standard flags: - - --help - displays this help and terminates - -EOF - - exit 0 - ;; - *) - - >&2 echo "$ScriptPath: unrecognised argument '$1'; use --help for usage" - - exit 1 - ;; - esac - - shift -done - - -# ########################################################## -# main() - -status=0 - -if [ $RunMake -ne 0 ]; then - - if [ $ListOnly -eq 0 ]; then - - echo "Executing build (via command \`$MakeCmd\`) and then running all component and unit test programs" - - mkdir -p $CMakeDir || exit 1 - - cd $CMakeDir - - $MakeCmd - status=$? - - cd ->/dev/null - fi -else - - if [ ! -d "$CMakeDir" ] || [ ! -f "$CMakeDir/CMakeCache.txt" ] || [ ! -d "$CMakeDir/CMakeFiles" ]; then - - >&2 echo "$ScriptPath: cannot run in '--no-make' mode without a previous successful build step" - fi -fi - -if [ $status -eq 0 ]; then - - if [ $ListOnly -ne 0 ]; then - - echo "Listing all component and unit test programs" - else - - echo "Running all component and unit test programs" - fi - - for f in $(find $CMakeDir -type f '(' -name "*${ProjectName}*test*" ')' -exec test -x {} \; -print) - do - - if [ $ListOnly -ne 0 ]; then - - echo "would execute $f:" - - continue - fi - - if $f; then - - : - else - - status=$? - - break 1 - fi - done -fi - -exit $status - - -# ############################## end of file ############################# # - From 09b21e8ef483cffe81d9b3d5c3b3b060a27a6ea3 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 3 Aug 2026 09:18:07 +1000 Subject: [PATCH 23/30] fix --- makefile | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 makefile diff --git a/makefile b/makefile deleted file mode 100644 index e69de29..0000000 From 36324b25b6fa2e123e6a1e531d7dfe2bfd64042e Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 3 Aug 2026 09:27:40 +1000 Subject: [PATCH 24/30] final touches --- .gitattributes | 4 ++-- CHANGES.md | 17 ++++++++++++++--- NEWS.md | 4 ++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/.gitattributes b/.gitattributes index e6605d1..a9c5470 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,5 @@ *.c linguist-language=C -*.cmake linguist-language=CMake +*.cmake linguist-vendored *.cmd linguist-detectable=false *.cpp linguist-language=C++ *.cxx linguist-language=C++ @@ -13,5 +13,5 @@ *.sln linguist-detectable=false *.vcxproj linguist-detectable=false *.vimrc linguist-detectable=false -CMakeLists.txt linguist-language=CMake +CMakeLists.txt linguist-vendored makefile linguist-detectable=false diff --git a/CHANGES.md b/CHANGES.md index 4addf22..64f6fbb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,9 +1,20 @@ -# **realpath** Changes +# **realpath** Changes -## T.B.C. +## 0.0.3 - 3rd August 2026 +* Added modular GitHub Actions CI (**ci.yml** / **ci-cell.yml**) for Windows (Windows-only tool); +* Modernised **CMakeLists.txt** (explicit Windows-only guard; **STLSoft** discovery/`STLSOFT` override; MSVC options; `BUILD_TESTING`); +* Added CMake helper scripts (**prepare_cmake.sh**, **build_cmake.sh**, **clean_cmake.sh**, **remove_cmake_artefacts.sh**) and **run_all_unit_tests.cmd**; +* Added **cmake/BuildType.cmake**; +* Added **.sis/script_info_lines.txt** and **.sis/project_name.txt**; +* Project boilerplate bootstrap (**.gitattributes**, **.gitignore**, **.vimrc**, **.vscode/settings.json**, **AUTHORS.md**, **LICENSE**, **README.md**, **INSTALL.md**, **TODO.md**, **NEWS.md**); +* Fixed missing standard-library includes in **realpath.cpp**; - +## 0.0.2 - 4th May 2025 + +* Added CMake support (**CMakeLists.txt**); + + diff --git a/NEWS.md b/NEWS.md index a4bf825..b419039 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,8 +3,8 @@ | Date | News Item | | -------------------- | -------------------------------------------------- | - +| 3rd August 2026 | 0.0.3 released | +| 4th May 2025 | 0.0.2 released | - From 5995346140d544eca132d30dc53177dbfcf80f00 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 17 Aug 2026 07:25:53 +1000 Subject: [PATCH 25/30] boilerplate --- INSTALL.md | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++- README.md | 36 ++++++++++++++++++++---------- 2 files changed, 88 insertions(+), 13 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index fdf6151..94bb18e 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,6 +1,69 @@ # realpath - Installation and Use +- [Requisites](#requisites) +- [Building](#building) + - [via CMake](#via-cmake) - +## Requisites + +**realpath** is a **Windows-only** program (implemented in [**realpath.cpp**](./realpath.cpp)) and depends on: + +* [**STLSoft**](https://github.com/synesissoftware/STLSoft) (1.11+) - **WinSTL** absolute-path and error-description components; + + +## Building + + +### via CMake + +The primary choice for installation is by use of **CMake** on Windows. + +1. Obtain the latest distribution of **realpath**, from + https://github.com/sistools/realpath/, e.g. + + ```bash + $ mkdir -p ~/open-source + $ cd ~/open-source + $ git clone https://github.com/sistools/realpath/ + ``` + +2. Prepare the CMake configuration, via the **prepare_cmake.sh** script, as + in: + + ```bash + $ cd ~/open-source/realpath + $ ./prepare_cmake.sh + ``` + + (**NOTE**: configuring on a non-Windows host fails: the tool targets + Windows only.) + +3. Run a build of the generated **CMake**-derived build files via the + **build_cmake.sh** script, as in: + + ```bash + $ cd ~/open-source/realpath + $ ./build_cmake.sh + ``` + + (**NOTE**: if you provide the flag `--run-make` (=== `-m`) in step 2 then you do + not need this step.) + +4. As a check, execute the built program, as in: + + ```bash + $ cd ~/open-source/realpath + $ ./_build/realpath --help + ``` + +5. Finally, if you wish to do so, you can install the tool on the host, via `cmake`, as in: + + ```bash + $ cd ~/open-source/realpath + $ cmake --install ./_build --config Release + ``` + + + diff --git a/README.md b/README.md index 46235e0..778fd14 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # realpath +Windows analogue of the Unix **realpath**(1) utility. + ![C++](https://img.shields.io/badge/C%2B%2B-00599C?style=flat&logo=c%2B%2B&logoColor=white) [![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) @@ -17,29 +19,33 @@ - [Project Information](#project-information) - [Where to get help](#where-to-get-help) - [Contribution guidelines](#contribution-guidelines) - - [Tests-only Dependencies](#tests-only-dependencies) + - [Dependencies](#dependencies) - [Related projects](#related-projects) - [License](#license) ## Introduction -T.B.C. +**realpath** is a small, standalone Windows utility that prints the absolute path of a given (possibly relative) path, implemented in terms of the **STLSoft** / **WinSTL** libraries. It is a **Windows-only** analogue of Unix **realpath**(1). ## Installation -T.B.C. +Detailed instructions - via **CMake** - are provided in the accompanying [INSTALL.md](./INSTALL.md) +file. ## Components -T.B.C. +The project creates a single executable program, **realpath**. ## Examples -T.B.C. +```bat +> realpath . +C:\Users\...\sistools\realpath +``` ## Project Information @@ -47,28 +53,34 @@ T.B.C. ### Where to get help -T.B.C. +[GitHub Page](https://github.com/sistools/realpath "GitHub Page") ### Contribution guidelines -T.B.C. +Defect reports, feature requests, and pull requests are welcome on [the **realpath** GitHub page](https://github.com/sistools/realpath). + +### Dependencies -#### Tests-only Dependencies +**realpath** depends on: -T.B.C. +* [**STLSoft**](https://github.com/synesissoftware/STLSoft) (1.11+; **WinSTL**); ### Related projects -T.B.C. +Other (similar) projects include: + +* [**chomp**](https://github.com/sistools/chomp); +* [**lstrip**](https://github.com/sistools/lstrip); +* [**mksock**](https://github.com/sistools/mksock); +* [**rstrip**](https://github.com/sistools/rstrip); ### License -**lstrip** is released under the 3-clause BSD license. See [LICENSE](./LICENSE) for details. +**realpath** is released under the 3-clause BSD license. See [LICENSE](./LICENSE) for details. - From bf392ba12c7cd7bbba2a03bd9ebb1281321c6821 Mon Sep 17 00:00:00 2001 From: Matt Wilson <152443343+mwsis@users.noreply.github.com> Date: Wed, 19 Aug 2026 10:56:08 +1000 Subject: [PATCH 26/30] Boilerplate (#4) * Boilerplate, CI (#2) * .gitattributes * .vimrc * chore: VS Code settings * chore: added **NEWS.md** * chore: markdown files structure * chore: added **README.md** badges * chore: added boilerplate files * chore: .sis abstraction of the helper scripts * LICENSE * .gitignore * chore * fix: CMake dependencies * chore: added (empty) makefile * chore: canonicalising helper scripts * chore: canonicalising helper scripts * chore: canonicalising CMakeLists.txt * chore: canonicalising CMakeLists.txt * feature: CMakeLists.txt * chore: project files * feature: added GitHub Actions CI * fix * fix * fix * final touches * version * Version (#3) * ~ ignores * ~ settings * + added CMakeLists.txt * + enforcing minimum STLSoft version (in code) * ~ whitespace * + enforcing minimum C++ standard version (in code) * + added support for '--help' flag * ~ simplification * + added support for '--version' flag * + added support for '--version' flag * added .gitattributes * settings * squash-commit * CI * .vscode/settings.json * .gitattributes * ci * README.md "related projects" * README.md operating-system badge * README.md initial contents * boilerplate * chore: standardise helper project identity handling * chore: standardize shell-script color output * chore: canonicalised helper scripts * CMake * CMake * squash-commit --------- Co-authored-by: Matt Wilson --- .gitattributes | 116 ++++++++++++++++++++++++++++++++------ .github/workflows/ci.yml | 5 ++ .vscode/settings.json | 18 +++++- CHANGES.md | 6 +- CMakeLists.txt | 14 +++-- INSTALL.md | 45 +++++++++++++++ README.md | 18 ++++-- TODO.md | 7 ++- build_cmake.sh | 34 ++++++++--- clean_cmake.sh | 32 +++++++++-- prepare_cmake.sh | 54 ++++++++++++++++-- realpath.cpp | 19 ++++++- remove_cmake_artefacts.sh | 30 ++++++++-- run_all_unit_tests.cmd | 86 ++++++++++++++-------------- 14 files changed, 384 insertions(+), 100 deletions(-) diff --git a/.gitattributes b/.gitattributes index a9c5470..66f0c82 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,17 +1,99 @@ -*.c linguist-language=C -*.cmake linguist-vendored -*.cmd linguist-detectable=false -*.cpp linguist-language=C++ -*.cxx linguist-language=C++ -*.dsp linguist-detectable=false -*.dsw linguist-detectable=false -*.h linguist-language=C -*.hpp linguist-language=C++ -*.html linguist-detectable=false -*.hxx linguist-language=C++ -*.sh linguist-detectable=false -*.sln linguist-detectable=false -*.vcxproj linguist-detectable=false -*.vimrc linguist-detectable=false -CMakeLists.txt linguist-vendored -makefile linguist-detectable=false +# .gitattributes — C++ (GitHub-hosted) +# +# Sources: GitHub Docs (line endings), git-scm gitattributes (diff=cpp), +# gitattributes/gitattributes C++.gitattributes + Common.gitattributes, +# github-linguist overrides. + +# Default: detect text, normalize to LF in the repository +* text=auto + +# --- Source --- +*.c text diff=cpp +*.c++ text diff=cpp +*.cc text diff=cpp +*.cpp text diff=cpp +*.cxx text diff=cpp +*.h text diff=cpp +*.h++ text diff=cpp +*.hh text diff=cpp +*.hpp text diff=cpp +*.hxx text diff=cpp +*.inc text +*.inl text +*.ipp text +*.tcc text +*.tpp text + +# --- Build / config --- +*.am text +*.cmake text +*.m4 text +*.mak text +*.mk text +*akefile text +CMakeLists.txt text +configure text eol=lf +configure.ac text + +# --- Scripts --- +*.bash text eol=lf +*.bat text eol=crlf +*.cmd text eol=crlf +*.ps1 text eol=crlf +*.sh text eol=lf +*.zsh text eol=lf + +# --- Docs / meta --- +*.adoc text +*.markdown text diff=markdown +*.md text diff=markdown +*.txt text +AUTHORS text +CHANGELOG text +CHANGES text +CONTRIBUTING text +COPYING text +LICENSE text +NEWS text +README text +TODO text +.gitattributes text +.gitignore text + +# --- Serialisation --- +*.json text +*.toml text +*.xml text +*.yaml text +*.yml text + +# --- Compiled / binary artefacts --- +*.a binary +*.dll binary +*.dylib binary +*.exe binary +*.gch binary +*.la binary +*.lai binary +*.lib binary +*.lo binary +*.o binary +*.obj binary +*.out binary +*.pch binary +*.slo binary +*.so binary + +# --- Archives / images (common) --- +*.gif binary +*.gz binary +*.ico binary +*.jpeg binary +*.jpg binary +*.png binary +*.tar binary +*.zip binary + +# --- GitHub Linguist --- +**/build/** linguist-generated +**/cmake-build-*/** linguist-generated diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 05d1e48..fe85f6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,7 +4,12 @@ on: push: branches: - master + - dev - boilerplate + - idiomatic + - rc1 + - rc2 + - rc3 pull_request: concurrency: diff --git a/.vscode/settings.json b/.vscode/settings.json index 4044afc..4f84e5d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,6 +5,8 @@ "editor.tabSize": 4, }, "[c]": { + "editor.defaultFormatter": "ms-vscode.cpptools", + "editor.formatOnSave": true, "editor.insertSpaces": true, "editor.rulers": [ 60, 64, 68, 72, 76 ], "editor.tabSize": 4, @@ -14,6 +16,8 @@ "editor.tabSize": 4, }, "[cpp]": { + "editor.defaultFormatter": "ms-vscode.cpptools", + "editor.formatOnSave": true, "editor.insertSpaces": true, "editor.rulers": [ 60, 64, 68, 72, 76 ], "editor.tabSize": 4, @@ -49,7 +53,17 @@ "editor.insertSpaces": true, "editor.tabSize": 2, }, + "C_Cpp.autocompleteAddParentheses": true, + "C_Cpp.clang_format_fallbackStyle": "none", + "C_Cpp.clang_format_style": "file", + "C_Cpp.default.cStandard": "c17", + "C_Cpp.default.cppStandard": "c++17", + "C_Cpp.enhancedColorization": "enabled", + "C_Cpp.errorSquiggles": "enabled", + "C_Cpp.formatting": "clangFormat", + "C_Cpp.intelliSenseEngine": "default", "cmake.configureOnOpen": false, + "debug.allowBreakpointsEverywhere": true, "editor.detectIndentation": false, "editor.insertSpaces": false, "editor.renderWhitespace": "all", @@ -128,10 +142,13 @@ "numeric": "cpp", "optional": "cpp", "ostream": "cpp", + "print": "cpp", "queue": "cpp", "random": "cpp", "ranges": "cpp", "ratio": "cpp", + "rc.h": "c", + "result_codes_.h": "c", "semaphore": "cpp", "set": "cpp", "setenv.h": "c", @@ -180,4 +197,3 @@ "files.trimTrailingWhitespace": true, "git.mergeEditor": false, } - diff --git a/CHANGES.md b/CHANGES.md index 64f6fbb..cd31c6c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,7 +1,11 @@ # **realpath** Changes -## 0.0.3 - 3rd August 2026 +## 0.1.0 - 6th August 2026 + + + +## 0.0.3 - 5th August 2026 * Added modular GitHub Actions CI (**ci.yml** / **ci-cell.yml**) for Windows (Windows-only tool); * Modernised **CMakeLists.txt** (explicit Windows-only guard; **STLSoft** discovery/`STLSOFT` override; MSVC options; `BUILD_TESTING`); diff --git a/CMakeLists.txt b/CMakeLists.txt index 127c7ff..7ababa6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ # Purpose: Top-level CMake lists file for realpath # # Created: 31st December 2024 -# Updated: 3rd August 2026 +# Updated: 5th August 2026 # # ######################################################################## # @@ -56,10 +56,16 @@ set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT # adhere strictly to C and C++ standards plus extensions. These are actually # useless since we do not compile anything; they merely state our intention. -set(CMAKE_C_STANDARD 17) +if(NOT CMAKE_C_STANDARD) + + set(CMAKE_C_STANDARD 17) +endif() set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS ON) # GNU extensions and POSIX standard -set(CMAKE_CXX_STANDARD 17) +if(NOT CMAKE_CXX_STANDARD) + + set(CMAKE_CXX_STANDARD 17) +endif() set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS ON) @@ -227,7 +233,7 @@ endif(BUILD_TESTING) # ########################################################## # completion -message(NOTICE "Generating CMake build scripts for ${PROJECT_NAME} ${PROJECT_VERSION}, for C${CMAKE_C_STANDARD} C++${CMAKE_CXX_STANDARD}") +message(NOTICE "Generating CMake build scripts for ${PROJECT_NAME} ${PROJECT_VERSION}, for C${CMAKE_C_STANDARD} C++${CMAKE_CXX_STANDARD}, with build type ${CMAKE_BUILD_TYPE}") # ############################## end of file ############################# # diff --git a/INSTALL.md b/INSTALL.md index 94bb18e..71a338d 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -66,4 +66,49 @@ The primary choice for installation is by use of **CMake** on Windows. ``` +## Requisites + +**realpath** requires: + +* [**STLSoft**](https://github.com/synesissoftware/STLSoft), version 1.11.1 + or later; +* CMake 3.20 or later; +* a Windows C/C++ toolchain supported by CMake. + + +## Building + +The primary build method is CMake. From PowerShell: + +```powershell +git clone https://github.com/sistools/realpath.git +Set-Location realpath +cmake -S . -B _build +cmake --build _build --config Release +``` + +The resulting executable is `_build/Release/realpath.exe`. + + +## Installing + +To install into a user-local directory: + +```powershell +cmake --install _build --config Release --prefix "$env:LOCALAPPDATA\Programs\realpath" +``` + +The installed executable is placed in the `bin` directory beneath the +selected prefix. + + +## Testing + +Configure the project with `-DBUILD_TESTING=ON` to build its tests, then run: + +```powershell +ctest --test-dir _build -C Release --output-on-failure +``` + + diff --git a/README.md b/README.md index 778fd14..2e2f639 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ Windows analogue of the Unix **realpath**(1) utility. ![C++](https://img.shields.io/badge/C%2B%2B-00599C?style=flat&logo=c%2B%2B&logoColor=white) +![Windows](https://img.shields.io/badge/OS-Windows-0078D6?style=flat&logo=windows&logoColor=white) [![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) [![GitHub release](https://img.shields.io/github/v/release/sistools/realpath.svg)](https://github.com/sistools/realpath/releases/latest) [![Last Commit](https://img.shields.io/github/last-commit/sistools/realpath)](https://github.com/sistools/realpath/commits/master) @@ -58,29 +59,36 @@ C:\Users\...\sistools\realpath ### Contribution guidelines -Defect reports, feature requests, and pull requests are welcome on [the **realpath** GitHub page](https://github.com/sistools/realpath). +Defect reports, feature requests, and pull requests are welcome on [the +**realpath** GitHub page](https://github.com/sistools/realpath). ### Dependencies **realpath** depends on: -* [**STLSoft**](https://github.com/synesissoftware/STLSoft) (1.11+; **WinSTL**); +* [**STLSoft**](https://github.com/synesissoftware/STLSoft) (1.11+; **WinSTL**, **PlatformSTL**); ### Related projects -Other (similar) projects include: +Other **sistools** projects include: * [**chomp**](https://github.com/sistools/chomp); +* [**errni**](https://github.com/sistools/errni) (errno on all platforms, and also GetLastError codes on Windows); +* [**lnunique**](https://github.com/sistools/lnunique); +* [**lslocales**](https://github.com/sistools/lslocales); * [**lstrip**](https://github.com/sistools/lstrip); -* [**mksock**](https://github.com/sistools/mksock); +* [**mksock**](https://github.com/sistools/mksock) (Unix-only); +* [**ReadDebugString**](https://github.com/sistools/ReadDebugString) (Windows-only); * [**rstrip**](https://github.com/sistools/rstrip); +* [**WriteDebugString**](https://github.com/sistools/WriteDebugString) (Windows-only); ### License -**realpath** is released under the 3-clause BSD license. See [LICENSE](./LICENSE) for details. +**realpath** is released under the 3-clause BSD license. See [LICENSE](./LICENSE) +for details. diff --git a/TODO.md b/TODO.md index 7c2dfb1..5fc88c7 100644 --- a/TODO.md +++ b/TODO.md @@ -1,10 +1,11 @@ # realpath - TODO list -## mksock 0.0.x TODOs: +## realpath 0.0.x TODOs: -* \ +* Review and expand **INSTALL.md** as the build and dependency requirements evolve; +* Add **REQUISITES.md** (at least **STLSoft**); +* Set GitHub repository topics: `cpp`, `cli`, `command-line`, `cmake`, `stlsoft`, `windows`, `win32`, `filesystem`, `path`, `bsd-3-clause`, `sistools`; - diff --git a/build_cmake.sh b/build_cmake.sh index cca1448..3f261e7 100755 --- a/build_cmake.sh +++ b/build_cmake.sh @@ -1,8 +1,9 @@ #! /bin/bash ScriptPath=$0 -Dir=$(cd $(dirname "$ScriptPath"); pwd) +Dir=$(cd "$(dirname "$ScriptPath")" && pwd) Basename=$(basename "$ScriptPath") + CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} if [[ -n "$MSYSTEM" ]]; then @@ -13,11 +14,31 @@ else DefaultMakeCmd=make fi MakeCmd=${SIS_CMAKE_MAKE_COMMAND:-${SIS_CMAKE_COMMAND:-$DefaultMakeCmd}} +ProjectNameFile="$Dir/.sis/project_name.txt" +ProjectName=$(tr -d '[:space:]' < "$ProjectNameFile") IgnoreRemainingFlagsAndOptions=0 Targets=() +# ########################################################## +# colours + +if command -v tput > /dev/null; then + + SisClr_Blue=${FG_BLUE:-$(tput setaf 4)} + SisClr_Red=${FG_RED:-$(tput setaf 1)} + SisClr_Bold=${FD_BOLD:-$(tput bold)} + SisClr_None=${FD_NONE:-$(tput sgr0)} +else + + SisClr_Blue= + SisClr_Red= + SisClr_Bold= + SisClr_None= +fi + + # ########################################################## # functions @@ -77,7 +98,7 @@ EOF ;; *) - >&2 echo "$ScriptPath: unrecognised argument '$1'; use --help for usage" + >&2 echo "$ScriptPath: ${SisClr_Red}${SisClr_Bold}unrecognised argument '$1'${SisClr_None}; use --help for usage" exit 1 ;; @@ -92,7 +113,7 @@ done if [ ! -d "$CMakeDir" ]; then - >&2 echo "$ScriptPath: CMake build directory '$CMakeDir' not found so nothing to do; use script 'prepare_cmake.sh' if you wish to prepare CMake artefacts" + >&2 echo "$ScriptPath: ${SisClr_Red}${SisClr_Bold}CMake build directory '$CMakeDir' not found${SisClr_None} so nothing to do; use script 'prepare_cmake.sh' if you wish to prepare CMake artefacts" exit 1 else @@ -101,7 +122,7 @@ else if [ ! -f "$CMakeDir/Makefile" ]; then - >&2 echo "$ScriptPath: CMake build directory '$CMakeDir' does not contain expected file 'Makefile', so a clean cannot be performed. It is recommended that you remove all CMake artefacts using script 'remove_cmake_artefacts.sh' followed by regeneration via 'prepare_cmake.sh'" + >&2 echo "$ScriptPath: ${SisClr_Red}${SisClr_Bold}CMake build directory '$CMakeDir' does not contain expected file 'Makefile'${SisClr_None}, so a clean cannot be performed. It is recommended that you remove all CMake artefacts using script 'remove_cmake_artefacts.sh' followed by regeneration via 'prepare_cmake.sh'" cd ->/dev/null @@ -110,10 +131,10 @@ else if [ -z "$Targets" ]; then - echo "Executing build (via command \`$MakeCmd\`)" + echo "Executing build of ${SisClr_Blue}${SisClr_Bold}${ProjectName}${SisClr_None} (via command \`${SisClr_Blue}${SisClr_Bold}$MakeCmd${SisClr_None}\`)" else - echo "Executing build (via command \`$MakeCmd\`) with specific target(s) $(join_by , "${Targets[@]}")" + echo "Executing build of ${SisClr_Blue}${SisClr_Bold}${ProjectName}${SisClr_None} (via command \`${SisClr_Blue}${SisClr_Bold}$MakeCmd${SisClr_None}\`) with specific target(s) $(join_by , "${Targets[@]}")" fi $MakeCmd ${Targets[*]} @@ -127,4 +148,3 @@ fi # ############################## end of file ############################# # - diff --git a/clean_cmake.sh b/clean_cmake.sh index 886a201..96b6c07 100755 --- a/clean_cmake.sh +++ b/clean_cmake.sh @@ -1,8 +1,9 @@ #! /bin/bash ScriptPath=$0 -Dir=$(cd $(dirname "$ScriptPath"); pwd) +Dir=$(cd "$(dirname "$ScriptPath")" && pwd) Basename=$(basename "$ScriptPath") + CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} if [[ -n "$MSYSTEM" ]]; then @@ -13,6 +14,26 @@ else DefaultMakeCmd=make fi MakeCmd=${SIS_CMAKE_MAKE_COMMAND:-${SIS_CMAKE_COMMAND:-$DefaultMakeCmd}} +ProjectNameFile="$Dir/.sis/project_name.txt" +ProjectName=$(tr -d '[:space:]' < "$ProjectNameFile") + + +# ########################################################## +# colours + +if command -v tput > /dev/null; then + + SisClr_Blue=${FG_BLUE:-$(tput setaf 4)} + SisClr_Red=${FG_RED:-$(tput setaf 1)} + SisClr_Bold=${FD_BOLD:-$(tput bold)} + SisClr_None=${FD_NONE:-$(tput sgr0)} +else + + SisClr_Blue= + SisClr_Red= + SisClr_Bold= + SisClr_None= +fi # ########################################################## @@ -45,7 +66,7 @@ EOF ;; *) - >&2 echo "$ScriptPath: unrecognised argument '$1'; use --help for usage" + >&2 echo "$ScriptPath: ${SisClr_Red}${SisClr_Bold}unrecognised argument '$1'${SisClr_None}; use --help for usage" exit 1 ;; @@ -60,7 +81,7 @@ done if [ ! -d "$CMakeDir" ]; then - >&2 echo "$ScriptPath: CMake build directory '$CMakeDir' not found so nothing to do; use script 'prepare_cmake.sh' if you wish to prepare CMake artefacts" + >&2 echo "$ScriptPath: ${SisClr_Red}${SisClr_Bold}CMake build directory '$CMakeDir' not found${SisClr_None} so nothing to do; use script 'prepare_cmake.sh' if you wish to prepare CMake artefacts" exit 1 else @@ -69,14 +90,14 @@ else if [ ! -f "$CMakeDir/Makefile" ]; then - >&2 echo "$ScriptPath: CMake build directory '$CMakeDir' does not contain expected file 'Makefile', so a clean cannot be performed. It is recommended that you remove all CMake artefacts using script 'remove_cmake_artefacts.sh' followed by regeneration via 'prepare_cmake.sh'" + >&2 echo "$ScriptPath: ${SisClr_Red}${SisClr_Bold}CMake build directory '$CMakeDir' does not contain expected file 'Makefile'${SisClr_None}, so a clean cannot be performed. It is recommended that you remove all CMake artefacts using script 'remove_cmake_artefacts.sh' followed by regeneration via 'prepare_cmake.sh'" cd ->/dev/null exit 1 else - echo "Cleaning build (via command \`$MakeCmd clean\`)" + echo "Cleaning ${SisClr_Blue}${SisClr_Bold}${ProjectName}${SisClr_None} (via command \`${SisClr_Blue}${SisClr_Bold}$MakeCmd clean${SisClr_None}\`)" $MakeCmd clean status=$? @@ -89,4 +110,3 @@ fi # ############################## end of file ############################# # - diff --git a/prepare_cmake.sh b/prepare_cmake.sh index d837045..6253e78 100755 --- a/prepare_cmake.sh +++ b/prepare_cmake.sh @@ -1,8 +1,9 @@ #! /bin/bash ScriptPath=$0 -Dir=$(cd $(dirname "$ScriptPath"); pwd) +Dir=$(cd "$(dirname "$ScriptPath")" && pwd) Basename=$(basename "$ScriptPath") + CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} if [[ -n "$MSYSTEM" ]]; then @@ -13,8 +14,11 @@ else DefaultMakeCmd=make fi MakeCmd=${SIS_CMAKE_MAKE_COMMAND:-${SIS_CMAKE_COMMAND:-$DefaultMakeCmd}} +ProjectNameFile="$Dir/.sis/project_name.txt" +ProjectName=$(tr -d '[:space:]' < "$ProjectNameFile") Configuration=Release +CxxStandard= MSVC_MT=0 MinGW="${MinGW:=0}" RunMake=0 @@ -23,12 +27,45 @@ TestingDisabled=0 VerboseMakefile=0 +# ########################################################## +# colours + +if command -v tput > /dev/null; then + + SisClr_Blue=${FG_BLUE:-$(tput setaf 4)} + SisClr_Red=${FG_RED:-$(tput setaf 1)} + SisClr_Bold=${FD_BOLD:-$(tput bold)} + SisClr_None=${FD_NONE:-$(tput sgr0)} +else + + SisClr_Blue= + SisClr_Red= + SisClr_Bold= + SisClr_None= +fi + + # ########################################################## # command-line handling while [[ $# -gt 0 ]]; do case $1 in + --cxx-standard) + + shift + CxxStandard=$1 + case $CxxStandard in + 98|11|14|17|20|23) + ;; + *) + + >&2 echo "$ScriptPath: ${SisClr_Red}${SisClr_Bold}invalid C++ standard '$CStandard'${SisClr_None}; expected 98, 11, 14, 17, 20, or 23" + + exit 1 + ;; + esac + ;; --cmake-verbose-makefile|-v) VerboseMakefile=1 @@ -70,6 +107,9 @@ Flags/options: behaviour: + --cxx-standard {98|11|14|17|20|23} + sets CMAKE_CXX_STANDARD (default is 17) + -v --cmake-verbose-makefile configures CMake to run verbosely (by setting CMAKE_VERBOSE_MAKEFILE @@ -114,7 +154,7 @@ EOF ;; *) - >&2 echo "$ScriptPath: unrecognised argument '$1'; use --help for usage" + >&2 echo "$ScriptPath: ${SisClr_Red}${SisClr_Bold}unrecognised argument '$1'${SisClr_None}; use --help for usage" exit 1 ;; @@ -131,16 +171,18 @@ mkdir -p $CMakeDir || exit 1 cd $CMakeDir -echo "Executing CMake (in ${CMakeDir})" +echo "Executing CMake for ${SisClr_Blue}${SisClr_Bold}${ProjectName}${SisClr_None} (in ${SisClr_Blue}${SisClr_Bold}${CMakeDir}${SisClr_None})" +if [ -z "$CxxStandard" ]; then CMakeCxxStandardVariable="" ; else CMakeCxxStandardVariable="-DCMAKE_CXX_STANDARD=$CxxStandard" ; fi if [ $MSVC_MT -eq 0 ]; then CMakeMsvcMtFlag="OFF" ; else CMakeMsvcMtFlag="ON" ; fi -if [ -z $STLSoftDirGiven ]; then CMakeSTLSoftVariable="" ; else CMakeSTLSoftVariable="-DSTLSOFT=$STLSoftDirGiven/" ; fi +if [ -z "$STLSoftDirGiven" ]; then CMakeSTLSoftVariable="" ; else CMakeSTLSoftVariable="-DSTLSOFT=$STLSoftDirGiven/" ; fi if [ $TestingDisabled -eq 0 ]; then CMakeBuildTestingFlag="ON" ; else CMakeBuildTestingFlag="OFF" ; fi if [ $VerboseMakefile -eq 0 ]; then CMakeVerboseMakefileFlag="OFF" ; else CMakeVerboseMakefileFlag="ON" ; fi if [ $MinGW -ne 0 ]; then cmake \ + $CMakeCxxStandardVariable \ $CMakeSTLSoftVariable \ -DBUILD_TESTING:BOOL=$CMakeBuildTestingFlag \ -DCMAKE_BUILD_TYPE=$Configuration \ @@ -151,6 +193,7 @@ if [ $MinGW -ne 0 ]; then else cmake \ + $CMakeCxxStandardVariable \ $CMakeSTLSoftVariable \ -DBUILD_TESTING:BOOL=$CMakeBuildTestingFlag \ -DCMAKE_BUILD_TYPE=$Configuration \ @@ -165,7 +208,7 @@ status=0 if [ $RunMake -ne 0 ]; then - echo "Executing build (via command \`$MakeCmd\`)" + echo "Executing build (via command \`${SisClr_Blue}${SisClr_Bold}$MakeCmd${SisClr_None}\`)" $MakeCmd status=$? @@ -183,4 +226,3 @@ exit $status # ############################## end of file ############################# # - diff --git a/realpath.cpp b/realpath.cpp index dcd0ba2..22dbf4a 100644 --- a/realpath.cpp +++ b/realpath.cpp @@ -19,8 +19,8 @@ #define REALPATH_VER_MAJOR 0 -#define REALPATH_VER_MINOR 0 -#define REALPATH_VER_PATCH 3 +#define REALPATH_VER_MINOR 1 +#define REALPATH_VER_PATCH 0 int main(int argc, char* argv[]) @@ -42,6 +42,21 @@ int main(int argc, char* argv[]) return EXIT_SUCCESS; } else + if (0 == std::strcmp("--version", argv[1])) + { + std::cout + << program_name + << " v" + << REALPATH_VER_MAJOR + << '.' + << REALPATH_VER_MINOR + << '.' + << REALPATH_VER_PATCH + << std::endl; + + return EXIT_SUCCESS; + } + else { winstl::absolute_path abs_path(argv[1]); diff --git a/remove_cmake_artefacts.sh b/remove_cmake_artefacts.sh index 7416db9..992153f 100755 --- a/remove_cmake_artefacts.sh +++ b/remove_cmake_artefacts.sh @@ -1,9 +1,12 @@ #! /bin/bash ScriptPath=$0 -Dir=$(cd $(dirname "$ScriptPath"); pwd) +Dir=$(cd "$(dirname "$ScriptPath")" && pwd) Basename=$(basename "$ScriptPath") + CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} +ProjectNameFile="$Dir/.sis/project_name.txt" +ProjectName=$(tr -d '[:space:]' < "$ProjectNameFile") Directories=( CMakeFiles @@ -24,6 +27,24 @@ Files=( ) +# ########################################################## +# colours + +if command -v tput > /dev/null; then + + SisClr_Blue=${FG_BLUE:-$(tput setaf 4)} + SisClr_Red=${FG_RED:-$(tput setaf 1)} + SisClr_Bold=${FD_BOLD:-$(tput bold)} + SisClr_None=${FD_NONE:-$(tput sgr0)} +else + + SisClr_Blue= + SisClr_Red= + SisClr_Bold= + SisClr_None= +fi + + # ########################################################## # operating environment detection @@ -78,7 +99,7 @@ EOF ;; *) - >&2 echo "$ScriptPath: unrecognised argument '$1'; use --help for usage" + >&2 echo "$ScriptPath: ${SisClr_Red}${SisClr_Bold}unrecognised argument '$1'${SisClr_None}; use --help for usage" exit 1 ;; @@ -93,12 +114,12 @@ done if [ ! -d "$CMakeDir" ]; then - echo "$ScriptPath: CMake build directory '$CMakeDir' not found so nothing to do; use script 'prepare_cmake.sh' if you wish to prepare CMake artefacts" + echo "$ScriptPath: CMake build directory '$CMakeDir' ${SisClr_Red}${SisClr_Bold}not found${SisClr_None} so nothing to do; use script 'prepare_cmake.sh' if you wish to prepare CMake artefacts" exit 0 else - echo "Removing all cmake artefacts in '$CMakeDir'" + echo "Removing all ${SisClr_Blue}${SisClr_Bold}${ProjectName}${SisClr_None} cmake artefacts in '${SisClr_Blue}${SisClr_Bold}$CMakeDir${SisClr_None}'" num_dirs_removed=0 num_files_removed=0 @@ -148,4 +169,3 @@ fi # ############################## end of file ############################# # - diff --git a/run_all_unit_tests.cmd b/run_all_unit_tests.cmd index 8c88eae..8c11cf4 100644 --- a/run_all_unit_tests.cmd +++ b/run_all_unit_tests.cmd @@ -6,10 +6,10 @@ SET SCRIPT_DIRECTORY=%~dp0 SET SCRIPT_PATH_DOC=%~n0[%~x0] IF DEFINED SIS_CMAKE_BUILD_DIR ( - SET "CMAKE_DIR=%SIS_CMAKE_BUILD_DIR%" + SET "CMAKE_DIR=%SIS_CMAKE_BUILD_DIR%" ) ELSE ( - SET "CMAKE_DIR=%SCRIPT_DIRECTORY%_build" + SET "CMAKE_DIR=%SCRIPT_DIRECTORY%_build" ) SET ListOnly=0 @@ -17,12 +17,12 @@ SET Verbose=0 SET status=0 FOR %%a IN (%*) DO ( - IF /I {--help}=={%%a} ( - IF EXIST "%SCRIPT_DIRECTORY%.sis\script_info_lines.txt" ( + IF /I {--help}=={%%a} ( + IF EXIST "%SCRIPT_DIRECTORY%.sis\script_info_lines.txt" ( - type "%SCRIPT_DIRECTORY%.sis\script_info_lines.txt" - ) - ECHO ^ + type "%SCRIPT_DIRECTORY%.sis\script_info_lines.txt" + ) + ECHO ^ Runs all ^(matching^) component and unit test programs ^ @@ -71,31 +71,31 @@ Flags/options: ^ displays this help and terminates ^ - EXIT /B 0 - ) ELSE IF /I {-l}=={%%a} ( - SET ListOnly=1 - ) ELSE IF /I {--list-only}=={%%a} ( - SET ListOnly=1 - ) ELSE IF /I {-M}=={%%a} ( - REM no-op: this .cmd never invokes the build - ) ELSE IF /I {--no-make}=={%%a} ( - REM no-op: this .cmd never invokes the build - ) ELSE IF /I {-v}=={%%a} ( - SET Verbose=1 - ) ELSE IF /I {--verbose}=={%%a} ( - SET Verbose=1 - ) ELSE ( - ECHO %SCRIPT_PATH_DOC%: unrecognised argument '%%a'; use --help for usage 1>&2 - - EXIT /B 1 - ) + EXIT /B 0 + ) ELSE IF /I {-l}=={%%a} ( + SET ListOnly=1 + ) ELSE IF /I {--list-only}=={%%a} ( + SET ListOnly=1 + ) ELSE IF /I {-M}=={%%a} ( + REM no-op: this .cmd never invokes the build + ) ELSE IF /I {--no-make}=={%%a} ( + REM no-op: this .cmd never invokes the build + ) ELSE IF /I {-v}=={%%a} ( + SET Verbose=1 + ) ELSE IF /I {--verbose}=={%%a} ( + SET Verbose=1 + ) ELSE ( + ECHO %SCRIPT_PATH_DOC%: unrecognised argument '%%a'; use --help for usage 1>&2 + + EXIT /B 1 + ) ) IF NOT EXIST "%CMAKE_DIR%" ( - ECHO %SCRIPT_PATH_DOC%: CMake build directory '%CMAKE_DIR%' does not exist 1>&2 + ECHO %SCRIPT_PATH_DOC%: CMake build directory '%CMAKE_DIR%' does not exist 1>&2 - EXIT /B 1 + EXIT /B 1 ) SET "ProjectName=" @@ -103,38 +103,38 @@ FOR /F "usebackq delims=" %%p IN ("%SCRIPT_DIRECTORY%.sis\project_name.txt") DO IF NOT DEFINED ProjectName ( - ECHO %SCRIPT_PATH_DOC%: could not read project name from .sis\project_name.txt 1>&2 + ECHO %SCRIPT_PATH_DOC%: could not read project name from .sis\project_name.txt 1>&2 - EXIT /B 1 + EXIT /B 1 ) IF !ListOnly! EQU 1 ( - ECHO Listing all component and unit test programs + ECHO Listing all component and unit test programs ) ELSE ( - ECHO Running all component and unit test programs + ECHO Running all component and unit test programs ) FOR /F "usebackq delims=" %%f IN (`DIR /A:-D /B /S "%CMAKE_DIR%\*.exe" 2^>NUL ^| FINDSTR /I /R "!ProjectName!.*test.*\.exe$"`) DO ( - IF !ListOnly! EQU 1 ( + IF !ListOnly! EQU 1 ( - ECHO would execute %%f: - ) ELSE ( + ECHO would execute %%f: + ) ELSE ( - IF !Verbose! EQU 1 ( + IF !Verbose! EQU 1 ( - ECHO executing %%f: - ) + ECHO executing %%f: + ) - "%%f" - IF ERRORLEVEL 1 ( + "%%f" + IF ERRORLEVEL 1 ( - SET status=1 + SET status=1 - GOTO :done - ) - ) + GOTO :done + ) + ) ) :done From b40e8e6c6691145ec122f376205ae4bdefe6770b Mon Sep 17 00:00:00 2001 From: synesissoftware Date: Sun, 23 Aug 2026 15:50:02 +1000 Subject: [PATCH 27/30] fix: helper scripts (#6) --- .vimrc | 18 +++++++++--------- build_cmake.sh | 1 - clean_cmake.sh | 1 - prepare_cmake.sh | 1 - 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/.vimrc b/.vimrc index 1bf33a0..1163e13 100644 --- a/.vimrc +++ b/.vimrc @@ -43,27 +43,27 @@ autocmd BufWritePre * %s/\s\+$//e augroup sis_c_cxx autocmd! + " [bat] + autocmd FileType bat,dosbatch setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,76 + " [c] / [cpp] autocmd FileType c,cpp setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,64,68,72,76 - " [rust] - autocmd FileType rs setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=76 - " [cmake] autocmd FileType cmake setlocal noexpandtab tabstop=4 shiftwidth=4 softtabstop=4 - " [shellscript] - autocmd FileType sh,bash,zsh setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2 colorcolumn=60,76 - - " [bat] - autocmd FileType bat,dosbatch setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,76 - " [json] / [markdown] / [yaml] / [ruby] autocmd FileType json,markdown,yaml,ruby setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2 " [python] autocmd FileType python setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=60,76 + " [rust] + autocmd FileType rs setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 colorcolumn=76 + + " [shellscript] + autocmd FileType sh,bash,zsh setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2 colorcolumn=60,76 + " [toml] autocmd FileType toml setlocal noexpandtab tabstop=2 shiftwidth=2 softtabstop=2 augroup END diff --git a/build_cmake.sh b/build_cmake.sh index 3f261e7..f081647 100755 --- a/build_cmake.sh +++ b/build_cmake.sh @@ -8,7 +8,6 @@ CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} if [[ -n "$MSYSTEM" ]]; then DefaultMakeCmd=mingw32-make.exe - MinGW=1 else DefaultMakeCmd=make diff --git a/clean_cmake.sh b/clean_cmake.sh index 96b6c07..b2e61b3 100755 --- a/clean_cmake.sh +++ b/clean_cmake.sh @@ -8,7 +8,6 @@ CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} if [[ -n "$MSYSTEM" ]]; then DefaultMakeCmd=mingw32-make.exe - MinGW=1 else DefaultMakeCmd=make diff --git a/prepare_cmake.sh b/prepare_cmake.sh index 6253e78..3c72fb4 100755 --- a/prepare_cmake.sh +++ b/prepare_cmake.sh @@ -8,7 +8,6 @@ CMakeDir=${SIS_CMAKE_BUILD_DIR:-$Dir/_build} if [[ -n "$MSYSTEM" ]]; then DefaultMakeCmd=mingw32-make.exe - MinGW=1 else DefaultMakeCmd=make From 21b898f2b1ad21cad51df9ebc4a4005ea1b3f828 Mon Sep 17 00:00:00 2001 From: Matt Wilson <152443343+mwsis@users.noreply.github.com> Date: Sun, 23 Aug 2026 16:45:56 +1000 Subject: [PATCH 28/30] Version (#5) * ~ ignores * ~ settings * + added CMakeLists.txt * + enforcing minimum STLSoft version (in code) * ~ whitespace * + enforcing minimum C++ standard version (in code) * + added support for '--help' flag * ~ simplification * + added support for '--version' flag * + added support for '--version' flag * added .gitattributes * Boilerplate, CI (#2) * .gitattributes * .vimrc * chore: VS Code settings * chore: added **NEWS.md** * chore: markdown files structure * chore: added **README.md** badges * chore: added boilerplate files * chore: .sis abstraction of the helper scripts * LICENSE * .gitignore * chore * fix: CMake dependencies * chore: added (empty) makefile * chore: canonicalising helper scripts * chore: canonicalising helper scripts * chore: canonicalising CMakeLists.txt * chore: canonicalising CMakeLists.txt * feature: CMakeLists.txt * chore: project files * feature: added GitHub Actions CI * fix * fix * fix * final touches * version * settings * squash-commit * CI * 0.1.0 * squash-commit * generate_doxygen.cmd --------- Co-authored-by: Matt Wilson --- .github/workflows/ci.yml | 1 + CHANGES.md | 8 ++- INSTALL.md | 4 ++ NEWS.md | 10 +-- generate_doxygen.cmd | 135 +++++++++++++++++++++++++++++++++++++++ prepare_cmake.sh | 2 +- 6 files changed, 154 insertions(+), 6 deletions(-) create mode 100644 generate_doxygen.cmd diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fe85f6f..8ae2494 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,6 +10,7 @@ on: - rc1 - rc2 - rc3 + - version pull_request: concurrency: diff --git a/CHANGES.md b/CHANGES.md index cd31c6c..0a8b0f2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,8 +1,14 @@ # **realpath** Changes -## 0.1.0 - 6th August 2026 +## 0.1.1 - 23rd August 2026 +T.B.C. + + +## 0.1.0 - 16th August 2026 + +* added support for '--version'; ## 0.0.3 - 5th August 2026 diff --git a/INSTALL.md b/INSTALL.md index 71a338d..0746a1a 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -4,6 +4,10 @@ - [Requisites](#requisites) - [Building](#building) - [via CMake](#via-cmake) +- [Requisites](#requisites-1) +- [Building](#building-1) +- [Installing](#installing) +- [Testing](#testing) ## Requisites diff --git a/NEWS.md b/NEWS.md index b419039..8733477 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,10 +1,12 @@ # realpath - News -| Date | News Item | -| -------------------- | -------------------------------------------------- | -| 3rd August 2026 | 0.0.3 released | -| 4th May 2025 | 0.0.2 released | +| Date | News Item | +| -------------------- | ---------------- | +| 23rd August 2026 | [0.1.1 released](https://github.com/sistools/realpath/releases/tag/0.1.1) | +| 16th August 2026 | [0.1.0 released](https://github.com/sistools/realpath/releases/tag/0.1.0) | +| 3rd August 2026 | 0.0.3 released | +| 4th May 2025 | 0.0.2 released | diff --git a/generate_doxygen.cmd b/generate_doxygen.cmd new file mode 100644 index 0000000..abb2811 --- /dev/null +++ b/generate_doxygen.cmd @@ -0,0 +1,135 @@ +@echo off + +SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION + +SET "SCRIPT_DIRECTORY=%~dp0" +SET "SCRIPT_PATH_DOC=%~n0[%~x0]" +IF DEFINED SIS_CMAKE_BUILD_DIR ( + + SET "CMAKE_DIR=%SIS_CMAKE_BUILD_DIR%" +) ELSE ( + + SET "CMAKE_DIR=%SCRIPT_DIRECTORY%_build" +) + +SET "DOXYGEN_OPTIONS=" + +FOR %%a IN (%*) DO ( + IF /I {--help}=={%%a} ( + IF EXIST "%SCRIPT_DIRECTORY%.sis\script_info_lines.txt" ( + + type "%SCRIPT_DIRECTORY%.sis\script_info_lines.txt" + ) + ECHO Generates HTML API documentation from public headers via Doxygen + ECHO( + ECHO %SCRIPT_PATH_DOC% [ ... flags/options ... ] + ECHO( + ECHO Flags/options: + ECHO( + ECHO behaviour: + ECHO( + ECHO -q + ECHO --quiet + ECHO causes the flag -q to be passed to Doxygen, which will then act as + ECHO if QUIET=YES has been set + ECHO( + ECHO( + ECHO standard flags: + ECHO( + ECHO --help + ECHO displays this help and terminates + ECHO( + ECHO Environment: + ECHO( + ECHO SIS_CMAKE_BUILD_DIR + ECHO CMake build directory ^(default: ^/_build^); documentation is + ECHO written to ^/doxygen/html/ + ECHO( + EXIT /B 0 + ) ELSE IF /I {-q}=={%%a} ( + SET "DOXYGEN_OPTIONS=-q" + ) ELSE IF /I {--quiet}=={%%a} ( + SET "DOXYGEN_OPTIONS=-q" + ) ELSE ( + ECHO %SCRIPT_PATH_DOC%: unrecognised argument '%%a'; use --help for usage 1>&2 + + EXIT /B 1 + ) +) + +IF NOT EXIST "%CMAKE_DIR%" ( + + MKDIR "%CMAKE_DIR%" 2>NUL + IF ERRORLEVEL 1 ( + + ECHO %SCRIPT_PATH_DOC%: could not create CMake build directory '%CMAKE_DIR%' 1>&2 + + EXIT /B 1 + ) +) + +PUSHD "%CMAKE_DIR%" >NUL +IF ERRORLEVEL 1 ( + + ECHO %SCRIPT_PATH_DOC%: could not enter CMake build directory '%CMAKE_DIR%' 1>&2 + + EXIT /B 1 +) + +SET "ProjectName=" +FOR /F "usebackq tokens=* delims=" %%p IN ("%SCRIPT_DIRECTORY%.sis\project_name.txt") DO SET "ProjectName=%%p" + +IF NOT DEFINED ProjectName ( + + ECHO %SCRIPT_PATH_DOC%: could not read project name from .sis\project_name.txt 1>&2 + + POPD + EXIT /B 1 +) + +WHERE doxygen >NUL 2>&1 +IF ERRORLEVEL 1 ( + + ECHO %SCRIPT_PATH_DOC%: doxygen not found on PATH 1>&2 + + POPD + EXIT /B 1 +) + +IF NOT EXIST "Doxyfile" ( + + ECHO %SCRIPT_PATH_DOC%: Doxyfile not found in '%CMAKE_DIR%' 1>&2 + + POPD + EXIT /B 1 +) + +IF NOT EXIST "doxygen" ( + MKDIR "doxygen" + IF ERRORLEVEL 1 ( + + ECHO %SCRIPT_PATH_DOC%: could not create '%CMAKE_DIR%\doxygen' 1>&2 + + POPD + EXIT /B 1 + ) +) + +ECHO Executing Doxygen for %ProjectName% (in %CMAKE_DIR%) + +( + type "Doxyfile" + ECHO. + ECHO # Output directory (overridden by %SCRIPT_PATH_DOC%^) + ECHO OUTPUT_DIRECTORY = %CMAKE_DIR%\doxygen +) | doxygen %DOXYGEN_OPTIONS% - +IF ERRORLEVEL 1 ( + + POPD + EXIT /B 1 +) + +ECHO API documentation written to %CMAKE_DIR%\doxygen\html\index.html + +POPD +EXIT /B 0 diff --git a/prepare_cmake.sh b/prepare_cmake.sh index 3c72fb4..f83e2b4 100755 --- a/prepare_cmake.sh +++ b/prepare_cmake.sh @@ -59,7 +59,7 @@ while [[ $# -gt 0 ]]; do ;; *) - >&2 echo "$ScriptPath: ${SisClr_Red}${SisClr_Bold}invalid C++ standard '$CStandard'${SisClr_None}; expected 98, 11, 14, 17, 20, or 23" + >&2 echo "$ScriptPath: ${SisClr_Red}${SisClr_Bold}invalid C++ standard '$CxxStandard'${SisClr_None}; expected 98, 11, 14, 17, 20, or 23" exit 1 ;; From 139ad5cc5e82889b35ef64872455723d9dfe3310 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Sun, 23 Aug 2026 16:56:32 +1000 Subject: [PATCH 29/30] modernise realpath tooling and documentation for 0.1.1 --- CHANGES.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 0a8b0f2..c39757f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,9 +1,16 @@ -# **realpath** Changes +# realpath - Changes ## 0.1.1 - 23rd August 2026 -T.B.C. +* Documented the Windows-only program, its **STLSoft** dependency, and its CMake build, installation, and testing workflows in **README.md** and **INSTALL.md**; +* Clarified the Windows-only scope in **README.md**, including a usage example, project information, and a Windows badge; +* Modernised source-control metadata in **.gitattributes** and editor configuration in **.vimrc** and **.vscode/settings.json**; +* Updated **CMakeLists.txt** to preserve caller-selected C and C++ standards and report the configured build type; +* Improved CMake helper scripts with safer path handling, project-aware diagnostics, configurable C++ standards, and coloured status messages; +* Replaced the POSIX Doxygen helper with the Windows **generate_doxygen.cmd** script; +* Updated GitHub Actions push-branch coverage for the standard development and release branches; +* Corrected release information in **NEWS.md** and updated the outstanding work in **TODO.md**; ## 0.1.0 - 16th August 2026 From c610d4ee3309225107cd7a2cf5b514a805b33c77 Mon Sep 17 00:00:00 2001 From: Matt Wilson Date: Mon, 24 Aug 2026 06:48:28 +1000 Subject: [PATCH 30/30] chore: fixed colour terminal check --- build_cmake.sh | 2 +- clean_cmake.sh | 2 +- prepare_cmake.sh | 2 +- remove_cmake_artefacts.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build_cmake.sh b/build_cmake.sh index f081647..6b96a40 100755 --- a/build_cmake.sh +++ b/build_cmake.sh @@ -23,7 +23,7 @@ Targets=() # ########################################################## # colours -if command -v tput > /dev/null; then +if [ -n "${TERM:-}" ] && [ -t 1 ] && command -v tput >/dev/null 2>&1; then SisClr_Blue=${FG_BLUE:-$(tput setaf 4)} SisClr_Red=${FG_RED:-$(tput setaf 1)} diff --git a/clean_cmake.sh b/clean_cmake.sh index b2e61b3..17d36a3 100755 --- a/clean_cmake.sh +++ b/clean_cmake.sh @@ -20,7 +20,7 @@ ProjectName=$(tr -d '[:space:]' < "$ProjectNameFile") # ########################################################## # colours -if command -v tput > /dev/null; then +if [ -n "${TERM:-}" ] && [ -t 1 ] && command -v tput >/dev/null 2>&1; then SisClr_Blue=${FG_BLUE:-$(tput setaf 4)} SisClr_Red=${FG_RED:-$(tput setaf 1)} diff --git a/prepare_cmake.sh b/prepare_cmake.sh index 287b129..b98a74d 100755 --- a/prepare_cmake.sh +++ b/prepare_cmake.sh @@ -29,7 +29,7 @@ VerboseMakefile=0 # ########################################################## # colours -if command -v tput > /dev/null; then +if [ -n "${TERM:-}" ] && [ -t 1 ] && command -v tput >/dev/null 2>&1; then SisClr_Blue=${FG_BLUE:-$(tput setaf 4)} SisClr_Red=${FG_RED:-$(tput setaf 1)} diff --git a/remove_cmake_artefacts.sh b/remove_cmake_artefacts.sh index 992153f..5b4478e 100755 --- a/remove_cmake_artefacts.sh +++ b/remove_cmake_artefacts.sh @@ -30,7 +30,7 @@ Files=( # ########################################################## # colours -if command -v tput > /dev/null; then +if [ -n "${TERM:-}" ] && [ -t 1 ] && command -v tput >/dev/null 2>&1; then SisClr_Blue=${FG_BLUE:-$(tput setaf 4)} SisClr_Red=${FG_RED:-$(tput setaf 1)}