KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
So I followed the Advanced Auto-Dependency Generation paper -- Makefile : SRCS := main.c foo.c main: main.o foo.o %.o: %.c $(CC) -MMD -MG -MT '$@ $*.d' -c $< -o $@ cp $*.d $*.tmp sed -e 's;#.*;;' -e 's;^[^:]*: *;;' -e 's; *\\$$;;' \ -e '/^$$/d' -e 's;$$; :;' < $*.tmp >> $*.d rm $*.tmp clean:: -rm *.o *.d main -include $(SRCS:.c=.d) main.c : #include "foo.h" int main(int argc, char** argv) { foo() ; return 0 ; } foo.h : #ifndef __FOO_H__ #define __FOO_H__ void foo() ; #endif -- and it works like a charm. But when foo.h becomes a generated file -- Makefile: ... HDRS := foo.h $(HDRS): mk_header.sh $* clean:: -rm $(HDRS) ... mk_header.sh: #!/bin/bash UP=$(tr "[:lower:]" "[:upper:]" <<< $1) cat <<EOF > $1.h #ifndef __${UP}_H__ #define __${UP}_H__ void $1() ; #endif EOF The 1st time I run make , main.d is not yet generated, and thus foo.h is not considered a prerequisite, and thus isn't been generated: $ ls foo.c main.c Makefile mk_header.sh* $ make cc -MMD -MG -MT 'main.o main.d' -c main.c -o main.o cp main.d main.tmp sed -e 's;#.*;;' -e 's;^[^:]*: *;;' -e 's; *\\$;;' \ -e '/^$/d' -e 's;$; :;' < main.tmp >> main.d rm main.tmp cc -MMD -MG -MT 'foo.o foo.d' -c foo.c -o foo.o cp foo.d foo.tmp sed -e 's;#.*;;' -e 's;^[^:]*: *;;' -e 's; *\\$;;' \ -e '/^$/d' -e 's;$; :;' < foo.tmp >> foo.d rm foo.tmp cc main.o foo.o -o main $ ls foo.c foo.d foo.o main* main.c main.d main.o Makefile mk_header.sh* Only in the 2nd invocation of make , the foo.h is generated, and as a
Tags (comma-separated)
Save Edits
Cancel