1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 01:09:47 +01:00
RIOT/makefiles/info.inc.mk
chrysn 4beff4e9d4 makefiles: Align cargo-info output with what happens in the build system
This simplifies the explanation of what might need adjustments depending
on which cargo command is invoked.
2024-08-22 15:16:41 +02:00

260 lines
10 KiB
Makefile

.PHONY: info-objsize info-buildsizes info-build info-boards-supported \
info-features-missing info-modules info-cpu \
info-features-provided info-features-required \
info-features-used info-kconfig-variables \
info-debug-variable-% info-toolchains-supported \
check-toolchain-supported \
info-programmers-supported \
info-rust \
generate-Makefile.ci \
#
info-objsize:
@case "$(SORTROW)" in \
text) SORTROW=1 ;; \
data) SORTROW=2 ;; \
bss) SORTROW=3 ;; \
dec) SORTROW=4 ;; \
"") SORTROW=4 ;; \
*) echo "Usage: $(MAKE) info-objsize SORTROW=[text|data|bss|dec]" ; return ;; \
esac; \
printf ' text\t data\t bss\t dec\t hex\tmodule\n'; \
for i in $(sort $(BASELIBS:%.module=%)); \
do \
$(SIZE) -t -d -B $(BINDIR)/$$i/*.o 2> /dev/null | \
tail -n1 | \
sed -e "s#(TOTALS)#$$i#" | \
sed -e 's#$(BINDIR)##'; \
done | sort -n -r -k $${SORTROW}
info-buildsize:
@$(SIZE) -d -B $(ELFFILE) || echo ''
info-build:
@echo 'APPLICATION: $(APPLICATION)'
@echo 'APPDIR: $(APPDIR)'
@echo ''
@echo 'supported boards:'
@echo $$($(MAKE) info-boards-supported)
@echo ''
@echo 'BOARD: $(BOARD)'
@echo 'CPU: $(CPU)'
@echo ''
@echo 'RIOTBASE: $(RIOTBASE)'
@echo 'BOARDDIR: $(BOARDDIR)'
@echo 'EXTERNAL_BOARD_DIRS:$(EXTERNAL_BOARD_DIRS)'
@echo 'RIOTCPU: $(RIOTCPU)'
@echo 'RIOTPKG: $(RIOTPKG)'
@echo ''
@echo 'DEFAULT_MODULE: $(sort $(filter-out $(DISABLE_MODULE), $(DEFAULT_MODULE)))'
@echo 'DISABLE_MODULE: $(sort $(DISABLE_MODULE))'
@echo 'USEMODULE: $(sort $(filter-out $(DEFAULT_MODULE), $(USEMODULE)))'
@echo ''
@echo 'ELFFILE: $(ELFFILE)'
@echo 'HEXFILE: $(HEXFILE)'
@echo 'BINFILE: $(BINFILE)'
@echo 'FLASHFILE: $(FLASHFILE)'
@echo ''
@echo 'FEATURES_USED:'
@echo ' $(or $(FEATURES_USED), -none-)'
@echo 'FEATURES_REQUIRED:'
@echo ' $(or $(sort $(FEATURES_REQUIRED)), -none-)'
@echo 'FEATURES_REQUIRED_ANY:'
@echo ' $(or $(sort $(FEATURES_REQUIRED_ANY)), -none-)'
@echo 'FEATURES_OPTIONAL_ONLY (optional that are not required, strictly "nice to have"):'
@echo ' $(or $(FEATURES_OPTIONAL_ONLY), -none-)'
@echo 'FEATURES_OPTIONAL_MISSING (missing optional features):'
@echo ' $(or $(FEATURES_OPTIONAL_MISSING), -none-)'
@echo 'FEATURES_PROVIDED (by the board or USEMODULE'"'"'d drivers):'
@echo ' $(or $(sort $(FEATURES_PROVIDED)), -none-)'
@echo 'FEATURES_MISSING (only non optional features):'
@echo ' $(or $(FEATURES_MISSING), -none-)'
@echo 'FEATURES_BLACKLIST (blacklisted features):'
@echo ' $(or $(sort $(FEATURES_BLACKLIST)), -none-)'
@echo 'FEATURES_USED_BLACKLISTED (used but blacklisted features):'
@echo ' $(or $(sort $(FEATURES_USED_BLACKLISTED)), -none-)'
@echo ''
@echo 'FEATURES_CONFLICT: $(FEATURES_CONFLICT)'
@echo 'FEATURES_CONFLICT_MSG: $(FEATURES_CONFLICT_MSG)'
@echo 'FEATURES_CONFLICTING:'
@echo ' $(or $(FEATURES_CONFLICTING), -none-)'
@echo ''
@echo -e 'INCLUDES:$(patsubst %, \n\t%, $(INCLUDES))'
@echo ''
@echo 'CC: $(CC)'
@echo 'CFLAGS:$(patsubst %, \n\t%, $(subst ','"'"',$(CFLAGS)))'
@echo ''
@echo 'CXX: $(CXX)'
@echo -e 'CXXUWFLAGS:$(patsubst %, \n\t%, $(CXXUWFLAGS))'
@echo -e 'CXXEXFLAGS:$(patsubst %, \n\t%, $(CXXEXFLAGS))'
@echo ''
@echo 'RUST_TARGET: $(RUST_TARGET)'
@echo 'CARGO_PROFILE: $(CARGO_PROFILE)'
@echo 'CARGO_OPTIONS: $(CARGO_OPTIONS)'
@echo ''
@echo 'LINK: $(LINK)'
@echo -e 'LINKFLAGS:$(patsubst %, \n\t%, $(LINKFLAGS))'
@echo ''
@echo 'OBJCOPY: $(OBJCOPY)'
@echo 'OFLAGS: $(OFLAGS)'
@echo ''
@echo 'FLASHER: $(FLASHER)'
@echo 'FFLAGS: $(FFLAGS)'
@echo ''
@echo 'TERMPROG: $(TERMPROG)'
@echo 'TERMFLAGS: $(TERMFLAGS)'
@echo 'TERMENV: $(TERMENV)'
@echo 'PORT: $(PORT)'
@echo 'PROG_DEV: $(PROG_DEV)'
@echo ''
@echo 'DEBUGGER: $(DEBUGGER)'
@echo 'DEBUGGER_FLAGS: $(DEBUGGER_FLAGS)'
@echo
@echo 'DOWNLOAD_TO_FILE: $(DOWNLOAD_TO_FILE)'
@echo 'DOWNLOAD_TO_STDOUT: $(DOWNLOAD_TO_STDOUT)'
@echo 'UNZIP_HERE: $(UNZIP_HERE)'
@echo ''
@echo 'DEBUGSERVER: $(DEBUGSERVER)'
@echo 'DEBUGSERVER_FLAGS: $(DEBUGSERVER_FLAGS)'
@echo ''
@echo 'DEBUGCLIENT: $(DEBUGCLIENT)'
@echo 'DEBUGCLIENT_FLAGS: $(DEBUGCLIENT_FLAGS)'
@echo ''
@echo 'RESET: $(RESET)'
@echo 'RESET_FLAGS: $(RESET_FLAGS)'
@echo ''
@echo -e 'MAKEFILE_LIST:$(patsubst %, \n\t%, $(abspath $(MAKEFILE_LIST)))'
define json_string_or_null
$(or $(1:%="%"), null)
endef
# Convert a space separated list to a JSON array
define _to_json_string_list
[$(filter-out "","$(subst $(space),"$(comma)$(space)",$(1))")]
endef
# Strips out any existing quotes so that the generated JSON is valid, not necessary sensible
define to_json_string_list
$(call _to_json_string_list,$(strip $(subst ",,$(subst \",,$(1)))))
endef
# Crude json encoded build info.
# The output generated here is a best-effort JSON encoding, it is not perfect,
# converting the space separated lists in Make to a JSON array is flawed, it
# doesn't consider quoted parts as a single list item. This mainly shows up in
# cflags such as: -DNIMBLE_HOST_PRIO="(NIMBLE_CONTROLLER_PRIO + 1)", this is
# splitted into 3 array elements. To ensure that the generated JSON is valid,
# double quotes are currently stripped before generating the array.
info-build-json:
@echo '{ '
@echo '"APPLICATION": "$(APPLICATION)",'
@echo '"APPDIR": "$(APPDIR)",'
@echo '"BOARD": "$(BOARD)",'
@echo '"CPU": "$(CPU)",'
@echo '"RIOTBASE": "$(RIOTBASE)",'
@echo '"BOARDDIR": "$(BOARDDIR)",'
@echo '"RIOTCPU": "$(RIOTCPU)",'
@echo '"RIOTPKG": "$(RIOTPKG)",'
@echo '"EXTERNAL_BOARD_DIRS": $(call json_string_or_null,$(EXTERNAL_BOARD_DIRS)),'
@echo '"BINDIR": "$(BINDIR)",'
@echo '"ELFFILE": "$(ELFFILE)",'
@echo '"HEXFILE": "$(HEXFILE)",'
@echo '"BINFILE": "$(BINFILE)",'
@echo '"FLASHFILE": "$(FLASHFILE)",'
@echo '"DEFAULT_MODULE": $(call to_json_string_list,$(sort $(filter-out $(DISABLE_MODULE), $(DEFAULT_MODULE)))),'
@echo '"DISABLE_MODULE": $(call to_json_string_list,$(sort $(DISABLE_MODULE))),'
@echo '"USEMODULE": $(call to_json_string_list,$(sort $(filter-out $(DEFAULT_MODULE), $(USEMODULE)))),'
@echo '"FEATURES_USED": $(call to_json_string_list,$(FEATURES_USED)),'
@echo '"FEATURES_REQUIRED": $(call to_json_string_list,$(sort $(FEATURES_REQUIRED))),'
@echo '"FEATURES_REQUIRED_ANY": $(call to_json_string_list,$(sort $(FEATURES_REQUIRED_ANY))),'
@echo '"FEATURES_OPTIONAL_ONLY": $(call to_json_string_list,$(FEATURES_OPTIONAL_ONLY)),'
@echo '"FEATURES_OPTIONAL_MISSING": $(call to_json_string_list,$(FEATURES_OPTIONAL_MISSING)),'
@echo '"FEATURES_PROVIDED": $(call to_json_string_list,$(sort $(FEATURES_PROVIDED))),'
@echo '"FEATURES_MISSING": $(call to_json_string_list,$(FEATURES_MISSING)),'
@echo '"FEATURES_BLACKLIST": $(call to_json_string_list,$(sort $(FEATURES_BLACKLIST))),'
@echo '"FEATURES_USED_BLACKLISTED": $(call to_json_string_list,$(sort $(FEATURES_USED_BLACKLISTED))),'
@echo '"FEATURES_CONFLICT": $(call to_json_string_list,$(FEATURES_CONFLICT)),'
@echo '"FEATURES_CONFLICTING": $(call to_json_string_list,$(FEATURES_CONFLICTING)),'
@echo '"PREFIX": $(call json_string_or_null,$(PREFIX)),'
@echo '"CC": "$(CC)",'
@echo '"CXX": "$(CXX)",'
@echo '"LINK": "$(LINK)",'
@echo '"OBJCOPY": "$(OBJCOPY)",'
@echo '"INCLUDES": $(call to_json_string_list,$(strip $(INCLUDES))),'
@echo '"OFLAGS": $(call to_json_string_list,$(OFLAGS)),'
@echo '"CFLAGS": $(call to_json_string_list,$(CFLAGS)),'
@echo '"CXXUWFLAGS": $(call to_json_string_list,$(CXXUWFLAGS)),'
@echo '"CXXEXFLAGS": $(call to_json_string_list,$(CXXEXFLAGS)),'
@echo '"LINKFLAGS": $(call to_json_string_list,$(LINKFLAGS))'
@echo '}'
info-files: QUIET := 0
info-files:
@( \
echo "$(abspath $(shell echo "$(MAKEFILE_LIST)"))" | tr ' ' '\n'; \
CSRC="$$($(MAKE) USEPKG="" -Bn | grep -o -e "[^ ]\+\.[csS]$$" -e "[^ ]\+\.[csS][ \']" | grep -v -e "^\s*-D")"; \
echo "$$CSRC"; \
echo "$(RIOTBASE)/Makefile.base"; \
echo "$$CSRC" | xargs dirname -- | sort | uniq | xargs -I{} find {} -name "Makefile*"; \
echo "$$CSRC" | xargs $(CC) $(CFLAGS) $(INCLUDES) -MM 2> /dev/null | grep -o "[^ ]\+\.h"; \
if [ -n "$$SRCXX" ]; then \
CPPSRC="$$($(MAKE) -Bn USEPKG="" | grep -o -e "[^ ]\+\.cpp" | grep -v -e "^\s*-D")"; \
echo "$$CPPSRC"; \
echo "$$CPPSRC" | xargs dirname -- | sort | uniq | xargs -I{} find {} -name "Makefile*"; \
echo "$$CPPSRC" | xargs $(CXX) $(CXXFLAGS) $(INCLUDES) -MM 2> /dev/null | grep -o "[^ ]\+\.h"; \
fi; \
$(foreach pkg,$(USEPKG),find $(RIOTPKG)/$(pkg) -type f;) \
) | sort | uniq | sed 's#$(RIOTBASE)/##'
info-modules:
@for i in $(sort $(USEMODULE)); do echo $$i; done
info-packages:
@for i in $(sort $(USEPKG)); do echo $$i; done
info-cpu:
@echo $(CPU)
info-features-provided:
@for i in $(sort $(FEATURES_PROVIDED)); do echo $$i; done
info-features-required:
@for i in $(sort $(FEATURES_REQUIRED)); do echo $$i; done
info-features-missing:
@for i in $(FEATURES_MISSING); do echo $$i; done
info-features-used:
@for i in $(FEATURES_USED); do echo $$i; done
# This target prints all variables set via KConfig sorted alphabetically for
# debugging.
info-kconfig-variables:
@for i in $(sort $(filter CONFIG_%,$(.VARIABLES))); do echo $$i; done
info-debug-variable-%:
@echo $($*)
info-toolchains-supported:
@echo $(filter-out $(TOOLCHAINS_BLACKLIST),$(TOOLCHAINS_SUPPORTED))
check-toolchain-supported:
@exit $(if $(filter $(TOOLCHAIN),$(filter-out $(TOOLCHAINS_BLACKLIST),$(TOOLCHAINS_SUPPORTED))),0,1)
info-programmers-supported:
@echo $(sort $(PROGRAMMERS_SUPPORTED))
info-rust:
cargo version
c2rust --version
@echo "To use this setup of Rust in an IDE, add these command line arguments to the \`cargo check\` or \`rust-analyzer\`:"
@echo " --profile $(CARGO_PROFILE) $(CARGO_OPTIONS)"
@echo "and export these environment variables:"
@echo " CARGO_BUILD_TARGET=\"$(RUST_TARGET)\""
@echo " RIOT_COMPILE_COMMANDS_JSON=\"$(CARGO_COMPILE_COMMANDS)\""
@echo " RIOTBUILD_CONFIG_HEADER_C=\"$(RIOTBUILD_CONFIG_HEADER_C)\""
@echo "You can also call cargo related commands with \`make cargo-command CARGO_COMMAND=\"cargo check\"\`."
@echo "Beware that the way command line arguments are passed in is not consistent across cargo commands, so adding \`--profile $(CARGO_PROFILE)\` or other flags from above as part of CARGO_COMMAND may be necessary."