diff options
Diffstat (limited to 'GNUmakefile')
-rw-r--r-- | GNUmakefile | 158 |
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 |