default: help SRC := ../contracts DST := patched DIFF := diff SRCS := $(shell find $(SRC) -type f) DSTS := $(shell find $(DST) -type f) DIFFS := $(shell find $(DIFF) -type f) ############################################################################### # Apply all patches in the $DIFF folder to the $DST folder apply: $(DST) $(patsubst $(DIFF)/%.patch,$(DST)/%,$(subst _,/,$(DIFFS))) # Reset the $DST folder $(DST): FORCE @rm -rf $@ @cp -r $(SRC) $@ # Update a solidity file in the $DST directory using the corresponding patch $(DST)/%.sol: FORCE | $(DST) @echo Applying patch to $@ @patch -p0 -d $(DST) < $(patsubst $(DST)_%,$(DIFF)/%.patch,$(subst /,_,$@)) ############################################################################### # Record all difference between $SRC and $DST in patches record: $(DIFF) $(patsubst %,$(DIFF)/%.patch,$(subst /,_,$(subst $(SRC)/,,$(SRCS)) $(subst $(DST)/,,$(DSTS)))) # Create the $DIFF folder $(DIFF): FORCE @rm -rf $@ @mkdir $@ # Create the patch file by comparing the source and the destination $(DIFF)/%.patch: FORCE | $(DIFF) @echo Generating patch $@ @diff -ruN \ $(patsubst $(DIFF)/%.patch,$(SRC)/%,$(subst _,/,$@)) \ $(patsubst $(DIFF)/%.patch,$(DST)/%,$(subst _,/,$@)) \ | sed 's+$(SRC)/++g' \ | sed 's+$(DST)/++g' \ > $@ @[ -s $@ ] || rm $@ ############################################################################### help: @echo "usage:" @echo " make apply: create $(DST) directory by applying the patches to $(SRC)" @echo " make record: record the patches capturing the differences between $(SRC) and $(DST)" @echo " make clean: remove all generated files (those ignored by git)" clean: git clean -fdX FORCE: ;