Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
be569ba
fix(taskfiles)!: Check the specified FILE_SHA256 matches the download…
davidlion Jul 9, 2025
3a9334e
Add checksum unit tests.
davidlion Jul 12, 2025
f807f1a
Merge remote-tracking branch 'upstream/main' into checksum-update
davidlion Jul 24, 2025
ffc0c06
Merge remote-tracking branch 'upstream/main' into checksum-update
davidlion Aug 21, 2025
9e41b40
feat(taskfile)!: Use checksum tasks to prevent unnecessary repetition…
davidlion Aug 23, 2025
3329f52
Follow yaml guidelines.
davidlion Aug 23, 2025
5572a89
Fix yaml lint.
davidlion Aug 23, 2025
c8d706c
Fix boost 1.89 header change.
davidlion Aug 23, 2025
aca9e63
Try diff?
davidlion Aug 24, 2025
aef0786
Full switch to cmp.
davidlion Aug 24, 2025
b0ea5bc
Debug logs.
davidlion Aug 24, 2025
3d66108
Resolve some rabbit coments.
davidlion Aug 24, 2025
6af0c39
debugging CI
davidlion Aug 24, 2025
ea102c7
Resolve more rabbit coments.
davidlion Aug 24, 2025
7c9701d
Switch to oneliner.
davidlion Aug 24, 2025
a6f7922
Make TARGETS required.
davidlion Aug 24, 2025
9e3b981
who knows
davidlion Aug 24, 2025
6740397
shell shock
davidlion Aug 24, 2025
b7849d9
Verbose testing.
davidlion Aug 24, 2025
3d82d19
Fix logs.
davidlion Aug 24, 2025
6930c6f
npm maybe
davidlion Aug 24, 2025
a3fedaa
sigh task scripts
davidlion Aug 24, 2025
51c0ee8
typo
davidlion Aug 24, 2025
77d6fea
syntax hard
davidlion Aug 24, 2025
955d6bd
not on path
davidlion Aug 24, 2025
df4f9cb
sigh
davidlion Aug 24, 2025
319771d
what is the magic syntax
davidlion Aug 24, 2025
c745ba8
meh
davidlion Aug 24, 2025
8959121
maybe
davidlion Aug 24, 2025
040b694
if else for macos
davidlion Aug 24, 2025
2240fd4
just call bash idk
davidlion Aug 24, 2025
4bc7164
no silent??
davidlion Aug 24, 2025
4fdc23e
losing track
davidlion Aug 24, 2025
23dd1e9
help
davidlion Aug 25, 2025
4997cf2
full if statement
davidlion Aug 25, 2025
05b2d68
dump shell options
davidlion Aug 25, 2025
8d655c2
hmm unbound
davidlion Aug 25, 2025
be5d231
go panic
davidlion Aug 25, 2025
a6297c9
weird shell
davidlion Aug 25, 2025
0144e84
error swallowing hmm
davidlion Aug 25, 2025
361f891
free me
davidlion Aug 25, 2025
da843e9
forgive me
davidlion Aug 25, 2025
1292184
maybe the end
davidlion Aug 25, 2025
cf02bb6
maybe the end
davidlion Aug 25, 2025
8a72950
clpain
davidlion Aug 25, 2025
2bb4119
hardswap diff?
davidlion Aug 25, 2025
96f7cfe
cipain
davidlion Aug 25, 2025
42f7495
same diff
davidlion Aug 25, 2025
1a2c692
not posix?
davidlion Aug 25, 2025
d86541d
so lost
davidlion Aug 25, 2025
b03226c
try without pipefail
davidlion Aug 25, 2025
058b867
try again
davidlion Aug 25, 2025
74a07ba
no !
davidlion Aug 25, 2025
bb1688b
dumb person does dumb things
davidlion Aug 25, 2025
6ddec14
dumb person does more dumb stuff
davidlion Aug 25, 2025
7d96c0a
dumb person does even more dumb stuff
davidlion Aug 25, 2025
5ef2d31
one more
davidlion Aug 25, 2025
dc829f2
bed time
davidlion Aug 25, 2025
f1c73f2
file dne?
davidlion Aug 25, 2025
853afcf
bad mistakes
davidlion Aug 25, 2025
a9cf000
macos rm??
davidlion Aug 25, 2025
6a959ee
need local macos runner
davidlion Aug 25, 2025
78abea7
macos same checksum?
davidlion Aug 25, 2025
f09e083
why tar mad
davidlion Aug 25, 2025
4743a67
this shouldn't work
davidlion Aug 25, 2025
b6552d1
gtar auto installed?
davidlion Aug 25, 2025
2afbc02
check ignore_errors later
davidlion Aug 25, 2025
4dd002b
bam
davidlion Aug 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/unit-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,4 @@ jobs:
run: "curl --fail --location --silent --show-error https://astral.sh/uv/install.sh | sh"

