diff --git a/ReactCommon/yoga/Yoga-umbrella.h b/ReactCommon/yoga/Yoga-umbrella.h new file mode 100644 index 00000000000000..2e62c472a22b3e --- /dev/null +++ b/ReactCommon/yoga/Yoga-umbrella.h @@ -0,0 +1,21 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "yoga/YGEnums.h" +#import "yoga/YGMacros.h" +#import "yoga/YGNode.h" +#import "yoga/YGStyle.h" +#import "yoga/YGValue.h" +#import "yoga/Yoga.h" + +FOUNDATION_EXPORT double yogaVersionNumber; +FOUNDATION_EXPORT const unsigned char yogaVersionString[]; diff --git a/ReactCommon/yoga/Yoga.modulemap b/ReactCommon/yoga/Yoga.modulemap new file mode 100644 index 00000000000000..54ea79247e1e52 --- /dev/null +++ b/ReactCommon/yoga/Yoga.modulemap @@ -0,0 +1,6 @@ +framework module yoga { + umbrella header "Yoga-umbrella.h" + + export * + module * { export * } +} diff --git a/ReactCommon/yoga/Yoga.podspec b/ReactCommon/yoga/Yoga.podspec index a282034a356110..b47c5a6b73aa0c 100644 --- a/ReactCommon/yoga/Yoga.podspec +++ b/ReactCommon/yoga/Yoga.podspec @@ -47,11 +47,25 @@ Pod::Spec.new do |spec| # Set this environment variable when *not* using the `:path` option to install the pod. # E.g. when publishing this spec to a spec repo. - source_files = 'yoga/**/*.{cpp,h}' - source_files = File.join('ReactCommon/yoga', source_files) if ENV['INSTALL_YOGA_WITHOUT_PATH_OPTION'] + source_files = 'yoga/**/*.{cpp,h}', 'Yoga-umbrella.h' + source_files = source_files.map { |file| File.join('ReactCommon/yoga', file) } if ENV['INSTALL_YOGA_WITHOUT_PATH_OPTION'] spec.source_files = source_files - header_files = 'yoga/{Yoga,YGEnums,YGMacros,YGNode,YGStyle,YGValue}.h' - header_files = File.join('ReactCommon/yoga', header_files) if ENV['INSTALL_YOGA_WITHOUT_PATH_OPTION'] - spec.public_header_files = header_files + spec.module_map = 'Yoga.modulemap' + + # CocoaPods custom `module_map` + `header_dir` doesn't put the umbrella header in right place. + # Ideally, modulemap should be placed with the umbrella header, that would work for both use_frameworks! mode and non use_frameworks! mode. + # This script copy the umbrella header back to right place. + spec.script_phase = { + :name => 'Copy umbrella header', + :input_files => ["$PODS_ROOT/Headers/Public/Yoga/yoga/Yoga-umbrella.h"], + :output_files => ["$PODS_ROOT/Headers/Private/Yoga/Yoga-umbrella.h"], + :execution_position => :before_compile, + :shell_path => '/bin/bash', + + # In use_frameworks! mode, the umbrella header will by copied to right place. + # This copy command will fail because "$PODS_ROOT/Headers/Public/Yoga/yoga/Yoga-umbrella.h" doesn't exist. + # The command is just a no-op in use_frameworks! mode. + :script => 'cp -f "$PODS_ROOT/Headers/Public/Yoga/yoga/Yoga-umbrella.h" "$PODS_ROOT/Headers/Private/Yoga/Yoga-umbrella.h" || true', + } end