Where does the -DNDEBUG normally come from?
Asked Answered
V

3

30

Our build system has somehow changed such that optimized builds are no longer getting the -DNDEBUG added to the compile line. I searched our makefiles and didn't find this.

Where does -DNDEBUG originate for most people and how might that have changed? Before we did have -DNDEBUG, and I don't think this was removed from any of our makefiles.

Venavenable answered 10/12, 2009 at 4:31 Comment(2)
may want to check your configure or configure.ac if you are using GNU build tools, i.e. autoconf and friendsPiapiacenza
I'm not using config, just GNU makefiles.Venavenable
G
21

Since the compiler can't decide on its own when to add the NDEBUG define and when not to, the flag is always set by either the makefile or project file (depending on your build system).

Goulash answered 10/12, 2009 at 4:39 Comment(0)
C
10

It is really difficult to answer this since you didn't specify the build system you are using. If you're using Autoconf, then either the user is expected to put -DNDEBUG in CPPFLAGS manually (or perhaps you were setting it from a CONFIG_SITE file that has changed), or the configure.ac file might set up a custom variable for setting NDEBUG, or configure.ac may invoke AC_HEADER_ASSERT, in which case adding --disable-assert to the invocation of configure will define NDEBUG in config.h. There are lots of ways it can happen.

Conformist answered 10/12, 2009 at 7:24 Comment(4)
If I need to choose between doing AC_DEFINE(NDEBUG,[],[]) and CPPFLAGS="$CPPFLAGS -DNDEBUG" in configure.ac, what should I do? Is it a disadvantage to have #define NDEBUG in config.h? If I do both I get lots of "NDEBUG duplicate definition" warnings that I would like to avoid.Cadre
If you are maintaining the autoconf metadata files, you should use AC_HEADER_ASSERT and let the user specify --disable-assert at configure time. The user is responsible for ensuring that -DNDEBUG is passed to the compiler if they so desire. It is not appropriate to define NDEBUG by default; that's not the package maintainer's prerogative.Conformist
What if -DNDEBUG is not enabled by default but by an option --enable-release? Would this be appropriate? And how would I activate -DNDEBUG in that case?Cadre
Regarding --enable-release, please read #4554235Conformist
R
5

In my experience, -DNDEBUG has been passed manually, i.e. the makefiles have been written in such a way that the flag is passed when building in release mode.

Retinoscope answered 10/12, 2009 at 4:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.