#!/bin/sh set -u root=$(cd "$(dirname "$0")" && pwd) mkproj=${MKPROJ:-$root/mkproj} work=$root/tests rm -rf "$work" mkdir -p "$work" trap 'rm -rf "$work"' EXIT pass=0 fail=0 ok() { pass=$((pass + 1)); printf ' ok %s\n' "$1"; } bad() { fail=$((fail + 1)); printf ' FAIL %s\n' "$1"; } skip() { printf ' skip %s\n' "$1"; } have() { command -v "$1" >/dev/null 2>&1; } build_run() { bs=$1 dir=$2 name=$3 case $bs in make) ( cd "$dir" && make ) >/dev/null 2>&1 "$dir/bin/$name" 2>&1 ;; premake) ( cd "$dir" && premake5 gmake2 && make ) >/dev/null 2>&1 "$dir/bin/$name" 2>&1 ;; cmake) ( cd "$dir" && cmake -B build && cmake --build build ) >/dev/null 2>&1 "$dir/build/$name" 2>&1 ;; meson) ( cd "$dir" && meson setup build && meson compile -C build ) >/dev/null 2>&1 "$dir/build/$name" 2>&1 ;; xmake) ( cd "$dir" && xmake -y ) >/dev/null 2>&1 ( cd "$dir" && xmake run ) 2>&1 ;; esac } check() { label=$1 bs=$2 name=$3 shift 3 if ! ( cd "$work" && "$mkproj" --no-git -b "$bs" "$@" "$name" ) >/dev/null 2>&1 then bad "$label (generate)" return fi if build_run "$bs" "$work/$name" "$name" | grep -q 'type shi' then ok "$label" else bad "$label (build/run)" fi } lib_build() { bs=$1 dir=$2 case $bs in make) ( cd "$dir" && make ) >/dev/null 2>&1 ;; premake) ( cd "$dir" && premake5 gmake2 && make ) >/dev/null 2>&1 ;; cmake) ( cd "$dir" && cmake -B build && cmake --build build ) >/dev/null 2>&1 ;; meson) ( cd "$dir" && meson setup build && meson compile -C build ) >/dev/null 2>&1 ;; xmake) ( cd "$dir" && xmake -y ) >/dev/null 2>&1 ;; esac } check_lib() { bs=$1 name=$2 if ! ( cd "$work" && "$mkproj" --no-git -b "$bs" -k lib "$name" ) >/dev/null 2>&1 then bad "$bs / lib (generate)" return fi if lib_build "$bs" "$work/$name" then ok "$bs / lib" else bad "$bs / lib (build)" fi } echo "mkproj test harness ($mkproj)" echo echo "cli:" "$mkproj" --version >/dev/null 2>&1 && ok "--version" || bad "--version" "$mkproj" --help >/dev/null 2>&1 && ok "--help" || bad "--help" ( cd "$work" && "$mkproj" --no-git --lang=cpp eqform ) >/dev/null 2>&1 && [ -f "$work/eqform/src/main.cpp" ] && ok "--lang=cpp (=form)" || bad "--lang=cpp (=form)" echo echo "name validation (these must be rejected):" for badname in "bad name" "a/b" ".." "" 'x") evil('; do if ( cd "$work" && "$mkproj" --no-git "$badname" ) >/dev/null 2>&1 then bad "rejects [$badname]" else ok "rejects [$badname]" fi done echo echo "build matrix:" for bs in make cmake meson premake xmake; do tool=$bs [ "$bs" = premake ] && tool=premake5 if ! have "$tool"; then skip "$bs (no $tool)"; continue; fi if [ "$bs" = meson ] && ! have ninja; then skip "meson (no ninja)"; continue; fi check "$bs / c" "$bs" "t_${bs}_c" check "$bs / cpp" "$bs" "t_${bs}_cpp" -l cpp check "$bs / flat" "$bs" "t_${bs}_flat" --flat [ "$(uname)" = Darwin ] && check "$bs / objc" "$bs" "t_${bs}_objc" -l objc check_lib "$bs" "t_${bs}_lib" done if [ "$(uname)" = Darwin ] && have nasm; then check "nasm / make" make t_nasm -l nasm else skip "nasm (needs macOS + nasm)" fi echo echo "generated files:" ( cd "$work" && "$mkproj" --no-git clangd_on ) >/dev/null 2>&1 [ -f "$work/clangd_on/compile_flags.txt" ] && ok "compile_flags.txt generated" || bad "compile_flags.txt generated" ( cd "$work" && "$mkproj" --no-git --no-clangd clangd_off ) >/dev/null 2>&1 [ -f "$work/clangd_off/compile_flags.txt" ] && bad "--no-clangd skips compile_flags.txt" || ok "--no-clangd skips compile_flags.txt" ( cd "$work" && "$mkproj" --no-git --license mit lic_mit ) >/dev/null 2>&1 grep -q 'MIT License' "$work/lic_mit/LICENSE" 2>/dev/null && ok "--license mit" || bad "--license mit" ( cd "$work" && MKPROJ_BUILD=cmake "$mkproj" --no-git envdef ) >/dev/null 2>&1 [ -f "$work/envdef/CMakeLists.txt" ] && ok "MKPROJ_BUILD env default" || bad "MKPROJ_BUILD env default" echo printf '%d passed, %d failed\n' "$pass" "$fail" [ "$fail" -eq 0 ]