Write unified test script and make test readable

This commit is contained in:
Wildan M
2025-12-10 23:28:57 +07:00
parent e2870172d8
commit 31797971bc
7 changed files with 224 additions and 91 deletions
+55 -40
View File
@@ -3,54 +3,69 @@ image: "redoxos/redoxer:latest"
variables:
GIT_SUBMODULE_STRATEGY: recursive
workflow:
rules:
- if: '$CI_COMMIT_BRANCH == "master" && $CI_PROJECT_NAMESPACE == "redox-os"'
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
stages:
- build
- cross-build
- test
before_script:
cargo install cbindgen
default:
cache:
paths:
- target/
build:linux:
stage: build
script:
- rustup show # Ensure correct toolchain is downloaded and installed
- make -j "$(nproc)" all
build:redox:
stage: build
variables:
TARGET: x86_64-unknown-redox
script:
- ./redoxer.sh -j "$(nproc)" all
test:linux:
stage: test
needs:
- build:linux
dependencies:
- build:linux
script:
- make test
test:redox:
stage: test
needs:
- build:redox
dependencies:
- build:redox
variables:
TARGET: x86_64-unknown-redox
script:
# TODO: sigaction and sigaltstack sometimes hangs with multi core
- REDOXER_QEMU_ARGS="-smp 1" ./redoxer.sh test SKIP_REDOX=1
fmt:
stage: test
stage: build
needs: []
script:
- rustup component add rustfmt-preview
- ./fmt.sh -- --check
linux:
stage: build
script:
- ./check.sh --host
x86_64:
stage: build
script:
- ./check.sh --arch=x86_64
i586:
stage: cross-build
script:
- ./check.sh --arch=i586
aarch64:
stage: cross-build
script:
- ./check.sh --arch=aarch64
riscv64gc:
stage: cross-build
script:
- ./check.sh --arch=riscv64gc
test:linux:
stage: test
needs: [linux]
dependencies: [linux]
script:
- ./check.sh --host --test
test:x86_64:
stage: test
needs: [x86_64]
dependencies: [x86_64]
script:
- ./check.sh --arch=x86_64 --test
test:aarch64:
stage: test
needs: [aarch64]
dependencies: [aarch64]
script:
- ./check.sh --arch=aarch64 --test
#TODO: Enable more arch once dynamic linker working
+9 -9
View File
@@ -33,20 +33,20 @@ all: | headers libs
headers: $(HEADERS_DEPS)
rm -rf $(TARGET_HEADERS)
mkdir -pv $(TARGET_HEADERS)
cp -rv include/* $(TARGET_HEADERS)
cp -v "openlibm/include"/*.h $(TARGET_HEADERS)
cp -v "openlibm/src"/*.h $(TARGET_HEADERS)
set -e ; \
mkdir -p $(TARGET_HEADERS)
cp -r include/* $(TARGET_HEADERS)
cp "openlibm/include"/*.h $(TARGET_HEADERS)
cp "openlibm/src"/*.h $(TARGET_HEADERS)
@set -e ; \
for header in $(HEADERS_UNPARSED); do \
echo "Header $$header"; \
echo "\033[0;36;49mWriting Header $$header\033[0m"; \
if test -f "src/header/$$header/cbindgen.toml"; then \
out=`echo "$$header" | sed 's/_/\//g'`; \
out="$(TARGET_HEADERS)/$$out.h"; \
cat "src/header/$$header/cbindgen.toml" cbindgen.globdefs.toml \
| cbindgen "src/header/$$header/mod.rs" --config=/dev/stdin --output "$$out"; \
fi \
done
done; echo "\033[0;36;49mAll headers written\033[0m";
clean:
$(CARGO) clean
@@ -178,8 +178,8 @@ $(BUILD)/release/libc.a: $(BUILD)/release/librelibc.a $(BUILD)/openlibm/libopenl
$(BUILD)/release/librelibc.a: $(SRC)
$(CARGO) rustc --release $(CARGOFLAGS) -- --emit link=$@ $(RUSTCFLAGS)
# TODO: Better to only allow a certain whitelisted set of symbols? Perhaps
# use some cbindgen hook, specify them manually, or grep for #[unsafe(no_mangle)].
@# TODO: Better to only allow a certain whitelisted set of symbols? Perhaps
@# use some cbindgen hook, specify them manually, or grep for #[unsafe(no_mangle)].
./renamesyms.sh "$@" "$(BUILD)/release/deps/"
./stripcore.sh "$@"
touch $@
-4
View File
@@ -1,4 +0,0 @@
sed -i 's/::std::os::raw:://g' $1
perl -i -p0e 's/extern "C" \{\n pub fn/#[unsafe(no_mangle)]\npub extern "C" fn/g' $1
perl -i -p0e 's/;\n\}/ {\n unimplemented!();\n\}\n/g' $1
rustfmt $1
Executable
+150
View File
@@ -0,0 +1,150 @@
#!/bin/bash
RED='\033[1;38;5;196m'
GREEN='\033[1;38;5;46m'
NC='\033[0m'
show_help() {
echo "Usage: $(basename "$0") [OPTIONS]"
echo ""
echo "Description:"
echo " Wrapper for Makefile / Cargo to run checks or tests on Redox OS targets."
echo ""
echo "Options:"
echo " --test Run 'make test' instead of 'make all'"
echo " --cargo Run 'cargo check' / 'cargo test' instead"
echo " (note: cargo test is currently not maintained for relibc)"
echo " --host Run the command on host (linux) target"
echo " --all-target Run the command on all supported Redox architectures"
echo " --target=<target> Override the target architecture (e.g., i586-unknown-redox)"
echo " --arch=<arch> Override the target architecture using arch (e.g., i586)"
echo " --help Show this help message"
echo ""
echo "Supported Targets:"
for t in "${SUPPORTED_TARGETS[@]}"; do
echo " - $t"
done
echo " - $(uname -m)-unknown-linux-gnu"
echo ""
echo "Environment:"
echo " TARGET Sets the default target (overridden by --target)"
}
if ! command -v redoxer &> /dev/null; then
echo "Error: 'redoxer' CLI not found."
echo "Please install it: cargo install redoxer"
exit 1
fi
if ! command -v cbindgen &> /dev/null; then
echo "Error: 'cbindgen' CLI not found."
echo "Please install it: cargo install cbindgen"
exit 1
fi
SUPPORTED_TARGETS=(
"x86_64-unknown-redox"
"i586-unknown-redox"
"aarch64-unknown-redox"
"riscv64gc-unknown-redox"
)
CURRENT_TARGET="${TARGET:-x86_64-unknown-redox}"
CHECK_ALL=false
CMD_ACTION="make"
CARGO_ACTION="check"
MAKE_ACTION="all"
IS_HOST=0
while [[ $# -gt 0 ]]; do
case "$1" in
--all-target)
CHECK_ALL=true
;;
--test)
MAKE_ACTION="test"
CARGO_ACTION="test"
;;
--cargo)
CMD_ACTION="cargo"
;;
--host)
CURRENT_TARGET="$(uname -m)-unknown-linux-gnu"
IS_HOST=1
;;
--target=*)
CURRENT_TARGET="${1#*=}"
;;
--arch=*)
CURRENT_TARGET="${1#*=}-unknown-redox"
;;
--help)
show_help
exit 0
;;
*)
echo -e "${RED}Error: Unknown option '$1'${NC}"
show_help
exit 1
;;
esac
shift
done
run_redoxer() {
export TARGET=$1
REDOXER_ENV="redoxer env"
if [ "$IS_HOST" -eq 0 ]; then
redoxer toolchain || { echo -e "${RED}Fail: redoxer toolchain for: $target.${NC}" && exit 1; }
export CARGOFLAGS=""
export CARGO_TEST="redoxer"
export TEST_RUNNER="redoxer exec --folder . --"
MAKE_ACTION="$MAKE_ACTION SKIP_REDOX=1"
else
REDOXER_ENV=""
fi
if [ "$CMD_ACTION" == "make" ]; then
CMD_OPT="-j $(nproc) $MAKE_ACTION"
else
CMD_OPT="$CARGO_ACTION"
fi
echo "----------------------------------------"
echo "Running $REDOXER_ENV $CMD_ACTION $CMD_OPT for: $TARGET"
if $REDOXER_ENV $CMD_ACTION $CMD_OPT; then
return 0
else
echo -e "${RED}Fail: $CMD_ACTION $CMD_OPT for $TARGET failed.${NC}"
return 1
fi
}
if [ "$CHECK_ALL" = true ]; then
echo "Running $CMD_ACTION for all supported Redox targets..."
has_error=false
for target in "${SUPPORTED_TARGETS[@]}"; do
if ! run_redoxer "$target"; then
has_error=true
fi
done
echo "----------------------------------------"
if [ "$has_error" = true ]; then
echo -e "${RED}Summary: One or more targets failed.${NC}"
exit 1
else
echo -e "${GREEN}Summary: All targets passed!${NC}"
exit 0
fi
else
if run_redoxer "$CURRENT_TARGET"; then
echo -e "${GREEN}Success: $CARGO_ACTION for $CURRENT_TARGET passed.${NC}"
exit 0
else
exit 1
fi
fi
-11
View File
@@ -1,11 +0,0 @@
#!/usr/bin/env bash
set -ex
./fmt.sh -- --check
if [ -z "$TARGET" ]
then
make all
make test
else
make libs
fi
-18
View File
@@ -1,18 +0,0 @@
#!/usr/bin/env bash
set -e
if ! which redoxer
then
cargo install redoxer
fi
if [ ! -d "$HOME/.redoxer/toolchain" ]
then
redoxer toolchain
fi
export CARGOFLAGS=""
export CARGO_TEST="redoxer"
export TEST_RUNNER="redoxer exec --folder . --"
redoxer env make "$@"
+10 -9
View File
@@ -327,9 +327,10 @@ clean:
rm -rf bins_* gen *.out
run: | $(BINS) $(EXPECT_INPUT_BINS)
for bin in $(BINS); \
@echo "\033[1;36;49mRunning tests\033[0m"
@for bin in $(BINS); \
do \
echo "# $${bin} #"; \
echo "\033[0;96;49m# $${bin} #\033[0m"; \
${TEST_RUNNER} "$${bin}" test args || exit $$?; \
done
for exp in $(EXPECT_INPUT_BINS); \
@@ -408,30 +409,30 @@ endif
$(BUILD)/bins_static/%: %.c $(DEPS)
mkdir -p "$$(dirname "$@")"
$(CC) "$<" -o "$@" $(FLAGS) $(STATIC_FLAGS)
@$(CC) "$<" -o "$@" $(FLAGS) $(STATIC_FLAGS)
$(BUILD)/bins_expect_input/%: %.c %.exp $(DEPS)
mkdir -p "$$(dirname "$@")"
$(CC) "$<" -o "$@" $(FLAGS) $(STATIC_FLAGS)
@$(CC) "$<" -o "$@" $(FLAGS) $(STATIC_FLAGS)
cp $(word 2, "$^") $(addsuffix .exp,"$@")
$(BUILD)/bins_dynamic/%.so: %.c $(DEPS)
mkdir -p "$$(dirname "$@")"
$(CC) "$<" -o "$@" -shared -fpic $(FLAGS) $(DYNAMIC_FLAGS)
@$(CC) "$<" -o "$@" -shared -fpic $(FLAGS) $(DYNAMIC_FLAGS)
# foobar depends on foo
$(BUILD)/bins_dynamic/libfoobar.so: libfoobar.c $(BUILD)/bins_dynamic/libfoo.so $(DEPS)
mkdir -p "$$(dirname "$@")"
$(CC) "$<" -o "$@" -shared -fpic $(FLAGS) $(DYNAMIC_FLAGS) -L $(BUILD)/bins_dynamic -lfoo
@$(CC) "$<" -o "$@" -shared -fpic $(FLAGS) $(DYNAMIC_FLAGS) -L $(BUILD)/bins_dynamic -lfoo
$(BUILD)/bins_dynamic/dlfcn: dlfcn.c $(BUILD)/bins_dynamic/sharedlib.so $(DEPS)
mkdir -p "$$(dirname "$@")"
$(CC) "$<" -o "$@" $(FLAGS) $(DYNAMIC_FLAGS)
@$(CC) "$<" -o "$@" $(FLAGS) $(DYNAMIC_FLAGS)
$(BUILD)/bins_dynamic/dlopen_scopes: dlopen_scopes.c $(BUILD)/bins_dynamic/libfoobar.so $(BUILD)/bins_dynamic/libfoo.so $(DEPS)
mkdir -p "$$(dirname "$@")"
$(CC) "$<" -o "$@" $(FLAGS) $(DYNAMIC_FLAGS)
@$(CC) "$<" -o "$@" $(FLAGS) $(DYNAMIC_FLAGS)
$(BUILD)/bins_dynamic/%: %.c $(DEPS)
mkdir -p "$$(dirname "$@")"
$(CC) "$<" -o "$@" $(FLAGS) $(DYNAMIC_FLAGS)
@$(CC) "$<" -o "$@" $(FLAGS) $(DYNAMIC_FLAGS)