It seems the attached Makefile will fail for a clean build. I read through the docs and it seems that there is nothing that says this should not work. The problem is a invalid assumption that if a implicit prerequisite's directory does not exist at the beginning then it must not be a candidate. It fails to not notice that during the bulding of other rules the directory will in fact be created. This is an example Makefile that shows the problem. firstly: make setup # make some empty test files - assume these are source files make # fails ! make work.i686/file1.out # works - created work.i686 directory make # works properly now. If you patch version make-3.79.tar.gz's implicit.c (removing the assumption noted above) the Makefile builds without a hitch. Question 1 : Is there a way with the current make to get around this ? Question 2 : If the answer is no to Q1 can we introduce this fix in the next make release ? Doing this would be very useful for me so that I can make a generic Makefile that can enable a source tree to build with multiple kinds of builds simultaneously. I have developed a generic base Makefile that can do this but this bug is really cramping. Regards G ------------------------- Patch to implicit.c ----------------- --- implicit.BAK Fri Jan 21 21:43:03 2000 +++ implicit.c Sat Jun 10 15:21:11 2000 @@ -398,8 +398,10 @@ directory (the one gotten by prepending FILENAME's directory), so it might actually exist. */ - if ((!dep->changed || check_lastslash) - && (lookup_file (p) != 0 || file_exists_p (p))) +/* if ((!dep->changed || check_lastslash) + && (lookup_file (p) != 0 || file_exists_p (p))) */ + + if ((lookup_file (p) != 0 || file_exists_p (p))) { found_files[deps_found++] = xstrdup (p); continue;
WORKDIR=work.i686 ifeq ($(wildcard $(WORKDIR)),) DEPEND_DIR=$(WORKDIR) else DEPEND_DIR= endif # make some sample source files ifeq ($(wildcard file*.in),) XX:=$(shell touch file1.in file2.in ) endif IN_FILES=$(wildcard *.in) OUTFILES=$(IN_FILES:%.in=$(WORKDIR)/%.out) all : /tmp/file.inst $(WORKDIR)/file.inst : $(OUTFILES) cat $^ > $@ $(WORKDIR)/%.out : %.in $(DEPEND_DIR) cp $< $@ /tmp/% : $(WORKDIR)/% cp $< $@ workdir : $(DEPEND_DIR) $(WORKDIR) : mkdir -p $(WORKDIR) clean : rm -rf $(WORKDIR) /tmp/file.inst