CS11 Intro C++: Lecture 4

Go to Parent Page

Build Automation

make is a standard tool for automating builds.

  • Makefile
  • build targets, specfies its dependencies
  • Only Tab indentation works
  • make will only build what is needed by file’s modified date

    • Use touch units.cpp when it need to rebuild
convert : units.o convert.o
	g++ -std=c++17 -Wall units.o convert.o \
		-o convert

units.o : units.cpp units.h
	g++ -std=c++17 -Wall -c units.cpp

... (more rules)

clean :
	rm -f convert hw3testunits *.o *~

Usually, the first target in the makefile is named all, and it builds everything of interest.

all : convert hw3testunits

Specify one or more build targets to make.

> make clean convert

Build Targets

  • Real Build Target: a real file such as units.o
  • Phony Build Target: e.g. clean

    • Use .PHONY to specify which targets are phony one
.PHONY: clean all

Chains of Build Rules

make figures out the graph of dependencies. If the dependencies don’t exist, make will use their build ruels to make them.

convert : units.o convert.o
	g++ -std=c++14 -Wall units.o convert.o \
		-o convert

units.o : units.cpp units.h
	g++ -std=c++14 -Wall -c units.cpp

Makefile Variables

# Usually ALL_CAPS
CONVERT_OBJS = units.o convert.o

convert : $(CONVERT_OBJS)
	g++ $(CONVERT_OBJS) -o convert

Implicit Build Rules

There are built-in implicit build rules for the convenience.

e.g. if foo.o is a dependency but it doesn’t have real build target, make look up the file and build it.

CONVERT_OBJS = units.o convert.o
all : convert hw3testunits

convert : $(CONVERT_OBJS)
	g++ -std=c++14 -Wall $(CONVERT_OBJS) \
		-o convert

clean :
	rm -f convert hw3testunits *.o *~

.PHONY : all clean

C++ compilation implicit rule:

%.o : %.cpp
	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@

# CXX: the compiler to use (g++ as a default)
# CPPFLAGS: the preprocessor flags
# CXXFLAGS: the compiler flags

So that,

CXXFLAGS = -Wall -std=c++14
CONVERT_OBJS = units.o convert.o
all : convert hw3testunits

convert : $(CONVERT_OBJS)
	$(CXX) $(CXXFLAGS) $(CONVERT_OBJS) \
		-o convert $(LDFLAGS)

clean :
	rm -f convert hw3testunits *.o *~

.PHONY : all clean

Using Automatic Variables

  • %: matches the filename
  • automatic variables $

    • $<: the first prerequisite in the deps list
    • $@: the filename of the target
    • $^: a list of all prerequisites in the deps list
CXXFLAGS = -Wall -std=c++14
CONVERT_OBJS = units.o convert.o
all : convert hw3testunits

convert : $(CONVERT_OBJS)
	$(CXX) $(CXXFLAGS) $^ -o $@ $(LDFLAGS)

clean :
	rm -f convert hw3testunits *.o *~

.PHONY : all clean

Doxygen: Automatic Document Generation

Write the comment and it converts to the document using Doxygen.

# Doxyfile is a default filename
> doxygen -g [filename]
INPUT = .
OUTPUT_DIRECTORY = ./docs
PROJECT_NAME = HelloWorld
JAVADOC_AUTOBRIEF = YES
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
/**
 * this is a comment
 *
 * @param name Description
 * @return something fun
 */

/** @file ... */

/** My widget */
MyWidget mw;
MyWidget mw; /**< My widget */

Coming up next

  • Lecture 5: Operator overloading, Constructors, Output Stream
This page is maintianed by edykim.