- name: "Run unit tests"
run: "task test"
run: "task test --concurrency 1 --verbose"
213 changes: 115 additions & 98 deletions exports/taskfiles/utils/boost.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,38 +8,39 @@ set: ["u", "pipefail"]
shopt: ["globstar"]

tasks:
# Generates `GENERATE_DIR` by copying `SOURCE_DIR` and then running boost's bootstrap step.
# Runs the Boost generate (bootstrap) step.
#
# @param {string} SOURCE_DIR Project source directory.
# @param {string} GENERATE_DIR Directory in which to generate `b2` and the build configuration.
# @param {string} GENERATE_CHECKSUM_FILE Checksum file for `GENERATE_DIR`.
# @param {string} INSTALL_PREFIX Path prefix of where the project should be installed.
# @param {string} SOURCE_DIR Project source directory.
# @param {string[]} TARGETS Target libraries to build.
# @param {string} [CHECKSUM_FILE={{.SOURCE_DIR}}.md5] Checksum file path for `SOURCE_DIR`.
# @param {string[]} [EXTRA_ARGS] Any additional arguments to pass to the generate command.
generate:
internal: true
label: "{{.TASK}}:{{.SOURCE_DIR}}"
vars:
CHECKSUM_FILE: >-
{{default (printf "%s.md5" .SOURCE_DIR) .CHECKSUM_FILE}}
EXTRA_ARGS:
ref: "default (list) .EXTRA_ARGS"
SOURCE_SENTINEL_FILE: "{{.SOURCE_DIR}}/{{.TASK}}.sentinel"
requires:
vars: ["SOURCE_DIR", "GENERATE_DIR", "GENERATE_CHECKSUM_FILE", "INSTALL_PREFIX", "TARGETS"]
sources:
- "{{.SOURCE_DIR}}/**/*"
vars:
- "INSTALL_PREFIX"
- "TARGETS"
- "SOURCE_DIR"
sources: ["{{.TASKFILE}}"]
generates:
- "{{.GENERATE_CHECKSUM_FILE}}"
- "{{.CHECKSUM_FILE}}"
- "{{.SOURCE_SENTINEL_FILE}}"
deps:
- task: "checksum:validate"
vars:
CHECKSUM_FILE: "{{.GENERATE_CHECKSUM_FILE}}"
INCLUDE_PATTERNS:
- "{{.GENERATE_DIR}}"
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
INCLUDE_PATTERNS: ["{{.SOURCE_DIR}}"]
cmds:
- >-
rm -rf "{{.GENERATE_DIR}}"
- >-
cp -R "{{.SOURCE_DIR}}" "{{.GENERATE_DIR}}"
- >-
pushd "{{.GENERATE_DIR}}";
pushd "{{.SOURCE_DIR}}";
./bootstrap.sh
--prefix="{{.INSTALL_PREFIX}}"
--exec-prefix="{{.INSTALL_PREFIX}}"
Expand All @@ -48,37 +49,74 @@ tasks:
"{{.}}"
{{- end}};
popd
- "touch '{{.SOURCE_SENTINEL_FILE}}'"
- task: "checksum:compute"
vars:
CHECKSUM_FILE: "{{.GENERATE_CHECKSUM_FILE}}"
INCLUDE_PATTERNS:
- "{{.GENERATE_DIR}}"
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
INCLUDE_PATTERNS: ["{{.SOURCE_DIR}}"]

