build-sys: import Makefile from darvaza.org

Signed-off-by: Alejandro Mery <amery@jpi.io>
This commit is contained in:
2023-08-21 18:00:27 +00:00
parent f714210b37
commit a3f8e2fee3
8 changed files with 413 additions and 11 deletions
+63
View File
@@ -0,0 +1,63 @@
#!/bin/sh
set -eu
: ${GO:=go}
MODULES=$(find * -name go.mod -exec dirname '{}' \;)
GROUPS="pkg cmd"
BASE="$PWD"
mod() {
local d="${1:-.}"
grep ^module "$d/go.mod" | cut -d' ' -f2
}
namedir() {
local d="$1" g= n=
if [ "." = "$d" ]; then
echo "root"
return
fi
for g in $GROUPS; do
n="${d#$g/}"
if [ "x$n" != "x$d" ]; then
echo "$n" | tr '/' '-'
return
fi
done
echo "$d" | tr '/' '-'
}
mod_replace() {
local d="$1"
grep "=>" "$d/go.mod" | sed -n -e "s;^.*\($ROOT_MODULE.*\)[ \t]\+=>.*;\1;p"
}
gen_index() {
local d= n=
for d; do
n=$(namedir "$d")
m=$(mod "$d")
echo "$n:$d:$m"
done
}
ROOT_MODULE=$(mod)
INDEX=$(gen_index $MODULES)
echo "$INDEX" | while IFS=: read name dir mod; do
deps=
for dep in $(mod_replace "$dir"); do
depname=$(echo "$INDEX" | grep ":$dep$" | cut -d: -f1 | tr '\n' ',' | sed -e 's|,\+$||g')
if [ -n "$depname" ]; then
deps="${deps:+$deps,}$depname"
fi
done
echo "$name:$dir:$mod:$deps"
done | sort -V
+196
View File
@@ -0,0 +1,196 @@
#!/bin/sh
set -eu
INDEX="$1"
PROJECTS="$(cut -d':' -f1 "$INDEX")"
COMMANDS="tidy get build test up"
expand() {
local prefix="$1" suffix="$2"
local x= out=
shift 2
for x; do
out="${out:+$out }${prefix}$x${suffix}"
done
echo "$out"
}
prefixed() {
local prefix="${1:+$1-}"
shift
expand "$prefix" "" "$@"
}
suffixed() {
local suffix="${1:+-$1}"
shift
expand "" "$suffix" "$@"
}
# packed remove excess whitespace from lines of commands
packed() {
sed -e 's/^[ \t]\+//' -e 's/[ \t]\+$//' -e '/^$/d;' -e '/^#/d';
}
# packet_oneline converts a multiline script into packed single-line equivalent
packed_oneline() {
packed | tr '\n' ';' | sed -e 's|;$||' -e 's|then;|then |g' -e 's|;[ \t]*|; |g'
}
gen_install_tools() {
cat <<EOT
for url in \$(GO_INSTALL_URLS); do \$(GO) install -v \$\$url; done
EOT
}
gen_revive_exclude() {
local self="$1"
local dirs= d=
dirs="$(cut -d: -f2 "$INDEX" | grep -v '^.$' || true)"
if [ "." != "$self" ]; then
dirs=$(echo "$dirs" | sed -n -e "s;^$self/\(.*\)$;\1;p")
fi
for d in $dirs; do
printf -- "-exclude ./$d/... "
done
}
for cmd in $COMMANDS; do
all="$(prefixed $cmd $PROJECTS)"
depsx=
cat <<EOT
.PHONY: $cmd $all
$cmd: $all
EOT
# default calls
case "$cmd" in
tidy)
call="$(cat <<-EOT | packed
\$(GO) mod tidy
# go vet and revive only if there are .go files
#
$(cat <<-EOL | packed_oneline
set -e
FILES="\$\$(\$(GO) list -f '{{len .GoFiles}}' ./...)"
if [ -n "\$\$FILES" ]; then
\$(GO) vet ./...
\$(REVIVE) \$(REVIVE_RUN_ARGS) ./...
fi
EOL
)
EOT
)"
depsx="fmt \$(REVIVE)"
;;
up)
call="\$(GO) get -u -v ./...
\$(GO) mod tidy"
;;
test)
call="\$(GO) $cmd ./..."
;;
*)
call="\$(GO) $cmd -v ./..."
;;
esac
case "$cmd" in
build|test)
sequential=true ;;
*)
sequential=false ;;
esac
while IFS=: read name dir mod deps; do
deps=$(echo "$deps" | tr ',' ' ')
# cd $dir
if [ "." = "$dir" ]; then
# root
cd=
else
cd="cd '$dir'; "
fi
callx="$call"
if [ "$name" = root ]; then
# special case
case "$cmd" in
get)
cmdx="get -tags tools"
;;
up)
cmdx="get -tags tools -u"
;;
*)
cmdx=
;;
esac
[ -z "$cmdx" ] || cmdx="\$(GO) $cmdx -v ./..."
if [ "up" = "$cmd" ]; then
callx="$cmdx
\$(GO) mod tidy
$(gen_install_tools)"
elif [ "get" = "$cmd" ]; then
callx="$cmdx
$(gen_install_tools)"
elif [ -n "$cmdx" ]; then
classx="$cmdx"
fi
fi
if [ "build" = "$cmd" ]; then
# special build flags for cmd/*
#
callx="$(cat <<-EOL | packed_oneline
set -e
MOD="\$\$(\$(GO) list -f '{{.ImportPath}}' ./...)"
if echo "\$\$MOD" | grep -q -e '.*/cmd/[^/]\+\$\$'; then
\$(GO_BUILD_CMD) ./...
elif [ -n "\$\$MOD" ]; then
\$(GO_BUILD) ./...
fi
EOL
)"
fi
if [ "tidy" = "$cmd" ]; then
# exclude submodules when running revive
#
exclude=$(gen_revive_exclude "$dir")
if [ -n "$exclude" ]; then
callx=$(echo "$callx" | sed -e "s;\(REVIVE)\);\1 $exclude;")
fi
fi
if ! $sequential; then
deps=
fi
cat <<EOT
$cmd-$name:${deps:+ $(prefixed $cmd $deps)}${depsx:+ | $depsx} ; \$(info \$(M) $cmd: $name)
$(echo "$callx" | sed -e "/^$/d;" -e "s|^|\t\$(Q) $cd|")
EOT
done < "$INDEX"
done
for x in $PROJECTS; do
cat <<EOT
$x: $(suffixed $x get build tidy)
EOT
done
+35
View File
@@ -0,0 +1,35 @@
ignoreGeneratedHeader = false
severity = "error"
confidence = 0.8
errorCode = 1
warningCode = 0
enableAllRules = true
[rule.function-length]
arguments = [40,0]
severity = "warning"
[rule.function-result-limit]
arguments = [3]
[rule.argument-limit]
arguments = [5]
[rule.cognitive-complexity]
arguments = [7]
[rule.cyclomatic]
arguments = [10]
[rule.line-length-limit]
arguments = [100]
severity = "warning"
[rule.comment-spacings]
severity = "warning"
[rule.empty-lines]
severity = "warning"
# Disabled rules
[rule.max-public-structs]
disabled = true
[rule.file-header]
disabled = true
[rule.add-constant]
disabled = true
[rule.banned-characters]
disabled = true
+7
View File
@@ -0,0 +1,7 @@
//go:build tools
package tools
import (
_ "github.com/mgechev/revive"
)