Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple makefile with release and debug builds - Best practices

Tags:

I am new to makefiles. I learned makefile creation and other related concepts from "Managing projects with GNU make" book. The makefile is ready now and I need to make sure the one which I created is OK. Here is the makefile

#Main makefile which does the build  #makedepend flags DFLAGS =   #Compiler flags #if mode variable is empty, setting debug build mode ifeq ($(mode),release)    CFLAGS = -Wall else    mode = debug    CFLAGS = -g -Wall endif  CC = g++ PROG = fooexe  #each module will append the source files to here SRC := main.cpp  #including the description include bar/module.mk include foo/module.mk  OBJ := $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC)))  .PHONY:all all: information fooexe  information: ifneq ($(mode),release) ifneq ($(mode),debug)     @echo "Invalid build mode."      @echo "Please use 'make mode=release' or 'make mode=debug'"     @exit 1 endif endif     @echo "Building on "$(mode)" mode"     @echo ".........................."  #linking the program fooexe: $(OBJ)     $(CC) -o $(PROG) $(OBJ)  %.o:%.cpp     $(CC) $(CFLAGS) -c $< -o $@  depend:     makedepend -- $(DFLAGS) -- $(SRC)  .PHONY:clean clean:     find . -name "*.o" | xargs rm -vf     rm -vf fooexe 

Questions

  1. The above given makefile works well with release and debug builds. But is it in the correct format? Or do you see any flaws in that?
  2. Above makefile does debug build by default when invoked using make. For release builds, make mode=release is required. Is this the correct approach?
  3. Is the debug and release compiler flags supplied to g++ is correct? For debug, I use -g -Wall and for release, just -Wall. Is this right?

Any help would be great.

like image 585
Navaneeth K N Avatar asked Apr 27 '09 04:04

Navaneeth K N


People also ask

Is release build faster than debug?

Lots of your code could be completely removed or rewritten in Release mode. The resulting executable will most likely not match up with your written code. Because of this release mode will run faster than debug mode due to the optimizations.

How do I debug with Makefile?

To use it, just set the list of variables to print on the command line, and include the debug target: $ make V="USERNAME SHELL" debug makefile:2: USERNAME = Owner makefile:2: SHELL = /bin/sh.exe make: debug is up to date. Now you can print variables by simply listing them on the command line.

Can you debug a release build?

You can now debug your release build application. To find a problem, step through the code (or use Just-In-Time debugging) until you find where the failure occurs, and then determine the incorrect parameters or code.

What are debug builds?

When doing a DEBUG build the project is set up to not optimize (or only very lightly optimize) the generated code, and to tell the compiler to add debug information (which includes information about functions, variables, and other information needed for debugging).


1 Answers

  1. It is one reasonable format. It is tied specifically to GNU Make, but that's a relatively minor problem if you have chosen to use GNU Make on every platform.
    • If there is a flaw, it is that you could end up linking object files built in debug mode to create the final build.
    • Some might argue that a 'mode=release' option is non-standard; they'd be right, but there isn't a standard alternative that I'm aware of. You just need to be aware that your convention might not suit everyone (but it doesn't have to - it just has to suit you and your users).
  2. Building a debug build by default is probably sensible - and more sensible than building the release build by default.
  3. Dropping the -g flag for the release build is not automatically bad, but if your code ever produces a core dump, it is easier to make head or tail of the core dump if the program file includes debugging information. The primary cost of debugging information is extra sections in the program file that do not need to be loaded into system memory - the runtime cost is small.
    • You should consider whether to include optimization flags in there. With the GCC tool set, you can use both -g and -O. It is harder to debug optimized code, but it gives you (often significant) performance benefits.
like image 138
Jonathan Leffler Avatar answered Oct 16 '22 00:10

Jonathan Leffler