# Runs boost's b2 build and install step, and creates a CMake settings file. The caller must have
# previously called `generate` on `SOURCE_DIR` (to produce the `GENERATE_DIR`) for this task to
# succeed.
# Runs Boost's b2 build and install step.
# Fails if the caller has not successfully called `generate` on `SOURCE_DIR`.
#
# @param {string} GENERATE_DIR Directory containing boost's source and build files.
# Required parameters
# @param {string} BUILD_DIR Directory in which to build boost.
# @param {string} INSTALL_PREFIX Path prefix of where the project should be installed.
# @param {string[]} [EXTRA_ARGS] Any additional arguments to pass to the build command.
# @param {string} SOURCE_DIR Directory containing boost's source and build files.
#
# Checksum parameters
# @param {string} [BUILD_CHECKSUM_FILE={{.BUILD_DIR}}.md5] Checksum file path for `BUILD_DIR`.
# @param {string} [INSTALL_CHECKSUM_FILE={{.INSTALL_PREFIX}}.md5] Checksum file path for
# `INSTALL_PREFIX`
# @param {string} [SOURCE_CHECKSUM_FILE={{.SOURCE_DIR}}.md5] Checksum file path for `SOURCE_DIR`.
#
# Build command parameters
# @param {int} [JOBS] The maximum number of concurrent processes to use when building. If
# omitted, the b2 default number is used. Before 1.76.0, the number was 1. Since 1.76.0, the
# default is the number of cores.
# @param {string} [CMAKE_SETTINGS_DIR] If set, the directory where the project's CMake settings
# file should be stored.
# @param {string[]} [EXTRA_ARGS] Any additional arguments to pass to the build command.
build-and-install:
internal: true
label: "{{.TASK}}:{{.BUILD_DIR}}-{{.INSTALL_PREFIX}}"
vars:
# Checksum files
BUILD_CHECKSUM_FILE: >-
{{default (printf "%s.md5" .BUILD_DIR) .BUILD_CHECKSUM_FILE}}
INSTALL_CHECKSUM_FILE: >-
{{default (printf "%s.md5" .INSTALL_PREFIX) .INSTALL_CHECKSUM_FILE}}
SOURCE_CHECKSUM_FILE: >-
{{default (printf "%s.md5" .SOURCE_DIR) .SOURCE_CHECKSUM_FILE}}

EXTRA_ARGS:
ref: "default (list) .EXTRA_ARGS"
JOBS: >-
{{default "" .JOBS}}
SOURCE_SENTINEL_FILE: "{{.SOURCE_DIR}}/{{.TASK}}.sentinel"
requires:
vars: ["GENERATE_DIR", "BUILD_DIR", "INSTALL_PREFIX"]
vars:
- "BUILD_DIR"
- "INSTALL_PREFIX"
- "SOURCE_DIR"
sources: ["{{.TASKFILE}}"]
generates:
- "{{.BUILD_CHECKSUM_FILE}}"
- "{{.INSTALL_CHECKSUM_FILE}}"
- "{{.SOURCE_CHECKSUM_FILE}}"
- "{{.SOURCE_SENTINEL_FILE}}"
deps:
- task: "checksum:validate"
vars:
CHECKSUM_FILE: "{{.BUILD_CHECKSUM_FILE}}"
INCLUDE_PATTERNS: ["{{.BUILD_DIR}}"]
- task: "checksum:validate"
vars:
CHECKSUM_FILE: "{{.INSTALL_CHECKSUM_FILE}}"
INCLUDE_PATTERNS: ["{{.INSTALL_PREFIX}}"]
- task: "checksum:validate"
vars:
CHECKSUM_FILE: "{{.SOURCE_CHECKSUM_FILE}}"
INCLUDE_PATTERNS: ["{{.SOURCE_DIR}}"]
FAIL: "true"
cmds:
- >-
pushd "{{.GENERATE_DIR}}";
pushd "{{.SOURCE_DIR}}";
./b2
install
--build-dir="{{.BUILD_DIR}}"
Expand All @@ -89,102 +127,81 @@ tasks:
"-j{{.JOBS}}"
{{- end}};
popd;
- >-
{{- if .CMAKE_SETTINGS_DIR}}
echo "set(Boost_ROOT
\"{{.INSTALL_PREFIX}}\"
CACHE PATH
\"Package root for Boost.\"
)" >> "{{.CMAKE_SETTINGS_DIR}}/Boost.cmake"
{{- end}}
- "touch '{{.SOURCE_SENTINEL_FILE}}'"
- task: "checksum:compute"
vars:
CHECKSUM_FILE: "{{.BUILD_CHECKSUM_FILE}}"
INCLUDE_PATTERNS: ["{{.BUILD_DIR}}"]
- task: "checksum:compute"
vars:
CHECKSUM_FILE: "{{.INSTALL_CHECKSUM_FILE}}"
INCLUDE_PATTERNS: ["{{.INSTALL_PREFIX}}"]
- task: "checksum:compute"
vars:
CHECKSUM_FILE: "{{.SOURCE_CHECKSUM_FILE}}"
INCLUDE_PATTERNS: ["{{.SOURCE_DIR}}"]

