diff options
-rw-r--r-- | contrib/README | 9 | ||||
-rwxr-xr-x | contrib/git_untouch.sh | 40 | ||||
-rw-r--r-- | contrib/xilinx.mk | 4 |
3 files changed, 53 insertions, 0 deletions
diff --git a/contrib/README b/contrib/README index 5885aa9..d145490 100644 --- a/contrib/README +++ b/contrib/README @@ -5,6 +5,13 @@ By default, re-synthesis of a project (eg, after making a change to any HDL files) will attempt to use the previous place-and-route netlist as a starting point via the "smartguide" mechanism. 'make mostlyclean' will prevent this. +By default, a git checkout will update timestamps on all files under version +control. There are good reasons for this, but it can be particularly +frustrating when there are large coregen cores in a project which must be +rebuilt from scratch, even is the .xco files were not touched. The +'untouchcores' target will try to cleverly reset timestamps to prevent this; +run it after a git pull or checkout. + Changes to Makefiles will *not* necessarily result in a full rebuild; the makefiles themselves are not a prerequisite of any targets. It is *strongly* recommended that you 'make clean' (not just 'mostlyclean') after any @@ -20,6 +27,8 @@ make lint - runs lint program on synthesizable Verilog files make mostlyclean - cleans most sim and synth files make clean - cleans all sim and synth files, incl. coregen'd +make untouchcores - reset timestamps on .xco files to last change + make isim/<name>_tb - compiles sim files, then launches simulator GUI make resim/<name>_tb - recompiles sim files w/o launching GUI make test/<name>_tb - runs a single unit test diff --git a/contrib/git_untouch.sh b/contrib/git_untouch.sh new file mode 100755 index 0000000..c9d3ede --- /dev/null +++ b/contrib/git_untouch.sh @@ -0,0 +1,40 @@ +#!/bin/bash -e + +# From http://stackoverflow.com/questions/1964470/whats-the-equivalent-of-use-commit-times-for-git +# Modified to only run on files passed on command line + +OS=${OS:-`uname`} + +get_file_rev() { + git rev-list -n 1 HEAD "$1" +} + +if [ "$OS" = 'FreeBSD' ] +then + update_file_timestamp() { + file_time=`date -r "$(git show --pretty=format:%at --abbrev-commit "$(get_file_rev "$1")" | head -n 1)" '+%Y%m%d%H%M.%S'` + touch -h -t "$file_time" "$1" + } +else + update_file_timestamp() { + file_time=`git show --pretty=format:%ai --abbrev-commit "$(get_file_rev "$1")" | head -n 1` + touch -d "$file_time" "$1" + } +fi + +OLD_IFS=$IFS +IFS=$'\n' + +for file in $@ +do + if [ ! `git status --ignored --porcelain $file` ] + then + update_file_timestamp "$file" + fi +done + +IFS=$OLD_IFS + +git update-index --refresh &> /dev/null || true + +exit 0 diff --git a/contrib/xilinx.mk b/contrib/xilinx.mk index 7c16cd7..2d5c0a5 100644 --- a/contrib/xilinx.mk +++ b/contrib/xilinx.mk @@ -132,6 +132,10 @@ $(coregen_work_dir)/$(project).cgp: contrib/template.cgp @echo "SET speedgrade = $(speedgrade)" >> $@ @echo "SET workingdirectory = ./tmp/" >> $@ +untouchcores: + @echo "Resetting .xco timestamps so that cores won't be rebuilt" + ./contrib/git_untouch.sh $(xilinx_cores) + %.ngc %.v: %.xco $(coregen_work_dir)/$(project).cgp @echo "=== rebuilding $@" @bash -c "$(xil_env); \ |