Makefile improvements #132
@ -99,9 +99,10 @@ their editor or terminal.
|
||||
|
||||
For usage text and help messages, do not implement a -h option. Instead, print
|
||||
usage information when any erroneous option is specified. Follow the NetBSD
|
||||
style guide for the usage text’s output format [1].
|
||||
style guide for the usage text’s output format [0].
|
||||
|
||||
[1] <http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/share/misc/style>
|
||||
If committing a new utility, please include tests and documentation (see
|
||||
tests/ and docs/) for the new tool.
|
||||
|
||||
If committing a new source file, format the commit message following these
|
||||
guidelines:
|
||||
@ -130,6 +131,7 @@ $ git commit -m 'tool(1): fix #42 & add feature x'
|
||||
|
||||
Commit messages should be written in the present tense.
|
||||
|
||||
[0] <http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/share/misc/style>
|
||||
--
|
||||
This work © 2023–2024 by Emma Tebibyte is licensed under CC BY-SA 4.0. To view a
|
||||
copy of this license, visit <http://creativecommons.org/licenses/by-sa/4.0/>
|
||||
|
13
Makefile
13
Makefile
@ -16,7 +16,10 @@
|
||||
DESTDIR ?= dist
|
||||
PREFIX ?= /usr/local
|
||||
|
||||
MANDIR != [ $(PREFIX) = / ] && printf '/usr/share/man\n' \
|
||||
# normalized prefix
|
||||
PREFIX_N != (test -d $(PREFIX) && [ '-' != $(PREFIX) ] \
|
||||
&& CDPATH= cd -P -- $(PREFIX) && pwd -P)
|
||||
MANDIR != [ $(PREFIX_N) = / ] && printf '/usr/share/man\n' \
|
||||
|| printf '/share/man\n'
|
||||
SYSEXITS != printf '\043include <sysexits.h>\n' | cpp -M - | sed 's/ /\n/g' \
|
||||
| sed -n 's/sysexits\.h//p' || printf 'include\n'
|
||||
@ -29,7 +32,7 @@ RUSTLIBS = --extern getopt=build/o/libgetopt.rlib \
|
||||
CFLAGS += -I$(SYSEXITS)
|
||||
|
||||
.PHONY: all
|
||||
all: docs dj false fop hru intcmp mm npc rpn scrut str strcmp swab true
|
||||
all: dj false fop hru intcmp mm npc rpn scrut str strcmp swab true
|
||||
|
||||
# keep build/include until bindgen(1) has stdin support
|
||||
# https://github.com/rust-lang/rust-bindgen/issues/2703
|
||||
@ -40,7 +43,7 @@ build:
|
||||
clean:
|
||||
rm -rf build dist
|
||||
|
||||
dist: all
|
||||
dist: all docs
|
||||
mkdir -p $(DESTDIR)/$(PREFIX)/bin $(DESTDIR)/$(PREFIX)/share/man/man1
|
||||
cp build/bin/* $(DESTDIR)/$(PREFIX)/bin
|
||||
cp build/docs/*.1 $(DESTDIR)/$(PREFIX)/$(MANDIR)/man1
|
||||
@ -50,9 +53,9 @@ install: dist
|
||||
cp -r $(DESTDIR)/* /
|
||||
|
||||
.PHONY: test
|
||||
test: build /tmp/getopt
|
||||
test: all build /tmp/getopt
|
||||
tests/test.sh
|
||||
/tmp/getopt
|
||||
tests/posix-compat.sh
|
||||
|
||||
/tmp/getopt: src/libgetopt.rs
|
||||
$(RUSTC) --test -o /tmp/getopt src/libgetopt.rs
|
||||
|
27
tests/bonsai/dj.sh
Executable file
27
tests/bonsai/dj.sh
Executable file
@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
. tests/bonsai/test_env
|
||||
|
||||
! dj -h
|
||||
|
||||
# This test is theoretically Linux-dependent; write(2) should return -1 on
|
||||
# error.
|
||||
# Right now dj(1) interprets the return value of write(2) as the amount of
|
||||
# bytes written. This can decrement the stored quantity of bytes written,
|
||||
# which is an int, so doesn't underflow but goes negative. dj(1) tries to
|
||||
# again to write(2) if an error occurs in which no bytes are written, so in
|
||||
# total two write(2)s are attempted and so the written byte quantity is -2.
|
||||
# This is a bug and will change, but for now is at least documented.
|
||||
dj -Hi /dev/zero -o /dev/full \
|
||||
| xargs -I out "$BIN/strcmp" '1+0 > 0+0; 1024 > -2' out
|
||||
|
||||
# Read nothing from /dev/null, write nothing to /dev/null.
|
||||
dj -Hi /dev/null -o /dev/null \
|
||||
| xargs -I out "$BIN/strcmp" '0+0 > 0+0; 0 > 0' out
|
13
tests/bonsai/false.sh
Executable file
13
tests/bonsai/false.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
. tests/bonsai/test_env
|
||||
|
||||
! false
|
||||
! false -h
|
21
tests/bonsai/fop.sh
Executable file
21
tests/bonsai/fop.sh
Executable file
@ -0,0 +1,21 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
. tests/bonsai/test_env
|
||||
|
||||
! fop -h
|
||||
|
||||
"$BIN/strcmp" "$(printf 'test0␞test1␞test2\n' | fop 1 sed 's/1/4/g')" \
|
||||
'test0␞test4␞test2'
|
||||
|
||||
"$BIN/strcmp" "$(printf 'test0 test1 test2\n' | fop -d' ' 2 sed 's/2/4/g')" \
|
||||
'test0 test1 test4'
|
||||
|
||||
! printf 'test\n' | fop 1 cat
|
||||
! printf 'test\n' | fop 'test' cat
|
||||
! printf 'test\n' | fop -d'test' cat
|
26
tests/bonsai/hru.sh
Executable file
26
tests/bonsai/hru.sh
Executable file
@ -0,0 +1,26 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
. tests/bonsai/test_env
|
||||
|
||||
alias strcmp="$BIN/strcmp"
|
||||
alias rpn="$BIN/rpn"
|
||||
|
||||
strcmp "$(printf '1234\n' | hru)" '1.2 kB'
|
||||
strcmp "$(printf '0\n' | hru)" '0 B'
|
||||
|
||||
# doesn’t currently work but would be useful for testing for regressions
|
||||
#n=1
|
||||
#while "$BIN/true"; do
|
||||
# n="$(rpn "$n" 10 ×)"
|
||||
#
|
||||
# printf '%s\n' "$n" | hru || break
|
||||
#done
|
||||
#printf 'integer limit: ~%s\n' "$(rpn "$n" 10 ÷)"
|
||||
|
||||
! printf '%s\n' '-1' | hru
|
25
tests/bonsai/intcmp.sh
Executable file
25
tests/bonsai/intcmp.sh
Executable file
@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
. tests/bonsai/test_env
|
||||
|
||||
intcmp -e 3 3 3
|
||||
intcmp -g 3 2 1
|
||||
intcmp -l 1 2 3
|
||||
intcmp -ge 3 3 1
|
||||
intcmp -le 1 3 3
|
||||
intcmp -gl 1 2 3
|
||||
intcmp -egl 3 1 1 2
|
||||
! intcmp -e 1 2 3
|
||||
! intcmp -g 1 3 3
|
||||
! intcmp -l 3 3 1
|
||||
! intcmp -ge 1 2 3
|
||||
! intcmp -le 3 2 1
|
||||
! intcmp -gl 3 3 3
|
||||
! intcmp -egl foo
|
19
tests/bonsai/mm.sh
Executable file
19
tests/bonsai/mm.sh
Executable file
@ -0,0 +1,19 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
. tests/bonsai/test_env
|
||||
|
||||
exec 3>&1
|
||||
|
||||
! mm -h
|
||||
|
||||
# mm(1) will error if positional arguments are given without -i or -o
|
||||
! mm argument
|
||||
|
||||
# check if stderr is empty upon specifying -e
|
||||
! "$BIN/strcmp" "$(printf 'test\n' | mm -i - -e 2>&1 1>&3)" ''
|
16
tests/bonsai/strcmp.sh
Executable file
16
tests/bonsai/strcmp.sh
Executable file
@ -0,0 +1,16 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
. tests/bonsai/test_env
|
||||
|
||||
strcmp equals equals
|
||||
! strcmp inequals equals
|
||||
strcmp - -
|
||||
! strcmp -h
|
||||
! strcmp nocmp
|
5
tests/bonsai/test_env
Normal file
5
tests/bonsai/test_env
Normal file
@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -ex
|
||||
|
||||
alias "$UTIL=$BIN/$UTIL"
|
13
tests/bonsai/true.sh
Executable file
13
tests/bonsai/true.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
. tests/bonsai/test_env
|
||||
|
||||
true
|
||||
true -h
|
4
tests/locales/en_US.UTF-8
Normal file
4
tests/locales/en_US.UTF-8
Normal file
@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
|
||||
export RUN_ERR='Run this script in the root of the project'
|
||||
export TEST_STR='Testing utility'
|
5
tests/locales/tok
Normal file
5
tests/locales/tok
Normal file
@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
export RUN_ERR="ilo ni li ken ala pali lon ma ni. sina ken kepeken ona lon ma \
|
||||
sewi"
|
||||
export TEST_STR='ilo pali'
|
22
tests/posix/bin/cat
Executable file
22
tests/posix/bin/cat
Executable file
@ -0,0 +1,22 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
# Strictly POSIX-compliant cat(1) implementation. See cat(1p)
|
||||
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
-u) args="$(printf '%s %s\n' "$args" "$arg")" ;;
|
||||
*) args="$(printf -- '%s -i %s\n' "$args" "$arg")" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# See IEEE Std 1003.1-2017 3.282
|
||||
# https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282
|
||||
IFS=' '
|
||||
|
||||
mm $args
|
12
tests/posix/bin/false
Executable file
12
tests/posix/bin/false
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
# Strictly POSIX-compliant false(1) implementation. See false(1p)
|
||||
|
||||
false "$@"
|
11
tests/posix/bin/true
Executable file
11
tests/posix/bin/true
Executable file
@ -0,0 +1,11 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2024 DTB <trinity@trinity.moe>
|
||||
# Copyright (c) 2024 Emma Tebibyte <emma@tebibyte.media>
|
||||
# SPDX-License-Identifier: FSFAP
|
||||
#
|
||||
# Copying and distribution of this file, with or without modification, are
|
||||
# permitted in any medium without royalty provided the copyright notice and this
|
||||
# notice are preserved. This file is offered as-is, without any warranty.
|
||||
|
||||
# Strictly POSIX-compliant true(1) implementation. See true(1p)
|
||||
true "$@"
|
3
tests/posix/posix_env
Normal file
3
tests/posix/posix_env
Normal file
@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
PATH="$PWD/bin:$PATH"
|
@ -9,16 +9,28 @@
|
||||
|
||||
set -e
|
||||
|
||||
. "tests/locales/$LANG"
|
||||
|
||||
export BIN=build/bin
|
||||
|
||||
if ! ls Makefile >/dev/null 2>&1
|
||||
then
|
||||
printf '%s: Run this script in the root of the project.\n' "$0" 1>&2
|
||||
printf '%s: %s\n' "$0" "$RUN_ERR" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf "Starting POSIX compatibility testing.\n"
|
||||
for script in tests/bonsai/*.sh; do
|
||||
export UTIL="$(printf '%s\n' "$script" \
|
||||
| sed -e 's/\.sh//g' -e 's;tests\/bonsai\/;;g')"
|
||||
|
||||
for utility in tests/posix/*; do
|
||||
printf '%s: %s: Testing utility.\n' "$0" "$utility"
|
||||
printf '%s: %s: %s\n' "$0" "$UTIL" "$TEST_STR"
|
||||
"$script"
|
||||
printf '\n'
|
||||
done
|
||||
|
||||
for test in tests/posix/*.sh; do
|
||||
export PATH="$BIN:$PATH"
|
||||
printf '%s: %s: %s\n' "$0" "$test" "$TEST_STR"
|
||||
"$utility"
|
||||
printf '\n'
|
||||
done
|
Loading…
x
Reference in New Issue
Block a user