mkversion.sh: now regenerates version_pm3.c (and consequently the binaries) only when needed

and add --force to forcibly regenerate version_pm3.c

and small fixes:
* document mkversion.sh usage
* remove call to mkversion.sh in client/experimental_lib/CMakeLists.txt on release
* remove call to old `mkversion.pl` in bootrom/Makefile
* just in case, mkversion.sh takes care of atomic write of the file
This commit is contained in:
Philippe Teuwen 2023-08-03 00:42:08 +02:00
parent 9dfc39dbbf
commit cb72897b17
8 changed files with 61 additions and 15 deletions

View file

@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file.
This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
## [unreleased][unreleased] ## [unreleased][unreleased]
- Changed `mkversion.sh` - now regenerates version_pm3.c (and consequently the binaries) only when needed (@doegox)
- Updated ATR list (@iceman1001) - Updated ATR list (@iceman1001)
- Changed `mem load -m` - now correctly erase all allocated flash memory (@iceman1001) - Changed `mem load -m` - now correctly erase all allocated flash memory (@iceman1001)
- Fixed emulator quick dump to handle MFC Ev1 extra sectors (@iceman100) - Fixed emulator quick dump to handle MFC Ev1 extra sectors (@iceman100)

View file

@ -370,10 +370,10 @@ release:
# - Tagging temporarily... # - Tagging temporarily...
@git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION) @git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION)
# - Changing default version information based on new tag # - Changing default version information based on new tag
@$(SH) tools/mkversion.sh > common/default_version_pm3.c.tmp && $(MV) common/default_version_pm3.c.tmp common/default_version_pm3.c @$(SH) tools/mkversion.sh common/default_version_pm3.c
# - Removing mkversion calls # - Removing mkversion calls
@sed -i 's#^.*\.\./tools/mkversion.sh.*|| #\t$$(Q)#' client/Makefile bootrom/Makefile armsrc/Makefile @sed -i 's#^.*\.\./tools/mkversion.sh.*|| #\t$$(Q)#' client/Makefile bootrom/Makefile armsrc/Makefile
@sed -i '/COMMAND/s/sh .*|| //' client/CMakeLists.txt @sed -i '/COMMAND/s/sh .*|| //' client/CMakeLists.txt client/experimental_lib/CMakeLists.txt
# - Deleting tag... # - Deleting tag...
@git tag -d $(VERSION) @git tag -d $(VERSION)
# - Amending commit... # - Amending commit...

View file

@ -181,10 +181,10 @@ showinfo:
.DELETE_ON_ERROR: .DELETE_ON_ERROR:
# version_pm3.c should be remade on every time fullimage.stage1.elf should be remade # version_pm3.c should be checked on every time fullimage.stage1.elf should be remade
version_pm3.c: default_version_pm3.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) .FORCE version_pm3.c: default_version_pm3.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) .FORCE
$(info [-] GEN $@) $(info [-] CHECK $@)
$(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ $(Q)$(SH) ../tools/mkversion.sh $@ || $(CP) $< $@
fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR) fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR)
$(info [-] GEN $@) $(info [-] GEN $@)

View file

