1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_COMPONENT_EXPORT_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_COMPONENT_EXPORT_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker // Used to annotate symbols which are exported by the component named 9*6777b538SAndroid Build Coastguard Worker // |component|. Note that this only does the right thing if the corresponding 10*6777b538SAndroid Build Coastguard Worker // component target's sources are compiled with |IS_$component_IMPL| defined 11*6777b538SAndroid Build Coastguard Worker // as 1. For example: 12*6777b538SAndroid Build Coastguard Worker // 13*6777b538SAndroid Build Coastguard Worker // class COMPONENT_EXPORT(FOO) Bar {}; 14*6777b538SAndroid Build Coastguard Worker // 15*6777b538SAndroid Build Coastguard Worker // If IS_FOO_IMPL=1 at compile time, then Bar will be annotated using the 16*6777b538SAndroid Build Coastguard Worker // COMPONENT_EXPORT_ANNOTATION macro defined below. Otherwise it will be 17*6777b538SAndroid Build Coastguard Worker // annotated using the COMPONENT_IMPORT_ANNOTATION macro. 18*6777b538SAndroid Build Coastguard Worker #define COMPONENT_EXPORT(component) \ 19*6777b538SAndroid Build Coastguard Worker COMPONENT_MACRO_CONDITIONAL_(IS_##component##_IMPL, \ 20*6777b538SAndroid Build Coastguard Worker COMPONENT_EXPORT_ANNOTATION, \ 21*6777b538SAndroid Build Coastguard Worker COMPONENT_IMPORT_ANNOTATION) 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker // Indicates whether the current compilation unit is being compiled as part of 24*6777b538SAndroid Build Coastguard Worker // the implementation of the component named |component|. Expands to |1| if 25*6777b538SAndroid Build Coastguard Worker // |IS_$component_IMPL| is defined as |1|; expands to |0| otherwise. 26*6777b538SAndroid Build Coastguard Worker // 27*6777b538SAndroid Build Coastguard Worker // Note in particular that if |IS_$component_IMPL| is not defined at all, it is 28*6777b538SAndroid Build Coastguard Worker // still fine to test INSIDE_COMPONENT_IMPL(component), which expands to |0| as 29*6777b538SAndroid Build Coastguard Worker // expected. 30*6777b538SAndroid Build Coastguard Worker #define INSIDE_COMPONENT_IMPL(component) \ 31*6777b538SAndroid Build Coastguard Worker COMPONENT_MACRO_CONDITIONAL_(IS_##component##_IMPL, 1, 0) 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker // Compiler-specific macros to annotate for export or import of a symbol. No-op 34*6777b538SAndroid Build Coastguard Worker // in non-component builds. These should not see much if any direct use. 35*6777b538SAndroid Build Coastguard Worker // Instead use the COMPONENT_EXPORT macro defined above. 36*6777b538SAndroid Build Coastguard Worker #if defined(COMPONENT_BUILD) 37*6777b538SAndroid Build Coastguard Worker #if defined(WIN32) 38*6777b538SAndroid Build Coastguard Worker #define COMPONENT_EXPORT_ANNOTATION __declspec(dllexport) 39*6777b538SAndroid Build Coastguard Worker #define COMPONENT_IMPORT_ANNOTATION __declspec(dllimport) 40*6777b538SAndroid Build Coastguard Worker #else // defined(WIN32) 41*6777b538SAndroid Build Coastguard Worker #define COMPONENT_EXPORT_ANNOTATION __attribute__((visibility("default"))) 42*6777b538SAndroid Build Coastguard Worker #define COMPONENT_IMPORT_ANNOTATION 43*6777b538SAndroid Build Coastguard Worker #endif // defined(WIN32) 44*6777b538SAndroid Build Coastguard Worker #else // defined(COMPONENT_BUILD) 45*6777b538SAndroid Build Coastguard Worker #define COMPONENT_EXPORT_ANNOTATION 46*6777b538SAndroid Build Coastguard Worker #define COMPONENT_IMPORT_ANNOTATION 47*6777b538SAndroid Build Coastguard Worker #endif // defined(COMPONENT_BUILD) 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker // Below this point are several internal utility macros used for the 50*6777b538SAndroid Build Coastguard Worker // implementation of the above macros. Not intended for external use. 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker // Helper for conditional expansion to one of two token strings. If |condition| 53*6777b538SAndroid Build Coastguard Worker // expands to |1| then this macro expands to |consequent|; otherwise it expands 54*6777b538SAndroid Build Coastguard Worker // to |alternate|. 55*6777b538SAndroid Build Coastguard Worker #define COMPONENT_MACRO_CONDITIONAL_(condition, consequent, alternate) \ 56*6777b538SAndroid Build Coastguard Worker COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_( \ 57*6777b538SAndroid Build Coastguard Worker COMPONENT_MACRO_CONDITIONAL_COMMA_(condition), consequent, alternate) 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker // Expands to a comma (,) iff its first argument expands to |1|. Used in 60*6777b538SAndroid Build Coastguard Worker // conjunction with |COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_()|, as the presence 61*6777b538SAndroid Build Coastguard Worker // or absense of an extra comma can be used to conditionally shift subsequent 62*6777b538SAndroid Build Coastguard Worker // argument positions and thus influence which argument is selected. 63*6777b538SAndroid Build Coastguard Worker #define COMPONENT_MACRO_CONDITIONAL_COMMA_(...) \ 64*6777b538SAndroid Build Coastguard Worker COMPONENT_MACRO_CONDITIONAL_COMMA_IMPL_(__VA_ARGS__,) 65*6777b538SAndroid Build Coastguard Worker #define COMPONENT_MACRO_CONDITIONAL_COMMA_IMPL_(x, ...) \ 66*6777b538SAndroid Build Coastguard Worker COMPONENT_MACRO_CONDITIONAL_COMMA_##x##_ 67*6777b538SAndroid Build Coastguard Worker #define COMPONENT_MACRO_CONDITIONAL_COMMA_1_ , 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker // Helper which simply selects its third argument. Used in conjunction with 70*6777b538SAndroid Build Coastguard Worker // |COMPONENT_MACRO_CONDITIONAL_COMMA_()| above to implement conditional macro 71*6777b538SAndroid Build Coastguard Worker // expansion. 72*6777b538SAndroid Build Coastguard Worker #define COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_(...) \ 73*6777b538SAndroid Build Coastguard Worker COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(__VA_ARGS__) 74*6777b538SAndroid Build Coastguard Worker #define COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(a, b, c, ...) c 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker #endif // BASE_COMPONENT_EXPORT_H_ 77