Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CFLAGS, CCFLAGS, CXXFLAGS - what exactly do these variables control?

I am using GNU make to compile my C++ code, and i would like to understand how to make my compilations customizable.

I read in different places that CFLAGS, CCFLAGS and CXXFLAGS are used for this purpose. So how should i use them? If i have additional command-line arguments to the compiler, should i append them to CFLAGS or prepend them? Is there a common practice?

Why the three different variables? I suppose the C compiler should get CFLAGS and CCFLAGS, while the C++ compiler should get CFLAGS and CXXFLAGS - did i get it right?

Is the human user supposed to set these variables at all? Do any automatic tools (automake, autoconf, etc) set them? The linux system that i am supposed to use doesn't define any of these variables - is this typical?

Currently my Makefile looks like this, and i feel it's a bit dirty:

ifdef code_coverage     GCOV_FLAG := -fprofile-arcs -ftest-coverage else     GCOV_FLAG := endif  WFLAGS := -Wall  INC_FLAGS := -Istuff -Imore_stuff -Ietc  CCFLAGSINT := -O3 $(WFLAGS) $(INC_FLAGS) $(CCFLAGS)  ... (somewhere in the makefile, the command-line for compilation looks like this)     $(CC) $(CCFLAGSINT) -c $< -o $@  ... (somewhere in the makefile, the command-line for linking looks like this)     $(CC) $(GCOV_FLAG) $(CCFLAGSINT) $(OBJLIST) $(LDFLAGS) -o $@ 

I am pretty sure there are no bugs here; the Makefile works very well. But is there anything that goes against conventions (like CCFLAGSINT - should i just overwrite CCFLAGS instead? Or CXXFLAGS? FUD!)

Sorry for so many questions; you will obviously not answer them all but i hope the answers will help me understand the general idea behind these settings.

like image 682
anatolyg Avatar asked Apr 04 '11 17:04

anatolyg


People also ask

What is the use of CFLAGS in Makefile?

CFLAGS and CXXFLAGS are either the name of environment variables or of Makefile variables that can be set to specify additional switches to be passed to a compiler in the process of building computer software.

What is CFLAGS and Ldflags?

The make-specific variables (the ones in capital letters) follow a name convention such that: CC refers to the compiler (gcc in this case); CFLAGS contains compiler directives/options; and LDFLAGS is a list of link (or "load") directives (here, instructions to link with the C math library).

What does compiler flag do?

Compile-time flags are boolean values provided through the compiler via a macro method. They allow to conditionally include or exclude code based on compile time conditions. There are several default flags provided by the compiler with information about compiler options and the target platform.


1 Answers

As you noticed, these are Makefile {macros or variables}, not compiler options. They implement a set of conventions. (Macros is an old name for them, still used by some. GNU make doc calls them variables.)

The only reason that the names matter is the default make rules, visible via make -p, which use some of them.

If you write all your own rules, you get to pick all your own macro names.

In a vanilla gnu make, there's no such thing as CCFLAGS. There are CFLAGS, CPPFLAGS, and CXXFLAGS. CFLAGS for the C compiler, CXXFLAGS for C++, and CPPFLAGS for both.

Why is CPPFLAGS in both? Conventionally, it's the home of preprocessor flags (-D, -U) and both c and c++ use them. Now, the assumption that everyone wants the same define environment for c and c++ is perhaps questionable, but traditional.


P.S. As noted by James Moore, some projects use CPPFLAGS for flags to the C++ compiler, not flags to the C preprocessor. The Android NDK, for one huge example.

like image 175
bmargulies Avatar answered Sep 28 '22 02:09

bmargulies