I am trying to create a subdirectory in my project (let’s call it $PROJECT/child) that needs to pull in a Makefile (let’s call it ../Makefile.inc) from its parent, $PROJECT/Makefile.inc. Later I want to copy $PROJECT/child somewhere else so it can run independently of $PROJECT.
There is a common Makefile that needs to be included in both projects and shipped when the subdirectory is copied, and I want it to be included in both cases. So I thought I would link it in during the child build, if it isn’t found. (I don’t want to just include ../Makefile.inc, because this will disappear when I copy the project, and I don’t want the calling build system to be responsible for putting the Makefile.inc in place.)
With those constraints, here’s a horrible hack that I’ve come up with to do this, within $PROJECT/child/Makefile:
HACK = $(shell test -f Makefile.inc || ln -f ../Makefile.inc .)
include $(HACK)Makefile.inc
Notice the extra special duct tape on that second command. I have to actually include $(HACK) even though it’s going to end up empty, so that the $(shell ...) will be evaluated. 😉
Is there a cleaner way to make this happen?
Give a rule to build
Makefile.inc. (makewill complain thatMakefile.incdoesn’t exist when it parses theincludeline, but it will go on parsing the main makefile, apply any rule to build included files, and go back and re-parse the main makefile with the included files.)