summaryrefslogtreecommitdiff
path: root/GNUmakefile
diff options
context:
space:
mode:
Diffstat (limited to 'GNUmakefile')
-rw-r--r--GNUmakefile158
1 files changed, 82 insertions, 76 deletions
diff --git a/GNUmakefile b/GNUmakefile
index 28f287a..8636973 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -1,6 +1,6 @@
# GNUmakefile - Main build script for sbc-harness project
#
-# Copyright (C) 2024 Luke T. Shumaker <lukeshu@lukeshu.com>
+# Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com>
# SPDX-License-Identifier: AGPL-3.0-or-later
# Project configuration ########################################################
@@ -25,23 +25,36 @@ endif
generate/files =
+generate/files += COPYING.txt
+COPYING.txt:
+ wget --no-use-server-timestamps -O $@ https://www.gnu.org/licenses/agpl-3.0.txt
+
+generate/files += 3rd-party/COPYING.newlib.txt
+3rd-party/COPYING.newlib.txt: /usr/share/licenses/arm-none-eabi-newlib/COPYING.NEWLIB
+ cp $< $@
+
generate/files += 3rd-party/linux-errno.txt
-3rd-party/linux-errno.txt: build-aux/linux-errno.txt.gen
+3rd-party/linux-errno.txt: lib9p/linux-errno.txt.gen
$< $(linux.git) $@
-generate/files += lib9p/include/lib9p/linux-errno.h
-lib9p/include/lib9p/linux-errno.h: %: %.gen 3rd-party/linux-errno.txt
+generate/files += lib9p/idl/2010-9P2000.L.9p
+lib9p/idl/2010-9P2000.L.9p: %: %.gen 3rd-party/linux-errno.txt
$^ >$@
-generate/files += lib9p/9p.generated.c lib9p/include/lib9p/9p.generated.h
-lib9p/9p.generated.c lib9p/include/lib9p/9p.generated.h &: lib9p/idl.gen lib9p/idl/*.9p
- $^
+generate/files += lib9p/core_generated.c lib9p/core_include/lib9p/_core_generated.h
+lib9p/core_generated.c lib9p/core_include/lib9p/_core_generated.h &: lib9p/core.gen lib9p/idl/__init__.py lib9p/core_gen lib9p/core_gen/*.py lib9p/idl lib9p/idl/2010-9P2000.L.9p lib9p/idl/*.9p
+ $< $(sort $(filter %.9p,$^))
+
+generate/files += lib9p/tests/test_compile.c
+lib9p/tests/test_compile.c: %: %.gen lib9p/core_include/lib9p/_core_generated.h
+ $^ $@
generate/files += libusb/include/libusb/tusb_helpers.h 3rd-party/MS-LCID.pdf 3rd-party/MS-LCID.txt
libusb/include/libusb/tusb_helpers.h 3rd-party/MS-LCID.pdf 3rd-party/MS-LCID.txt &: libusb/include/libusb/tusb_helpers.h.gen
$^
generate/files += build-aux/sources.mk
+ifeq ($(INNER),)
build-aux/sources.mk: $(if $(wildcard .git),FORCE)
git ls-files | grep -vFx $(foreach f,$(generate/files),-e $f) \
| sed 's,^,$(CURDIR)/,' | xargs editorconfig \
@@ -50,6 +63,8 @@ build-aux/sources.mk: $(if $(wildcard .git),FORCE)
| sort \
>$@.tmp
if ! cmp -s $@.tmp $@; then mv $@.tmp $@; fi
+ @echo '################################################################################'
+endif
generate: $(generate/files)
.PHONY: generate
@@ -58,89 +73,80 @@ generate-clean:
rm -f -- $(generate/files)
.PHONY: generate-clean
-# `build` ######################################################################
+# `build` and `check` ##########################################################
-platforms := $(shell sed -nE 's/if *\(PICO_PLATFORM STREQUAL "(.*)"\)/\1/p' cmd/*/CMakeLists.txt)
+platforms := rp2040 host # $(shell sed -nE 's/if *\(PICO_PLATFORM STREQUAL "(.*)"\)/\1/p' cmd/*/CMakeLists.txt)
+build_types = Debug Release RelWithDebInfo MinSizeRel
-build: $(foreach p,$(platforms),build/$p/build)
+build: $(foreach t,$(build_types),$(foreach p,$(platforms),build/$p-$t/build))
.PHONY: build
-$(foreach p,$(platforms),build/$p/Makefile): build/%/Makefile:
- mkdir -p $(@D) && cd $(@D) && cmake -DCMAKE_BUILD_TYPE=Debug -DPICO_PLATFORM=$* ../..
+$(foreach t,$(build_types),$(foreach p,$(platforms),build/$p-$t/Makefile)): build/%/Makefile:
+ mkdir -p $(@D) && cd $(@D) && cmake -DPICO_PLATFORM=$(firstword $(subst -, ,$*)) -DCMAKE_BUILD_TYPE=$(lastword $(subst -, ,$*)) ../..
-$(foreach p,$(platforms),build/$p/build): build/%/build: build/%/Makefile generate
+$(foreach t,$(build_types),$(foreach p,$(platforms),build/$p-$t/build)): build/%/build: build/%/Makefile generate
$(MAKE) -C $(<D)
-.PHONY: $(foreach p,$(platforms),build/$p/build)
+.PHONY: $(foreach t,$(build_types),$(foreach p,$(platforms),build/$p-$t/build))
+
+check:
+ $(MAKE) -k INNER=t $(foreach t,$(build_types),$(foreach p,$(platforms),build/$p-$t/check))
+.PHONY: check
+
+$(foreach t,$(build_types),$(foreach p,$(platforms),build/$p-$t/check)): build/%/check: build/%/build
+ +cd $(@D) && ctest --output-on-failure $(if $(filter --jobserver-auth=%,$(MAKEFLAGS)),--parallel)
+.PHONY: $(foreach t,$(build_types),$(foreach p,$(platforms),build/$p-$t/check))
# `lint` and `format` ##########################################################
-include build-aux/sources.mk
+sources_all := $(foreach v,$(filter sources_%,$(.VARIABLES)),$($v))
-get_dscname = sed -n '1,3{ /^\#!/d; /^<!--$$/d; /-\*- .* -\*-/d; s,[/*\# ]*,,; s/ - .*//;p; q; }'
+build-aux/venv: build-aux/requirements.txt
+ python3 -m venv $@
+ $@/bin/pip install -r $<
+ touch --no-create $@
-# `lint` ###########
+# `lint` ###############################
+# generic ##########
lint:
- $(MAKE) -k $(patsubst sources_%,lint/%,$(filter sources_%,$(.VARIABLES)))
+ $(MAKE) -k INNER=t $(patsubst sources_%,lint/%,$(filter sources_%,$(.VARIABLES)))
+# Only lint binaries if the build scripts pass lint.
+ $(MAKE) INNER=t lint/bin
+lint/bin: build build-aux/lint-bin
+ ./build-aux/lint-bin $(foreach t,$(build_types),build/rp2040-$t/cmd/sbc_harness/sbc_harness.elf)
+lint/all: lint/%: build-aux/lint-generic build-aux/get-dscname
+ ./build-aux/lint-generic '%s\n' $(sources_$*)
+lint/unknown: lint/%: build-aux/lint-unknown
+ ./build-aux/lint-unknown $(sources_$*)
+.PHONY: lint lint/%
+# specific #########
+lint/c: lint/%: build-aux/lint-h build-aux/get-dscname
+ ./build-aux/lint-h $(filter %.h,$(sources_$*))
lint/sh lint/bash: lint/%:
shellcheck $(sources_$*)
-lint/python3: lint/%:
- mypy --strict --scripts-are-modules $(sources_$*)
- black --check $(sources_$*)
- isort --check $(sources_$*)
-lint/c: lint/%:
- @for filename in $(filter %.h,$(sources_$*)); do \
- dscname=$$($(get_dscname) $$filename); \
- guard=$${dscname//'/'/'_'}; \
- guard=$${guard//'.'/'_'}; \
- guard="_$${guard^^}_"; \
- if ! { grep -Fxq "#ifndef $${guard}" "$$filename" && \
- grep -Fxq "#define $${guard}" "$$filename" && \
- grep -Fxq "#endif /* $${guard} */" "$$filename"; }; then \
- echo "$$filename does not have $${guard} guard"; r=1; \
- fi; \
- done
-lint/make lint/cmake lint/gitignore lint/ini lint/9p lint/markdown: lint/%:
- @:
-lint/unknown: lint/%:
- @printf "%s: cannot lint unknown file type\n" $(sources_$*) >&2
-lint/all: lint/%:
- $(eval export sources_$*)
- @find $$(printf '%s\n' $${sources_$*} | grep -vE '^cmd/[^/]+/static/') \
- -maxdepth 0 -type f | \
- { r=0; while read -r filename; do \
- if ! grep -q 'Copyright (C) 2024 Luke T. Shumaker' $$filename; then \
- echo "$$filename is missing a copyright statement"; r=1; \
- fi; \
- if ! grep -q ' SPDX-License-Identifier[:] ' $$filename; then \
- echo "$$filename is missing an SPDX-License-Identifier"; r=1; \
- fi; \
- dscname_act=$$($(get_dscname) $$filename); \
- dscname_exp=$$(echo "$$filename" | sed \
- -e 's,.*/config/,,' \
- -e 's,.*include/,,' \
- -e 's,^lib9p/idl/,,' \
- -e 's/\.wip$$//'); \
- if [ "$$dscname_act" != "$$dscname_exp" ] && [ "cmd/$$dscname_act" != "$$dscname_exp" ]; then \
- echo "$$filename self-identifies as $$dscname_act (expected $$dscname_exp)"; r=1; \
- fi; \
- if grep -n --color=auto "$$(printf '\\S\t')" $$filename; then \
- echo "$$filename uses tabs for alignment"; r=1; \
- fi; \
- done; exit $$r; }
-.PHONY: lint lint/%
-
-# `format` #########
+ shfmt --diff --case-indent --simplify $(sources_$*)
+lint/python3: lint/%: build-aux/venv
+ ./build-aux/venv/bin/mypy --strict --scripts-are-modules $(sources_$*)
+ ./build-aux/venv/bin/black --check $(sources_$*)
+ ./build-aux/venv/bin/isort --check $(sources_$*)
+ ./build-aux/venv/bin/pylint $(sources_$*)
+ ! grep -nh 'SPECIAL$$' -- lib9p/core.gen lib9p/core_gen/*.py
+ ./build-aux/venv/bin/pytest $(foreach f,$(sources_python3),$(if $(filter test_%.py,$(notdir $f)),$f))
+lint/make lint/cmake lint/gitignore lint/ini lint/9p-idl lint/9p-log lint/markdown lint/pip lint/man-cat: lint/%:
+ @: TODO: Write/adopt linters for these file types
+
+# `format` #############################
+# generic ##########
format:
- $(MAKE) -k $(patsubst sources_%,format/%,$(filter-out sources_all,$(filter sources_%,$(.VARIABLES))))
-format/python3: format/%:
- black $(sources_$*)
- isort $(sources_$*)
-format/sh format/bash: format/%
- @:
-format/c: format/%:
- @: TODO
-format/make format/cmake format/gitignore format/ini format/9p format/markdown: format/%:
- @:
-format/unknown: format/%:
- @:
+ $(MAKE) -k INNER=t $(patsubst sources_%,format/%,$(filter-out sources_all sources_unknown,$(filter sources_%,$(.VARIABLES))))
.PHONY: format format/%
+# specific #########
+format/c: format/%:
+ @: TODO: Adopt a C code-formatter
+format/sh format/bash: format/%:
+ shfmt --write --case-indent --simplify $(sources_$*)
+format/python3: format/%: ./build-aux/venv
+ ./build-aux/venv/bin/black $(sources_$*)
+ ./build-aux/venv/bin/isort $(sources_$*)
+format/make format/cmake format/gitignore format/ini format/9p-idl format/9p-log format/markdown format/pip format/man-cat: format/%:
+ @: TODO: Write/adopt formatters for these file types