Makefile rebuilds all files even if only one changes -
i writing makefile project large number of js files in complex directory structure. when run needs perform compilation on each file , save results different directory same tree structure (right that's simulated cp
). when run make js
builds should , when run make js
again says there no work do. when modify 1 of files , make js
re-builds entire tree instead of modified file.
shell := /bin/bash builddir := build/gui/ rawjsfiles := $(shell find app -name '*.js') built_rawjsfiles := $(patsubst %, $(builddir)%,$(rawjsfiles)) $(builddir): mkdir -p $(builddir) $(rawjsfiles): $(builddir) $(built_rawjsfiles): $(rawjsfiles) mkdir -p $(@d) # compile step cp $(shell python -c "print '$@'.lstrip('${builddir}')") $(@d) .phony: js js: $(built_rawjsfiles)
the line $(built_rawjsfiles): $(rawjsfiles)
setting prerequisites of each file in $(built_rawjsfiles)
all files in $(rawjsfiles)
.
to one-to-one mapping want need pattern rule or static pattern rule.
also embedded python snippet isn't at all doing intended there. removing longest leading prefix value of $@
contains of characters in builddir
namely build/gui/
(only not string characters that's equivalent lstrip('/iugdlb')
). (oh, don't need $(shell)
here in shell context normal command substitution work ($$(python ...)
.)
that being said if use pattern or static pattern rule you'll have easier ways source filename messing python that.
something should work (untested):
$(builddir)%.js: %.js mkdir -p $(@d) cp $^ $(@d)