Make: Difference between revisions
Jump to navigation
Jump to search
Line 5: | Line 5: | ||
** [http://www.gnu.org/software/make/manual/make.html Manual] |
** [http://www.gnu.org/software/make/manual/make.html Manual] |
||
== |
== Tips == |
||
=== Automatic Prerequisites === |
|||
A standard solution (inspired from Makefile manual): |
|||
<source lang="make"> |
|||
#----- BEGIN Automatic-Prerequisites ----- |
|||
# - see http://www.gnu.org/software/make/manual/make.html#Automatic-Prerequisites |
|||
# - Note that .d files are automatically regenerated because of the include command below. |
|||
# - Only 1 .d file generated, indep. of defines. So if include files depend on defines, the .d files will *NOT* be updated. |
|||
-include $(SOURCES:.cpp=.d) |
|||
%.d: %.cpp |
|||
@set -e; rm -f $@; \ |
|||
$(CC) $(CFLAGS) $(INCPATHS) -MM $< | sed -r 's!(.*)\.o[ :]*!\1.o $@ : !g' > $@ |
|||
#----- END Automatic-Prerequisites ----- |
|||
</source> |
|||
A more advanced solution, where object files are stored in directory $(VARDIR), and have a suffic $(VARIANT): |
|||
<source lang="make"> |
|||
#----- BEGIN Automatic-Prerequisites ----- |
|||
# - see http://www.gnu.org/software/make/manual/make.html#Automatic-Prerequisites |
|||
# - Note that .d files are automatically regenerated because of the include command below. |
|||
# - Only 1 .d file generated, indep. of defines. So if include files depend on defines, the .d files will *NOT* be updated. |
|||
# - [CHANGES] .o and .d files are stored in directory $(VARDIR)/, and have suffix $(VARIANT) |
|||
-include $(addprefix $(VARDIR)/, $(notdir $(SOURCES:.cpp=.d) ) ) |
|||
$(VARDIR)/%.d: $(SRCDIR)/%.cpp |
|||
@mkdir -p "$(@D)"; \ |
|||
set -e; rm -f $@; \ |
|||
$(CPP) $(CFLAGS) $(INCPATHS) -MM -MT $(VARDIR)/$*.o $< | sed 's!\(.*\)\.o[ :]*!\1$$(VARIANT).o $@ : !g' > $@ |
|||
#----- END Automatic-Prerequisites ----- |
|||
</source> |
|||
'''{{red|Limitations}}''': |
|||
* Only one <tt>.d</tt> file generated, indep. of <tt>$(DEFINES)</tt>, so if <tt>$(DEFINES)</tt> changed, and include files depends on these defines, the <tt>.d</tt> files will not be updated. |
|||
:A solution would be to name the <tt>.d</tt> files according to relevant defines, as we do for the <tt>.o</tt> files |
|||
== Frequent Mistakes == |
|||
;Use TABS to prefix commands in rules, *NOT* SPACES |
;Use TABS to prefix commands in rules, *NOT* SPACES |
Revision as of 09:12, 3 October 2011
make is an utility that determines automatically which pieces of a program need to be recompiled, and issues the commands to rebuild them. make uses a file called Makefile, which describes the relationships among files in the program.
References
Tips
Automatic Prerequisites
A standard solution (inspired from Makefile manual):
#----- BEGIN Automatic-Prerequisites -----
# - see http://www.gnu.org/software/make/manual/make.html#Automatic-Prerequisites
# - Note that .d files are automatically regenerated because of the include command below.
# - Only 1 .d file generated, indep. of defines. So if include files depend on defines, the .d files will *NOT* be updated.
-include $(SOURCES:.cpp=.d)
%.d: %.cpp
@set -e; rm -f $@; \
$(CC) $(CFLAGS) $(INCPATHS) -MM $< | sed -r 's!(.*)\.o[ :]*!\1.o $@ : !g' > $@
#----- END Automatic-Prerequisites -----
A more advanced solution, where object files are stored in directory $(VARDIR), and have a suffic $(VARIANT):
#----- BEGIN Automatic-Prerequisites -----
# - see http://www.gnu.org/software/make/manual/make.html#Automatic-Prerequisites
# - Note that .d files are automatically regenerated because of the include command below.
# - Only 1 .d file generated, indep. of defines. So if include files depend on defines, the .d files will *NOT* be updated.
# - [CHANGES] .o and .d files are stored in directory $(VARDIR)/, and have suffix $(VARIANT)
-include $(addprefix $(VARDIR)/, $(notdir $(SOURCES:.cpp=.d) ) )
$(VARDIR)/%.d: $(SRCDIR)/%.cpp
@mkdir -p "$(@D)"; \
set -e; rm -f $@; \
$(CPP) $(CFLAGS) $(INCPATHS) -MM -MT $(VARDIR)/$*.o $< | sed 's!\(.*\)\.o[ :]*!\1$$(VARIANT).o $@ : !g' > $@
#----- END Automatic-Prerequisites -----
Limitations:
- Only one .d file generated, indep. of $(DEFINES), so if $(DEFINES) changed, and include files depends on these defines, the .d files will not be updated.
- A solution would be to name the .d files according to relevant defines, as we do for the .o files
Frequent Mistakes
- Use TABS to prefix commands in rules, *NOT* SPACES
- Each rule in a makefile gives the set of commands that must be executed to build a given target from a given set of dependencies. These commands MUST be indented with a TAB character, not with SPACES. So make sure that the editor does not automatically change these tabs into spaces.