@ -53,10 +53,10 @@ INSTALLFW = $(OBJDIR)/bootrom.elf
OBJS = $(OBJDIR)/bootrom.s19 OBJS = $(OBJDIR)/bootrom.s19
# version_pm3.c should be remade on every compilation # version_pm3.c should be checked on every compilation
version_pm3.c: default_version_pm3.c .FORCE version_pm3.c: default_version_pm3.c .FORCE
$(info [=] GEN $@) $(info [=] CHECK $@)
$(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ $(Q)$(SH) ../tools/mkversion.sh $@ || $(CP) $< $@
all: showinfo $(OBJS) all: showinfo $(OBJS)

View file

@ -397,7 +397,7 @@ set (TARGET_SOURCES
add_custom_command( add_custom_command(
OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c
COMMAND sh ${PM3_ROOT}/tools/mkversion.sh > ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c COMMAND sh ${PM3_ROOT}/tools/mkversion.sh ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c
DEPENDS ${PM3_ROOT}/common/default_version_pm3.c DEPENDS ${PM3_ROOT}/common/default_version_pm3.c
) )

View file

@ -918,10 +918,10 @@ src/pm3_pywrap.c: pm3.i
.PHONY: all clean install uninstall tarbin .FORCE .PHONY: all clean install uninstall tarbin .FORCE
# version_pm3.c should be remade on every compilation # version_pm3.c should be checked on every compilation
src/version_pm3.c: default_version_pm3.c .FORCE src/version_pm3.c: default_version_pm3.c .FORCE
$(info [=] GEN $@) $(info [=] CHECK $@)
$(Q)$(SH) ../tools/mkversion.sh > $@ || $(CP) $< $@ $(Q)$(SH) ../tools/mkversion.sh $@ || $(CP) $< $@
# easy printing of MAKE VARIABLES # easy printing of MAKE VARIABLES
print-%: ; @echo $* = $($*) print-%: ; @echo $* = $($*)

View file

@ -397,7 +397,7 @@ set (TARGET_SOURCES
add_custom_command( add_custom_command(
OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c OUTPUT ${CMAKE_BINARY_DIR}/version_pm3.c
COMMAND sh ${PM3_ROOT}/tools/mkversion.sh > ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c COMMAND sh ${PM3_ROOT}/tools/mkversion.sh ${CMAKE_BINARY_DIR}/version_pm3.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version_pm3.c ${CMAKE_BINARY_DIR}/version_pm3.c
DEPENDS ${PM3_ROOT}/common/default_version_pm3.c DEPENDS ${PM3_ROOT}/common/default_version_pm3.c
) )

View file

@ -1,5 +1,13 @@
#!/usr/bin/env sh #!/usr/bin/env sh
if [ "$1" = "--help" ] || [ "$1" = "-h" ] || [ "$1" = "" ]; then
echo "To report a short string about the current version:"
echo " $0 --short"
echo "To regenerate version_pm3.c if needed:"
echo " $0 [--force] [--undecided] path/to/version_pm3.c"
exit 0
fi
# Output a version_pm3.c file that includes information about the current build # Output a version_pm3.c file that includes information about the current build
# From mkversion.pl # From mkversion.pl
# pure sh POSIX as now even on Windows we use WSL or ProxSpace with sh available # pure sh POSIX as now even on Windows we use WSL or ProxSpace with sh available
@ -13,6 +21,27 @@ if [ "$1" = "--short" ]; then
SHORT=true SHORT=true
shift shift
fi fi
FORCE=false
if [ "$1" = "--force" ]; then
FORCE=true
shift
fi
UNDECIDED=false
if [ "$1" = "--undecided" ]; then
UNDECIDED=true
shift
fi
VERSIONSRC="$1"
if ! $SHORT && [ "$VERSIONSRC" = "" ]; then
echo "Error: $0 is missing its destination filename"
exit 1
fi
if $SHORT && [ "$VERSIONSRC" != "" ]; then
echo "Error: can't output a short string and generate file at the same time"
exit 1
fi
# if you are making your own fork, change this line to reflect your fork-name # if you are making your own fork, change this line to reflect your fork-name
fullgitinfo="Iceman" fullgitinfo="Iceman"
@ -27,7 +56,7 @@ if [ "$commandGIT" != "" ]; then
# now avoiding the "fatal: No names found, cannot describe anything." error by fallbacking to abbrev hash in such case # now avoiding the "fatal: No names found, cannot describe anything." error by fallbacking to abbrev hash in such case
gitversion=$(git describe --dirty --always) gitversion=$(git describe --dirty --always)
gitbranch=$(git rev-parse --abbrev-ref HEAD) gitbranch=$(git rev-parse --abbrev-ref HEAD)
if [ "$1" != "--undecided" ]; then if $UNDECIDED; then
if [ "$gitversion" != "${gitversion%-dirty}" ]; then if [ "$gitversion" != "${gitversion%-dirty}" ]; then
clean=0 clean=0
else else
@ -68,7 +97,21 @@ sha=$(
if [ "$sha" = "" ]; then if [ "$sha" = "" ]; then
sha="no sha256" sha="no sha256"
fi fi
cat <<EOF
REDO=true
if ! $FORCE && [ -f "$VERSIONSRC" ]; then
# version src file exists, check if it needs to be updated
# file parser quite fragile, be careful if you edit VERSIONSRC template below...
oldclean=$(sed '13s/.*\([0-9]\+\).*/\1/;13!d' "$VERSIONSRC")
oldfullgitinfo=$(sed '14s/.*"\([^"]*\)".*/\1/;14!d' "$VERSIONSRC")
oldsha=$(sed '16s/.*"\([^"]*\)".*/\1/;16!d' "$VERSIONSRC")
if [ "$oldclean" = "$clean" ] && [ "$oldfullgitinfo" = "$fullgitinfo" ] && [ "$oldsha" = "$sha" ]; then
REDO=false
fi
fi
if $REDO; then
# use a tmp file to avoid concurrent call to mkversion to parse a half-written file.
cat > "${VERSIONSRC}.tmp" <<EOF
#include "common.h" #include "common.h"
/* Generated file, do not edit */ /* Generated file, do not edit */
#ifndef ON_DEVICE #ifndef ON_DEVICE
@ -87,3 +130,5 @@ const struct version_information_t SECTVERSINFO g_version_information = {
"$sha" "$sha"
}; };
EOF EOF
mv "${VERSIONSRC}.tmp" "${VERSIONSRC}"
fi