1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- // Copyright 2015 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef BUILD_BUILDFLAG_H_
- #define BUILD_BUILDFLAG_H_
- // These macros un-mangle the names of the build flags in a way that looks
- // natural, and gives errors if the flag is not defined. Normally in the
- // preprocessor it's easy to make mistakes that interpret "you haven't done
- // the setup to know what the flag is" as "flag is off". Normally you would
- // include the generated header rather than include this file directly.
- //
- // This is for use with generated headers. See build/buildflag_header.gni.
- // This dance of two macros does a concatenation of two preprocessor args using
- // ## doubly indirectly because using ## directly prevents macros in that
- // parameter from being expanded.
- #define BUILDFLAG_CAT_INDIRECT(a, b) a ## b
- #define BUILDFLAG_CAT(a, b) BUILDFLAG_CAT_INDIRECT(a, b)
- // Accessor for build flags.
- //
- // To test for a value, if the build file specifies:
- //
- // ENABLE_FOO=true
- //
- // Then you would check at build-time in source code with:
- //
- // #include "foo_flags.h" // The header the build file specified.
- //
- // #if BUILDFLAG(ENABLE_FOO)
- // ...
- // #endif
- //
- // There will no #define called ENABLE_FOO so if you accidentally test for
- // whether that is defined, it will always be negative. You can also use
- // the value in expressions:
- //
- // const char kSpamServerName[] = BUILDFLAG(SPAM_SERVER_NAME);
- //
- // Because the flag is accessed as a preprocessor macro with (), an error
- // will be thrown if the proper header defining the internal flag value has
- // not been included.
- #define BUILDFLAG(flag) (BUILDFLAG_CAT(BUILDFLAG_INTERNAL_, flag)())
- #endif // BUILD_BUILDFLAG_H_
|