mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
fa4045e4dd
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/31543 Changelog: [iOS][Added] - Description When compiling iOS apps with flag `-Wnullability-completeness` (like Lightspeed app and soon Instagram), Objective-C headers are required to either have full *explicit* nullability annotations on all members of its public API, or none at all; partially annotated headers will fail to build that module. RN native modules are currently generated with *partial* annotations. This works today because most apps are not compiled with `-Wnullability-completeness` turned on. But when we flip the switch for Instagram, the app doesn't build due to importing these RN partially annotated modules. JavsScript Flow types are implied nonnull, and the current RN codegen translates Flow's [maybe/optional](https://flow.org/en/docs/types/maybe/) type to Obj-C `_Nullable` annotation, and everything else without an explicit Obj-C annotation. However this creates a mismatch with the Obj-C type system, where the implied default is *unannotated*, which is handled differently from nonnull when built with the nullability compiler flags. There is a simple Obj-C macro that automatically adds *explicit nonnull* annotations to all members in a header: `NS_ASSUME_NONNULL_BEGIN` / `NS_ASSUME_NONNULL_END`. If we add this to *all* RN-generated headers, however, we run into issues: 1) We may erroneously assume any previously-unannotated header was meant to be nonnull and cause future bugs 2) Another compiler flag (`-Wnullable-to-nonnull-conversion`) statically analyzes Obj-C implementation code to prevent us from ever passing null to one of these headers. Much existing Obj-C code will break here, and it's ambiguous if these are true or false positives because of the first point. Instead, in this diff we add a new BUCK flag `ios_assume_nonnull` to let module authors opt into automatic nonnull for unannotated members so that Obj-C headers are generated correctly in alignment with Flow's type system. We can migrate all libraries individually as needed and eventually make this the RN native codegen default. Reviewed By: RSNara Differential Revision: D28396446 fbshipit-source-id: ad3a3a97ab19183df4ef504b1c3140596c8f69ca
583 lines
22 KiB
Python
583 lines
22 KiB
Python
# Copyright (c) Facebook, Inc. and its affiliates.
|
|
#
|
|
# This source code is licensed under the MIT license found in the
|
|
# LICENSE file in the root directory of this source tree.
|
|
|
|
load("//tools/build_defs:buckconfig.bzl", "read_bool")
|
|
load("//tools/build_defs:fb_native_wrapper.bzl", "fb_native")
|
|
load(
|
|
"//tools/build_defs/oss:rn_defs.bzl",
|
|
"ANDROID",
|
|
"APPLE",
|
|
"CXX",
|
|
"IOS",
|
|
"IS_OSS_BUILD",
|
|
"MACOSX",
|
|
"YOGA_CXX_TARGET",
|
|
"fb_xplat_cxx_test",
|
|
"get_apple_compiler_flags",
|
|
"get_apple_inspector_flags",
|
|
"get_preprocessor_flags_for_build_mode",
|
|
"react_native_dep",
|
|
"react_native_root_target",
|
|
"react_native_target",
|
|
"react_native_xplat_shared_library_target",
|
|
"react_native_xplat_target",
|
|
"react_native_xplat_target_apple",
|
|
"rn_android_library",
|
|
"rn_apple_library",
|
|
"rn_xplat_cxx_library",
|
|
)
|
|
|
|
# Call this in the react-native-codegen/BUCK file
|
|
def rn_codegen_cli():
|
|
if not IS_OSS_BUILD:
|
|
# FB Internal Setup
|
|
fb_native.sh_binary(
|
|
name = "write_to_json",
|
|
main = "src/cli/combine/combine_js_to_schema.sh",
|
|
resources = [
|
|
"src/cli/combine/combine-js-to-schema.js",
|
|
"src/cli/combine/combine_js_to_schema.sh",
|
|
":yarn-workspace",
|
|
"//xplat/js:setup_env",
|
|
],
|
|
visibility = ["PUBLIC"],
|
|
)
|
|
|
|
fb_native.sh_binary(
|
|
name = "generate_all_from_schema",
|
|
main = "src/cli/generators/generate-all.sh",
|
|
resources = native.glob(
|
|
[
|
|
"buck_tests/**/*.js",
|
|
"src/**/*.js",
|
|
],
|
|
) + [
|
|
"package.json",
|
|
"//xplat/js:setup_env",
|
|
],
|
|
visibility = ["PUBLIC"],
|
|
)
|
|
else:
|
|
# OSS setup, assumes yarn and node (v12.0.0+) are installed.
|
|
fb_native.genrule(
|
|
name = "setup_cli",
|
|
srcs = native.glob([
|
|
"scripts/**/*",
|
|
"src/**/*",
|
|
], exclude = [
|
|
"__tests__/**/*",
|
|
]) + [
|
|
".babelrc",
|
|
".prettierrc",
|
|
"package.json",
|
|
],
|
|
out = "build",
|
|
bash = r"""
|
|
set -euo pipefail
|
|
mkdir -p "$OUT"
|
|
rsync -rLptgoD "$SRCDIR/" "$OUT"
|
|
cd "$OUT"
|
|
yarn install 2> >(grep -v '^warning' 1>&2)
|
|
yarn run build
|
|
""",
|
|
)
|
|
|
|
fb_native.sh_binary(
|
|
name = "write_to_json",
|
|
main = "scripts/buck-oss/combine_js_to_schema.sh",
|
|
resources = [
|
|
":setup_cli",
|
|
],
|
|
visibility = ["PUBLIC"],
|
|
)
|
|
|
|
fb_native.sh_binary(
|
|
name = "generate_all_from_schema",
|
|
main = "scripts/buck-oss/generate-all.sh",
|
|
resources = [
|
|
":setup_cli",
|
|
],
|
|
visibility = ["PUBLIC"],
|
|
)
|
|
|
|
def rn_codegen_modules(
|
|
name,
|
|
android_package_name,
|
|
ios_assume_nonnull,
|
|
library_labels = [],
|
|
schema_target = ""):
|
|
generate_fixtures_rule_name = "{}-codegen-modules".format(name)
|
|
generate_module_hobjcpp_name = "{}-codegen-modules-hobjcpp".format(name)
|
|
generate_module_mm_name = "{}-codegen-modules-mm".format(name)
|
|
generate_module_java_name = "{}-codegen-modules-java".format(name)
|
|
generate_module_java_zip_name = "{}-codegen-modules-java_zip".format(name)
|
|
generate_module_jni_h_name = "{}-codegen-modules-jni_h".format(name)
|
|
generate_module_jni_cpp_name = "{}-codegen-modules-jni_cpp".format(name)
|
|
|
|
fb_native.genrule(
|
|
name = generate_fixtures_rule_name,
|
|
srcs = native.glob(["src/generators/**/*.js"]),
|
|
cmd = "$(exe {generator_script}) $(location {schema_target}) {library_name} $OUT {android_package_name} {ios_assume_nonnull}".format(
|
|
generator_script = react_native_root_target("packages/react-native-codegen:generate_all_from_schema"),
|
|
schema_target = schema_target,
|
|
library_name = name,
|
|
android_package_name = android_package_name,
|
|
ios_assume_nonnull = ios_assume_nonnull,
|
|
),
|
|
out = "codegenfiles-{}".format(name),
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
##################
|
|
# Android handling
|
|
##################
|
|
fb_native.genrule(
|
|
name = generate_module_java_name,
|
|
cmd = "mkdir -p $OUT/{spec_path} && cp -r $(location {generator_target})/java/{spec_path}/* $OUT/{spec_path}/".format(
|
|
spec_path = android_package_name.replace(".", "/"),
|
|
generator_target = ":" + generate_fixtures_rule_name,
|
|
),
|
|
out = "src",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.zip_file(
|
|
name = generate_module_java_zip_name,
|
|
srcs = [":{}".format(generate_module_java_name)],
|
|
out = "{}.src.zip".format(generate_module_java_zip_name),
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_module_jni_h_name,
|
|
cmd = "cp $(location :{})/jni/{}.h $OUT".format(generate_fixtures_rule_name, name),
|
|
out = "{}.h".format(name),
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_module_jni_cpp_name,
|
|
cmd = "cp $(location :{})/jni/{}-generated.cpp $OUT".format(generate_fixtures_rule_name, name),
|
|
out = "{}-generated.cpp".format(name),
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
rn_android_library(
|
|
name = "{}".format(name),
|
|
srcs = [
|
|
":{}".format(generate_module_java_zip_name),
|
|
],
|
|
autoglob = False,
|
|
labels = library_labels + ["codegen_rule"],
|
|
visibility = ["PUBLIC"],
|
|
deps = [
|
|
react_native_dep("third-party/java/jsr-305:jsr-305"),
|
|
react_native_dep("third-party/java/jsr-330:jsr-330"),
|
|
react_native_target("java/com/facebook/react/bridge:bridge"),
|
|
react_native_target("java/com/facebook/react/common:common"),
|
|
],
|
|
exported_deps = [
|
|
react_native_target("java/com/facebook/react/turbomodule/core/interfaces:interfaces"),
|
|
],
|
|
)
|
|
|
|
rn_xplat_cxx_library(
|
|
name = "{}-jni".format(name),
|
|
srcs = [
|
|
":{}".format(generate_module_jni_cpp_name),
|
|
],
|
|
header_namespace = "",
|
|
headers = [
|
|
":{}".format(generate_module_jni_h_name),
|
|
],
|
|
exported_headers = {
|
|
"{}/{}.h".format(name, name): ":{}".format(generate_module_jni_h_name),
|
|
},
|
|
compiler_flags = [
|
|
"-fexceptions",
|
|
"-frtti",
|
|
"-std=c++14",
|
|
"-Wall",
|
|
],
|
|
force_static = True,
|
|
preprocessor_flags = [
|
|
"-DLOG_TAG=\"ReactNative\"",
|
|
"-DWITH_FBSYSTRACE=1",
|
|
],
|
|
visibility = [
|
|
"PUBLIC",
|
|
],
|
|
deps = [],
|
|
exported_deps = [
|
|
react_native_xplat_shared_library_target("jsi:jsi"),
|
|
react_native_xplat_target("react/nativemodule/core:core"),
|
|
],
|
|
platforms = (ANDROID,),
|
|
labels = library_labels + ["codegen_rule"],
|
|
)
|
|
|
|
##############
|
|
# iOS handling
|
|
##############
|
|
if not IS_OSS_BUILD:
|
|
# iOS Buck build isn't fully working in OSS, so let's skip it for OSS for now.
|
|
fb_native.genrule(
|
|
name = generate_module_hobjcpp_name,
|
|
cmd = "cp $(location :{})/{}.h $OUT".format(generate_fixtures_rule_name, name),
|
|
out = "{}.h".format(name),
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_module_mm_name,
|
|
cmd = "cp $(location :{})/{}-generated.mm $OUT".format(generate_fixtures_rule_name, name),
|
|
out = "{}-generated.mm".format(name),
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
rn_apple_library(
|
|
name = "{}Apple".format(name),
|
|
extension_api_only = True,
|
|
header_namespace = "",
|
|
sdks = (IOS),
|
|
compiler_flags = [
|
|
"-Wno-unused-private-field",
|
|
],
|
|
exported_headers = {
|
|
"{}/{}.h".format(name, name): ":{}".format(generate_module_hobjcpp_name),
|
|
},
|
|
headers = [
|
|
":{}".format(generate_module_hobjcpp_name),
|
|
],
|
|
srcs = [
|
|
":{}".format(generate_module_mm_name),
|
|
],
|
|
labels = library_labels + ["codegen_rule"],
|
|
visibility = ["PUBLIC"],
|
|
exported_deps = [
|
|
"//xplat/js/react-native-github:RCTTypeSafety",
|
|
"//xplat/js/react-native-github/Libraries/RCTRequired:RCTRequired",
|
|
react_native_xplat_target_apple("react/nativemodule/core:core"),
|
|
],
|
|
)
|
|
|
|
def rn_codegen_components(
|
|
name = "",
|
|
schema_target = "",
|
|
library_labels = []):
|
|
generate_fixtures_rule_name = "generate_fixtures_components-{}".format(name)
|
|
generate_component_descriptor_h_name = "generate_component_descriptor_h-{}".format(name)
|
|
generate_component_hobjcpp_name = "generate_component_hobjcpp-{}".format(name)
|
|
generate_event_emitter_cpp_name = "generate_event_emitter_cpp-{}".format(name)
|
|
generate_event_emitter_h_name = "generate_event_emitter_h-{}".format(name)
|
|
generate_props_cpp_name = "generate_props_cpp-{}".format(name)
|
|
generate_props_h_name = "generated_props_h-{}".format(name)
|
|
generate_tests_cpp_name = "generate_tests_cpp-{}".format(name)
|
|
generate_shadow_node_cpp_name = "generated_shadow_node_cpp-{}".format(name)
|
|
generate_shadow_node_h_name = "generated_shadow_node_h-{}".format(name)
|
|
copy_generated_java_files = "copy_generated_java_files-{}".format(name)
|
|
copy_generated_cxx_files = "copy_generated_cxx_files-{}".format(name)
|
|
zip_generated_java_files = "zip_generated_java_files-{}".format(name)
|
|
zip_generated_cxx_files = "zip_generated_cxx_files-{}".format(name)
|
|
|
|
fb_native.genrule(
|
|
name = generate_fixtures_rule_name,
|
|
srcs = native.glob(["src/generators/**/*.js"]),
|
|
cmd = "$(exe {}) $(location {}) {} $OUT".format(react_native_root_target("packages/react-native-codegen:generate_all_from_schema"), schema_target, name),
|
|
out = "codegenfiles-{}".format(name),
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_component_descriptor_h_name,
|
|
cmd = "cp $(location :{})/ComponentDescriptors.h $OUT".format(generate_fixtures_rule_name),
|
|
out = "ComponentDescriptors.h",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_component_hobjcpp_name,
|
|
cmd = "cp $(location :{})/RCTComponentViewHelpers.h $OUT".format(generate_fixtures_rule_name),
|
|
out = "RCTComponentViewHelpers.h",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_event_emitter_cpp_name,
|
|
cmd = "cp $(location :{})/EventEmitters.cpp $OUT".format(generate_fixtures_rule_name),
|
|
out = "EventEmitters.cpp",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_event_emitter_h_name,
|
|
cmd = "cp $(location :{})/EventEmitters.h $OUT".format(generate_fixtures_rule_name),
|
|
out = "EventEmitters.h",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_props_cpp_name,
|
|
cmd = "cp $(location :{})/Props.cpp $OUT".format(generate_fixtures_rule_name),
|
|
out = "Props.cpp",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_tests_cpp_name,
|
|
cmd = "cp $(location :{})/Tests.cpp $OUT".format(generate_fixtures_rule_name),
|
|
out = "Tests.cpp",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_props_h_name,
|
|
cmd = "cp $(location :{})/Props.h $OUT".format(generate_fixtures_rule_name),
|
|
out = "Props.h",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = copy_generated_java_files,
|
|
# TODO: support different package name internally.
|
|
# Right now, it's hardcoded to `com.facebook.react.viewmanagers`.
|
|
cmd = "mkdir -p $OUT/com/facebook/react/viewmanagers && cp -R $(location :{})/java/com/facebook/react/viewmanagers/* $OUT/com/facebook/react/viewmanagers".format(generate_fixtures_rule_name),
|
|
out = "java",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = copy_generated_cxx_files,
|
|
# The command below is filtering C++ iOS files, this will be refactored when C++ codegen is finished.
|
|
cmd = "mkdir -p $OUT && find $(location :{}) -not -path '*/rncore*' -not -path '*Tests*' -not -path '*NativeModules*' -not -path '*RCTComponentViewHelpers*' -type f \\( -iname \\*.h -o -iname \\*.cpp \\) -print0 -exec cp {{}} $OUT \\;".format(generate_fixtures_rule_name),
|
|
out = "cxx",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.zip_file(
|
|
name = zip_generated_cxx_files,
|
|
srcs = [":{}".format(copy_generated_cxx_files)],
|
|
out = "{}.src.zip".format(zip_generated_cxx_files),
|
|
visibility = ["PUBLIC"],
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.zip_file(
|
|
name = zip_generated_java_files,
|
|
srcs = [":{}".format(copy_generated_java_files)],
|
|
out = "{}.src.zip".format(zip_generated_java_files),
|
|
visibility = ["PUBLIC"],
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_shadow_node_cpp_name,
|
|
cmd = "cp $(location :{})/ShadowNodes.cpp $OUT".format(generate_fixtures_rule_name),
|
|
out = "ShadowNodes.cpp",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_shadow_node_h_name,
|
|
cmd = "cp $(location :{})/ShadowNodes.h $OUT".format(generate_fixtures_rule_name),
|
|
out = "ShadowNodes.h",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
##############
|
|
# iOS handling
|
|
##############
|
|
if not IS_OSS_BUILD:
|
|
# iOS Buck build isn't fully working in OSS, so let's skip it for OSS for now.
|
|
if is_running_buck_project():
|
|
rn_xplat_cxx_library(name = "generated_components-{}".format(name), visibility = ["PUBLIC"])
|
|
else:
|
|
rn_xplat_cxx_library(
|
|
name = "generated_components-{}".format(name),
|
|
srcs = [
|
|
":{}".format(generate_event_emitter_cpp_name),
|
|
":{}".format(generate_props_cpp_name),
|
|
":{}".format(generate_shadow_node_cpp_name),
|
|
],
|
|
headers = [
|
|
":{}".format(generate_component_descriptor_h_name),
|
|
":{}".format(generate_event_emitter_h_name),
|
|
":{}".format(generate_props_h_name),
|
|
":{}".format(generate_shadow_node_h_name),
|
|
],
|
|
header_namespace = "react/renderer/components/{}".format(name),
|
|
exported_headers = {
|
|
"ComponentDescriptors.h": ":{}".format(generate_component_descriptor_h_name),
|
|
"EventEmitters.h": ":{}".format(generate_event_emitter_h_name),
|
|
"Props.h": ":{}".format(generate_props_h_name),
|
|
"RCTComponentViewHelpers.h": ":{}".format(generate_component_hobjcpp_name),
|
|
"ShadowNodes.h": ":{}".format(generate_shadow_node_h_name),
|
|
},
|
|
compiler_flags = [
|
|
"-fexceptions",
|
|
"-frtti",
|
|
"-std=c++14",
|
|
"-Wall",
|
|
],
|
|
fbobjc_compiler_flags = get_apple_compiler_flags(),
|
|
fbobjc_preprocessor_flags = get_preprocessor_flags_for_build_mode() + get_apple_inspector_flags(),
|
|
ios_exported_headers = {
|
|
"ComponentViewHelpers.h": ":{}".format(generate_component_hobjcpp_name),
|
|
},
|
|
ios_headers = [
|
|
":{}".format(generate_component_hobjcpp_name),
|
|
],
|
|
labels = library_labels + ["codegen_rule"],
|
|
platforms = (ANDROID, APPLE, CXX),
|
|
preprocessor_flags = [
|
|
"-DLOG_TAG=\"ReactNative\"",
|
|
"-DWITH_FBSYSTRACE=1",
|
|
],
|
|
tests = [":generated_tests-{}".format(name)],
|
|
visibility = ["PUBLIC"],
|
|
deps = [
|
|
"//third-party/glog:glog",
|
|
"//xplat/fbsystrace:fbsystrace",
|
|
"//xplat/folly:headers_only",
|
|
"//xplat/folly:memory",
|
|
"//xplat/folly:molly",
|
|
YOGA_CXX_TARGET,
|
|
react_native_xplat_target("react/renderer/debug:debug"),
|
|
react_native_xplat_target("react/renderer/core:core"),
|
|
react_native_xplat_target("react/renderer/graphics:graphics"),
|
|
react_native_xplat_target("react/renderer/components/image:image"),
|
|
react_native_xplat_target("react/renderer/imagemanager:imagemanager"),
|
|
react_native_xplat_target("react/renderer/components/view:view"),
|
|
],
|
|
)
|
|
|
|
# Tests
|
|
fb_xplat_cxx_test(
|
|
name = "generated_tests-{}".format(name),
|
|
srcs = [
|
|
":{}".format(generate_tests_cpp_name),
|
|
],
|
|
apple_sdks = (IOS, MACOSX),
|
|
compiler_flags = [
|
|
"-fexceptions",
|
|
"-frtti",
|
|
"-std=c++14",
|
|
"-Wall",
|
|
],
|
|
contacts = ["oncall+react_native@xmail.facebook.com"],
|
|
labels = library_labels + ["codegen_rule"],
|
|
platforms = (ANDROID, APPLE, CXX),
|
|
deps = [
|
|
"//xplat/third-party/gmock:gtest",
|
|
":generated_components-{}".format(name),
|
|
],
|
|
)
|
|
|
|
##################
|
|
# Android handling
|
|
##################
|
|
if is_running_buck_project():
|
|
rn_android_library(name = "generated_components_java-{}".format(name), autoglob = False)
|
|
else:
|
|
rn_android_library(
|
|
name = "generated_components_java-{}".format(name),
|
|
srcs = [
|
|
":{}".format(zip_generated_java_files),
|
|
],
|
|
autoglob = False,
|
|
labels = library_labels + ["codegen_rule"],
|
|
visibility = ["PUBLIC"],
|
|
deps = [
|
|
react_native_dep("third-party/android/androidx:annotation"),
|
|
react_native_target("java/com/facebook/react/bridge:bridge"),
|
|
react_native_target("java/com/facebook/react/uimanager/interfaces:interfaces"),
|
|
],
|
|
)
|
|
|
|
rn_android_library(
|
|
name = "generated_components_cxx-{}".format(name),
|
|
srcs = [
|
|
":{}".format(zip_generated_cxx_files),
|
|
],
|
|
autoglob = False,
|
|
labels = library_labels + ["codegen_rule"],
|
|
visibility = ["PUBLIC"],
|
|
deps = [
|
|
react_native_dep("third-party/android/androidx:annotation"),
|
|
react_native_target("java/com/facebook/react/bridge:bridge"),
|
|
react_native_target("java/com/facebook/react/common:common"),
|
|
react_native_target("java/com/facebook/react/turbomodule/core:core"),
|
|
react_native_target("java/com/facebook/react/uimanager:uimanager"),
|
|
],
|
|
)
|
|
|
|
def rn_codegen_cxx_modules(
|
|
name = "",
|
|
schema_target = ""):
|
|
generate_fixtures_rule_name = "generate_fixtures_cxx-{}".format(name)
|
|
generate_module_h_name = "generate_module_h-{}".format(name)
|
|
generate_module_cpp_name = "generate_module_cpp-{}".format(name)
|
|
|
|
fb_native.genrule(
|
|
name = generate_fixtures_rule_name,
|
|
srcs = native.glob(["src/generators/**/*.js"]),
|
|
cmd = "$(exe {}) $(location {}) {} $OUT {}".format(react_native_root_target("packages/react-native-codegen:generate_all_from_schema"), schema_target, name, name),
|
|
out = "codegenfiles-{}".format(name),
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_module_h_name,
|
|
cmd = "cp $(location :{})/NativeModules.h $OUT".format(generate_fixtures_rule_name),
|
|
out = "NativeModules.h",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
fb_native.genrule(
|
|
name = generate_module_cpp_name,
|
|
cmd = "cp $(location :{})/NativeModules.cpp $OUT".format(generate_fixtures_rule_name),
|
|
out = "NativeModules.cpp",
|
|
labels = ["codegen_rule"],
|
|
)
|
|
|
|
if is_running_buck_project():
|
|
rn_xplat_cxx_library(name = "generated_cxx_modules-{}".format(name))
|
|
else:
|
|
rn_xplat_cxx_library(
|
|
name = "generated_cxx_modules-{}".format(name),
|
|
srcs = [
|
|
":{}".format(generate_module_cpp_name),
|
|
],
|
|
headers = [
|
|
":{}".format(generate_module_h_name),
|
|
],
|
|
header_namespace = "react/modules/{}".format(name),
|
|
exported_headers = {
|
|
"NativeModules.cpp": ":{}".format(generate_module_cpp_name),
|
|
"NativeModules.h": ":{}".format(generate_module_h_name),
|
|
},
|
|
compiler_flags = [
|
|
"-fexceptions",
|
|
"-frtti",
|
|
"-std=c++14",
|
|
"-Wall",
|
|
],
|
|
fbobjc_compiler_flags = get_apple_compiler_flags(),
|
|
fbobjc_preprocessor_flags = get_preprocessor_flags_for_build_mode() + get_apple_inspector_flags(),
|
|
labels = ["codegen_rule"],
|
|
platforms = (ANDROID, APPLE),
|
|
preprocessor_flags = [
|
|
"-DLOG_TAG=\"ReactNative\"",
|
|
"-DWITH_FBSYSTRACE=1",
|
|
],
|
|
visibility = ["PUBLIC"],
|
|
exported_deps = [
|
|
react_native_xplat_target("react/nativemodule/core:core"),
|
|
],
|
|
)
|
|
|
|
def is_running_buck_project():
|
|
return read_bool("fbandroid", "is_running_buck_project", False)
|