From 427ba359e0c9411438286dd137bbca67f9829fde Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Thu, 27 Feb 2020 06:38:53 -0800 Subject: [PATCH] Stamp React Native Version Into C++ Code (#28036) Summary: The PlatformConstants native module exposes the ability to query the React Native version used to build native code. This is managed on iOS and Android by a version bumping script, which replaces module code based on a template. It is currently difficult to accurately determine this version for out-of-tree C++ platforms (I.e. React Native Windows). The version of upstream react-native we resolve to is ultimately dependent on the version of react-native chosen a peer dependency, which is not neccesarily constant given a build of react-native-windows. We could try to hack around this, and make our native build try to reason about the resolved pacakge for react-native using a lockfile, but a much cleaner solution is to embed version into C++ code, similar to what is done for Android and iOS. This change does that, adding a header with React Native version and updating the build stamping script to write to it. Usage sample: ```c++ constants["reactNativeVersion"] = folly::dynamic::object(); constants["reactNativeVersion"]["major"] = ReactNativeVersion.Major; constants["reactNativeVersion"]["minor"] = ReactNativeVersion.Minor; constants["reactNativeVersion"]["patch"] = ReactNativeVersion.Patch; ``` ## Changelog [General] [Added] - Stamp React Native Version Into C++ Code Pull Request resolved: https://github.com/facebook/react-native/pull/28036 Test Plan: Validated that the bumping script will accurately update the header, can compile under both MSVC and Clang. Differential Revision: D19865992 Pulled By: hramos fbshipit-source-id: 9e0b8e9519015bb62c60b9935a234cd367a1926a --- ReactCommon/cxxreact/ReactNativeVersion.h | 24 +++++++++++++++++++ scripts/bump-oss-version.js | 13 ++++++++++ .../ReactNativeVersion.h.template | 24 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 ReactCommon/cxxreact/ReactNativeVersion.h create mode 100644 scripts/versiontemplates/ReactNativeVersion.h.template diff --git a/ReactCommon/cxxreact/ReactNativeVersion.h b/ReactCommon/cxxreact/ReactNativeVersion.h new file mode 100644 index 00000000000000..d6cbbcd82a9c6d --- /dev/null +++ b/ReactCommon/cxxreact/ReactNativeVersion.h @@ -0,0 +1,24 @@ +/** + * 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. + * + * @generated by scripts/bump-oss-version.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + +constexpr struct { + int32_t Major = 0; + int32_t Minor = 0; + int32_t Patch = 0; + std::string_view Prerelease = ""; +} ReactNativeVersion; + +} // namespace facebook::react diff --git a/scripts/bump-oss-version.js b/scripts/bump-oss-version.js index e6a394b05266dc..cf924e49ffe2f9 100755 --- a/scripts/bump-oss-version.js +++ b/scripts/bump-oss-version.js @@ -84,6 +84,19 @@ fs.writeFileSync( 'utf-8', ); +fs.writeFileSync( + 'ReactCommon/cxxreact/ReactNativeVersion.h', + cat('scripts/versiontemplates/ReactNativeVersion.h.template') + .replace('${major}', major) + .replace('${minor}', minor) + .replace('${patch}', patch) + .replace( + '${prerelease}', + prerelease !== undefined ? `"${prerelease}"` : '""', + ), + 'utf-8', +); + fs.writeFileSync( 'Libraries/Core/ReactNativeVersion.js', cat('scripts/versiontemplates/ReactNativeVersion.js.template') diff --git a/scripts/versiontemplates/ReactNativeVersion.h.template b/scripts/versiontemplates/ReactNativeVersion.h.template new file mode 100644 index 00000000000000..ed9d242c72a43d --- /dev/null +++ b/scripts/versiontemplates/ReactNativeVersion.h.template @@ -0,0 +1,24 @@ +/** + * 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. + * + * @generated by scripts/bump-oss-version.js + */ + +#pragma once + +#include +#include + +namespace facebook::react { + +constexpr struct { + int32_t Major = ${major}; + int32_t Minor = ${minor}; + int32_t Patch = ${patch}; + std::string_view Prerelease = ${prerelease}; +} ReactNativeVersion; + +} // namespace facebook::react