77 lines
3.6 KiB
C
77 lines
3.6 KiB
C
|
// Copyright 2018 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 BASE_COMPONENT_EXPORT_H_
|
||
|
#define BASE_COMPONENT_EXPORT_H_
|
||
|
|
||
|
// Used to annotate symbols which are exported by the component named
|
||
|
// |component|. Note that this only does the right thing if the corresponding
|
||
|
// component target's sources are compiled with |IS_$component_IMPL| defined
|
||
|
// as 1. For example:
|
||
|
//
|
||
|
// class COMPONENT_EXPORT(FOO) Bar {};
|
||
|
//
|
||
|
// If IS_FOO_IMPL=1 at compile time, then Bar will be annotated using the
|
||
|
// COMPONENT_EXPORT_ANNOTATION macro defined below. Otherwise it will be
|
||
|
// annotated using the COMPONENT_IMPORT_ANNOTATION macro.
|
||
|
#define COMPONENT_EXPORT(component) \
|
||
|
COMPONENT_MACRO_CONDITIONAL_(IS_##component##_IMPL, \
|
||
|
COMPONENT_EXPORT_ANNOTATION, \
|
||
|
COMPONENT_IMPORT_ANNOTATION)
|
||
|
|
||
|
// Indicates whether the current compilation unit is being compiled as part of
|
||
|
// the implementation of the component named |component|. Expands to |1| if
|
||
|
// |IS_$component_IMPL| is defined as |1|; expands to |0| otherwise.
|
||
|
//
|
||
|
// Note in particular that if |IS_$component_IMPL| is not defined at all, it is
|
||
|
// still fine to test INSIDE_COMPONENT_IMPL(component), which expands to |0| as
|
||
|
// expected.
|
||
|
#define INSIDE_COMPONENT_IMPL(component) \
|
||
|
COMPONENT_MACRO_CONDITIONAL_(IS_##component##_IMPL, 1, 0)
|
||
|
|
||
|
// Compiler-specific macros to annotate for export or import of a symbol. No-op
|
||
|
// in non-component builds. These should not see much if any direct use.
|
||
|
// Instead use the COMPONENT_EXPORT macro defined above.
|
||
|
#if defined(COMPONENT_BUILD)
|
||
|
#if defined(WIN32)
|
||
|
#define COMPONENT_EXPORT_ANNOTATION __declspec(dllexport)
|
||
|
#define COMPONENT_IMPORT_ANNOTATION __declspec(dllimport)
|
||
|
#else // defined(WIN32)
|
||
|
#define COMPONENT_EXPORT_ANNOTATION __attribute__((visibility("default")))
|
||
|
#define COMPONENT_IMPORT_ANNOTATION
|
||
|
#endif // defined(WIN32)
|
||
|
#else // defined(COMPONENT_BUILD)
|
||
|
#define COMPONENT_EXPORT_ANNOTATION
|
||
|
#define COMPONENT_IMPORT_ANNOTATION
|
||
|
#endif // defined(COMPONENT_BUILD)
|
||
|
|
||
|
// Below this point are several internal utility macros used for the
|
||
|
// implementation of the above macros. Not intended for external use.
|
||
|
|
||
|
// Helper for conditional expansion to one of two token strings. If |condition|
|
||
|
// expands to |1| then this macro expands to |consequent|; otherwise it expands
|
||
|
// to |alternate|.
|
||
|
#define COMPONENT_MACRO_CONDITIONAL_(condition, consequent, alternate) \
|
||
|
COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_( \
|
||
|
COMPONENT_MACRO_CONDITIONAL_COMMA_(condition), consequent, alternate)
|
||
|
|
||
|
// Expands to a comma (,) iff its first argument expands to |1|. Used in
|
||
|
// conjunction with |COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_()|, as the presence
|
||
|
// or absense of an extra comma can be used to conditionally shift subsequent
|
||
|
// argument positions and thus influence which argument is selected.
|
||
|
#define COMPONENT_MACRO_CONDITIONAL_COMMA_(...) \
|
||
|
COMPONENT_MACRO_CONDITIONAL_COMMA_IMPL_(__VA_ARGS__,)
|
||
|
#define COMPONENT_MACRO_CONDITIONAL_COMMA_IMPL_(x, ...) \
|
||
|
COMPONENT_MACRO_CONDITIONAL_COMMA_##x##_
|
||
|
#define COMPONENT_MACRO_CONDITIONAL_COMMA_1_ ,
|
||
|
|
||
|
// Helper which simply selects its third argument. Used in conjunction with
|
||
|
// |COMPONENT_MACRO_CONDITIONAL_COMMA_()| above to implement conditional macro
|
||
|
// expansion.
|
||
|
#define COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_(...) \
|
||
|
COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(__VA_ARGS__)
|
||
|
#define COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(a, b, c, ...) c
|
||
|
|
||
|
#endif // BASE_COMPONENT_EXPORT_H_
|