ChibiOS/tools/workflows/Makefile

130 lines
3.8 KiB
Makefile

# Used by Jenkins for automation purposes to build projects, run tests,
# gather test results, build documentation.
ROOT := $(realpath ../..)
# Directories to store results of tests and docs
TEST_RESULTS := $(ROOT)/test_results
DOC_RESULTS := $(ROOT)/doc_results
# Directory with auxiliary scripts
WORKFLOWS := $(ROOT)/tools/workflows
# Defines what targets to build in makefile based projects, the order matter.
TARGETS := all clean
# If set to true, use virtual environment for python dependencies. Otherwise,
# use system libraries.
USE_VENV := false
# Makefile based projects
makefile_dirs := $(addprefix $(ROOT)/,demos test testex testhal testrt)
makefiles := $(shell $(WORKFLOWS)/find.py --makefile --make --no-overlaps \
$(makefile_dirs))
single_makefiles := $(filter-out %.make,$(makefiles))
multi_makefiles := $(filter %.make,$(makefiles))
# External dependencies
external := $(addprefix $(ROOT)/ext/,fatfs lwip pico-sdk wolfssl)
# Documents
docs := $(shell find $(ROOT)/doc -type f -name Doxyfile_html)
# Linter scripts
linters := $(shell find $(ROOT)/tools/style -type f -name "*.sh")
# Python virtual environment
venv := $(WORKFLOWS)/.venv
venv_activate := $(venv)/bin/activate
venv_python := $(venv)/bin/python
ifeq ($(USE_VENV),true)
python := $(venv_python)
makefile_venv := $(venv_activate)
else
python := python
makefile_venv :=
endif
.PHONY : all makefiles external docs info lint clean venv
.PHONY : $(makefiles) $(linters) $(docs)
# Build makefile based projects
all : makefiles
makefiles : $(makefiles)
$(python) $(WORKFLOWS)/report.py -t $(TEST_RESULTS) \
-r $(TEST_RESULTS)/test_results
$(single_makefiles) : $(external) $(makefile_venv)
@mkdir -p $(TEST_RESULTS)/$(subst $(ROOT)/,,$(@D))
+$(python) $(WORKFLOWS)/make.py -C $(@D) -f $(@F) -p $(ROOT)/ \
-r $(TEST_RESULTS) -s $(WORKFLOWS)/skip.yaml \
-t $(WORKFLOWS)/target.yaml $(TARGETS)
$(multi_makefiles) : $(external) $(makefile_venv)
@mkdir -p $(TEST_RESULTS)/$(subst $(ROOT)/,,$(@D))
+$(python) $(WORKFLOWS)/make.py -C $(dir $(@D)) -f make/$(@F) -p $(ROOT)/ \
-r $(TEST_RESULTS) -s $(WORKFLOWS)/skip.yaml \
-t $(WORKFLOWS)/target.yaml $(TARGETS)
# External projects
external : $(external)
$(external) :
7z x $@*.7z -o$(@D)
# Build documentation
docs : $(docs)
$(docs) : %Doxyfile_html:
@mkdir -p $(DOC_RESULTS)
cd $(@D) && doxygen $(@F)
tar -czf $(DOC_RESULTS)/$(subst /,_,$(subst $(ROOT)/,,$(@D)))_html.tar.gz \
--transform "s/^\./$(subst /,_,$(subst $(ROOT)/,,$(@D)))_html/g" \
-C $(@D)/html .
# Linter checks
lint : $(linters)
@! grep -r -m 1 ^error: $(TEST_RESULTS)/lint 2>&1 > /dev/null || ( \
echo "Exiting because there are linter errors"; \
exit 1)
$(linters) :
@mkdir -p $(TEST_RESULTS)/lint
cd $(ROOT)/tools/style && bash $(@F) 2>&1 | \
tee $(TEST_RESULTS)/lint/$(basename $(@F)).log
# Print versions of used tools
info :
@which make && make -v
@echo
@which ccache && ccache -V || echo "ccache not present"
@echo
@which arm-none-eabi-gcc && arm-none-eabi-gcc -v || \
echo "arm-none-eabi-gcc not present"
@echo
@which avr-gcc && avr-gcc -v || echo "avr-gcc not present"
@echo
@which doxygen && doxygen -v || echo "doxygen not present"
@echo
@which dot && dot -V || echo "graphviz not present"
@echo
@which perl && perl -v || echo "perl not present"
@echo
@which python3 && python3 -V || echo "python3 not present"
@echo
# Prepare Python virtual environment
venv : $(venv_activate)
$(venv_activate) :
python3 -mvenv $(venv)
$(venv)/bin/pip install \
-r $(WORKFLOWS)/requirements.txt \
-c $(WORKFLOWS)/constraints.txt
# Clean up results of tests and docs
clean :
rm -rf $(TEST_RESULTS)
rm -rf $(DOC_RESULTS)
rm -rf $(external)
rm -rf $(venv)