i have files in directories called data , helpers, , use both of them create target files in result.
the directory structure following:
data + | + file1 | + file2 | + ... + b | + file1 ... helpers + file1 + file2 ... the directory structure in result same in data. therefore, write following rule:
result/%: data/% helpers/% script script $@ $(word 1,$^) $(word 2,$^) the problem file1, file2, etc. in helpers directory not in subdirectory.
i have got following options:
- write separate rule every subdirectory (impractical, there 20)
- do
foreachincluding every subdirectory create rule (how can access prerequisite list then?)
however, rather write 1 of following:
result/%: data/% helpers/$(basename %) # doesn't work result/%: data/% helpers/$(basename $*) # doesn't work either is there way modify pattern in rule declaration modifying stem matches?
the way want enable secondary expansion in makefile.
example:
note directory prefix (d), described in implicit rule search algorithm, appended (after expansion) patterns in prerequisites list. example:
.secondexpansion:
/tmp/foo.o:
%.o: $$(addsuffix /%.c,foo bar) foo.h @echo $^the prerequisite list printed, after secondary expansion , directory prefix reconstruction, /tmp/foo/foo.c /tmp/bar/foo.c foo.h. if not interested in reconstruction, can use $$* instead of % in prerequisites list.
so should work (untested):
.secondexpansion: result/%: data/% helpers/$$(notdir %) make's basename not same shell's basename (that constantly trips me up).
if wanted use $(foreach) though want (untested):
define dirrule result/$1/%: data/$1/% helpers/% @echo cmd 1 @echo cmd 2 endef $(foreach dir,subdir1 subdir2 ... subdir20,$(eval $(call dirrule,$(dir))))
Comments
Post a Comment