# Downloads boost from `URL` and installs boost.
# Downloads Boost from `TAR_URL` and then generates, builds, and installs Boost inside `WORK_DIR`.
# If `CMAKE_SETTINGS_DIR` is set, a settings file will be created in that directory, containing a
# `Boost_ROOT` CMake variable that points to `INSTALL_PREFIX`.
#
# General parameters
# @param {string} [WORK_DIR={{.ROOT_DIR}}] Base directory in which to store the source, generate,
# build, and install directories.
# @param {string} [SOURCE_DIR={{.WORK_DIR}}/boost-src] Directory in which to extract the tar
# file.
#
# Download parameters
# @param {string} FILE_SHA256 Content hash to verify the downloaded tar file against.
# @param {string} URL
# @param {string} TAR_SHA256 Content hash to verify the downloaded tar file against.
# @param {string} TAR_URL URL of the tar file to download.
# @param {string} WORK_DIR Directory in which to store the source, build, and install directories.
# @param {string} [CMAKE_SETTINGS_DIR] If set, the directory where the project's CMake settings
# file should be stored.
#
# Boost generate parameters
# @param {string} [GENERATE_DIR={{.WORK_DIR}}/boost-generate] Directory in which to generate the
# project build files.
# @param {string} [GENERATE_CHECKSUM_FILE={{.WORK_DIR}}/boost-generate.md5] Checksum file for the
# generate directory.
# @param {string} [INSTALL_PREFIX={{.WORK_DIR}}/boost-install] Path prefix of where the project
# should be installed.
# @param {string[]} [TARGETS] Target libraries to build.
# Boost parameters
# @param {string[]} TARGETS Target libraries to build.
# @param {string[]} [BUILD_AND_INSTALL_ARGS] Any additional arguments to pass to boost's build and
# install command.
# @param {string[]} [GENERATE_ARGS] Any additional arguments to pass to the generate command.
#
# Boost build-and-install parameters
# @param {string} [BUILD_DIR={{.WORK_DIR}}/boost-build] Directory in which to build the project.
# @param {int} [JOBS] The maximum number of concurrent processes to use when building. If
# omitted, the b2 default number is used. Before 1.76.0, the number was 1. Since 1.76.0, the
# default is the number of cores.
# @param {string[]} [BUILD_AND_INSTALL_ARGS] Any additional arguments to pass to boost's build
# and install command.
# @param {string} [CMAKE_SETTINGS_DIR] If set, the directory where the project's CMake settings
# file should be stored.
download-and-install:
internal: true
label: "{{.TASK}}:{{.URL}}-{{.INSTALL_PREFIX}}"
label: "{{.TASK}}:{{.TAR_URL}}-{{.WORK_DIR}}"
vars:
# General parameters
WORK_DIR: >-
{{default .ROOT_DIR .WORK_DIR}}
SOURCE_DIR: >-
{{default (printf "%s/boost-src" .WORK_DIR) .SOURCE_DIR}}

# Boost generate parameters
GENERATE_DIR: >-
{{default (printf "%s/boost-generate" .WORK_DIR) .GENERATE_DIR}}
GENERATE_CHECKSUM_FILE: >-
{{default (printf "%s/boost-generate.md5" .WORK_DIR) .GENERATE_CHECKSUM_FILE}}
INSTALL_PREFIX: >-
{{default (printf "%s/boost-install" .WORK_DIR) .INSTALL_PREFIX}}
TARGETS:
ref: "default (list) .TARGETS"
GENERATE_ARGS:
ref: "default (list) .GENERATE_ARGS"

# Boost build-and-install parameters
BUILD_DIR: >-
{{default (printf "%s/boost-build" .WORK_DIR) .BUILD_DIR}}
BUILD_AND_INSTALL_ARGS:
ref: "default (list) .BUILD_AND_INSTALL_ARGS"
JOBS: >-
{{default "" .JOBS}}
CMAKE_SETTINGS_DIR: >-
{{default "" .CMAKE_SETTINGS_DIR}}
# Directory parameters
BUILD_DIR: "{{.WORK_DIR}}/boost-build"
INSTALL_PREFIX: "{{.WORK_DIR}}/boost-install"
SOURCE_DIR: "{{.WORK_DIR}}/boost-src"
requires:
vars: ["FILE_SHA256", "URL"]
vars:
- "TAR_SHA256"
- "TAR_URL"
- "TARGETS"
- "WORK_DIR"
deps:
- task: "remote:download-and-extract-tar"
vars:
FILE_SHA256: "{{.FILE_SHA256}}"
FILE_SHA256: "{{.TAR_SHA256}}"
OUTPUT_DIR: "{{.SOURCE_DIR}}"
URL: "{{.URL}}"
URL: "{{.TAR_URL}}"
cmds:
- task: "generate"
vars:
SOURCE_DIR: "{{.SOURCE_DIR}}"
GENERATE_DIR: "{{.GENERATE_DIR}}"
GENERATE_CHECKSUM_FILE: "{{.GENERATE_CHECKSUM_FILE}}"
INSTALL_PREFIX: "{{.INSTALL_PREFIX}}"
SOURCE_DIR: "{{.SOURCE_DIR}}"
TARGETS:
ref: ".TARGETS"
EXTRA_ARGS:
ref: ".GENERATE_ARGS"
- task: "build-and-install"
vars:
GENERATE_DIR: "{{.GENERATE_DIR}}"
BUILD_DIR: "{{.BUILD_DIR}}"
INSTALL_PREFIX: "{{.INSTALL_PREFIX}}"
SOURCE_DIR: "{{.SOURCE_DIR}}"
EXTRA_ARGS:
ref: ".BUILD_AND_INSTALL_ARGS"
JOBS: "{{.JOBS}}"
CMAKE_SETTINGS_DIR: "{{.CMAKE_SETTINGS_DIR}}"
- >-
{{- if .CMAKE_SETTINGS_DIR}}
echo "set(Boost_ROOT
\"{{.INSTALL_PREFIX}}\"
CACHE PATH
\"Package root for Boost.\"
)" > "{{.CMAKE_SETTINGS_DIR}}/Boost.cmake"
{{- end}}
51 changes: 42 additions & 9 deletions exports/taskfiles/utils/checksum.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ tasks:
internal: true
label: "{{.TASK}}-{{.CHECKSUM_FILE}}"
silent: true
vars:
TAR: >-
{{if eq OS "darwin"}}gtar{{else}}tar{{end}}
requires:
vars: ["CHECKSUM_FILE", "INCLUDE_PATTERNS"]
cmds:
Expand All @@ -25,7 +28,24 @@ tasks:
# passed to `tar` as arguments. If the input patterns are passed to `tar` with quotes, the
# pattern won't be evaluated and will instead be treated literally.
- >-
tar
{{.TAR}}
--create
--file -
--group 0
--mtime "UTC 1970-01-01"
--numeric-owner
--owner 0
--sort name
--no-anchored
--wildcards
{{- range .EXCLUDE_PATTERNS}}
--exclude="{{.}}"
{{- end}}
{{- range .INCLUDE_PATTERNS}}
{{.}}
{{- end}}
- >-
{{.TAR}}
--create
--file -
--group 0
Expand All @@ -46,20 +66,29 @@ tasks:
# Ignore errors so that dependent tasks don't fail
ignore_error: true

# Validates the checksum of the given path include patterns matches the checksum in the given
# file. If `FAIL` is set to "true" the task will fail, otherwise the checksum file is deleted.
#
# @param {string} CHECKSUM_FILE
# @param {string[]} INCLUDE_PATTERNS Path wildcard patterns to validate the checksum for.
# @param {string[]} [EXCLUDE_PATTERNS] Path wildcard patterns, relative to any `INCLUDE_PATTERNS`,
# to exclude from the checksum.
# @param {string} [FAIL="false"] If set to "true" the task fails.
validate:
desc: "Validates the checksum of the given directory matches the checksum in the given file, or
deletes the checksum file otherwise."
internal: true
label: "{{.TASK}}-{{.CHECKSUM_FILE}}"
silent: true
vars:
FAIL: >-
{{- if (eq "true" .FAIL) -}}
true
{{- else}}
false
{{- end}}
TMP_CHECKSUM_FILE: "{{.CHECKSUM_FILE}}.tmp"
requires:
vars: ["CHECKSUM_FILE", "INCLUDE_PATTERNS"]
vars:
- "CHECKSUM_FILE"
- "INCLUDE_PATTERNS"
cmds:
- task: "compute"
vars:
Expand All @@ -69,13 +98,17 @@ tasks:
ref: "default (list) .EXCLUDE_PATTERNS"
CHECKSUM_FILE: "{{.TMP_CHECKSUM_FILE}}"
- defer: "rm -f '{{.TMP_CHECKSUM_FILE}}'"
# Check that all paths exist and the checksum matches; otherwise delete the checksum file.
- |-
(
{{- range .INCLUDE_PATTERNS}}
for path in {{.}}; do
test -e "$path"
test -e "$path" || exit 1
done
{{- end}}
diff -q "{{.TMP_CHECKSUM_FILE}}" "{{.CHECKSUM_FILE}}" 2> /dev/null
) || rm -f "{{.CHECKSUM_FILE}}"
cmp -s "{{.TMP_CHECKSUM_FILE}}" "{{.CHECKSUM_FILE}}"
) \
{{- if eq "true" .FAIL}}
|| false
{{- else}}
|| rm -f "{{.CHECKSUM_FILE}}"
{{- end}}
Loading