From 703267920c579eebb9b0b01aa878435e80fb8087 Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Wed, 12 Jul 2023 13:38:18 -0700 Subject: [PATCH] Separate Node and Web Binaries (#1325) Summary: Pull Request resolved: https://github.com/facebook/yoga/pull/1325 Fixes https://github.com/facebook/yoga/issues/1321 Differential Revision: https://internalfb.com/D47368830 fbshipit-source-id: 889c904c062567f4166a735165bbb33e72180b61 --- javascript/CMakeLists.txt | 49 +++++++++++++++++-- javascript/just.config.ts | 38 +++++++------- javascript/package.json | 42 ++++++++++------ javascript/src/entrypoint/asmjs-async-node.ts | 26 ++++++++++ .../{wasm-async.ts => asmjs-async-web.ts} | 2 +- javascript/src/entrypoint/asmjs-sync-node.ts | 23 +++++++++ .../{wasm-sync.ts => asmjs-sync-web.ts} | 2 +- javascript/src/entrypoint/wasm-async-node.ts | 26 ++++++++++ .../{asmjs-async.ts => wasm-async-web.ts} | 2 +- javascript/src/entrypoint/wasm-sync-node.ts | 23 +++++++++ .../{asmjs-sync.ts => wasm-sync-web.ts} | 2 +- 11 files changed, 191 insertions(+), 44 deletions(-) create mode 100644 javascript/src/entrypoint/asmjs-async-node.ts rename javascript/src/entrypoint/{wasm-async.ts => asmjs-async-web.ts} (89%) create mode 100644 javascript/src/entrypoint/asmjs-sync-node.ts rename javascript/src/entrypoint/{wasm-sync.ts => asmjs-sync-web.ts} (87%) create mode 100644 javascript/src/entrypoint/wasm-async-node.ts rename javascript/src/entrypoint/{asmjs-async.ts => wasm-async-web.ts} (89%) create mode 100644 javascript/src/entrypoint/wasm-sync-node.ts rename javascript/src/entrypoint/{asmjs-sync.ts => wasm-sync-web.ts} (88%) diff --git a/javascript/CMakeLists.txt b/javascript/CMakeLists.txt index 1fe28c1669..0121799af9 100644 --- a/javascript/CMakeLists.txt +++ b/javascript/CMakeLists.txt @@ -37,7 +37,6 @@ add_link_options( "SHELL:-s ALLOW_MEMORY_GROWTH=1" "SHELL:-s ASSERTIONS=0" "SHELL:-s DYNAMIC_EXECUTION=0" - "SHELL:-s ENVIRONMENT='web,node'" "SHELL:-s EXPORT_NAME='loadYoga'" "SHELL:-s FETCH_SUPPORT_INDEXEDDB=0" "SHELL:-s FILESYSTEM=0" @@ -51,24 +50,64 @@ add_library(yogaObjLib OBJECT ${SOURCES}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/binaries) +add_executable(asmjs-sync-node $) +target_link_options(asmjs-sync-node PUBLIC + "SHELL:-s ENVIRONMENT='node'" + "SHELL:-s WASM=0" + "SHELL:-s WASM_ASYNC_COMPILATION=0") + +add_executable(asmjs-async-node $) +target_link_options(asmjs-async-node PUBLIC + "SHELL:-s ENVIRONMENT='node'" + "SHELL:-s WASM=0" + "SHELL:-s WASM_ASYNC_COMPILATION=1") + +add_executable(asmjs-sync-web $) +target_link_options(asmjs-sync-web PUBLIC + "SHELL:-s ENVIRONMENT='web'" + "SHELL:-s WASM=0" + "SHELL:-s WASM_ASYNC_COMPILATION=0") + +add_executable(asmjs-async-web $) +target_link_options(asmjs-async-web PUBLIC + "SHELL:-s ENVIRONMENT='web'" + "SHELL:-s WASM=0" + "SHELL:-s WASM_ASYNC_COMPILATION=1") + add_executable(asmjs-sync $) target_link_options(asmjs-sync PUBLIC + "SHELL:-s ENVIRONMENT='web,node'" "SHELL:-s WASM=0" "SHELL:-s WASM_ASYNC_COMPILATION=0") add_executable(asmjs-async $) target_link_options(asmjs-async PUBLIC + "SHELL:-s ENVIRONMENT='web,node'" "SHELL:-s WASM=0" "SHELL:-s WASM_ASYNC_COMPILATION=1") -add_executable(wasm-sync $) -target_link_options(wasm-sync PUBLIC +add_executable(wasm-sync-node $) +target_link_options(wasm-sync-node PUBLIC + "SHELL:-s ENVIRONMENT='node'" + "SHELL:-s WASM=1" + "SHELL:-s WASM_ASYNC_COMPILATION=0") + +add_executable(wasm-async-node $) +target_link_options(wasm-async-node PUBLIC + "SHELL:-s ENVIRONMENT='node'" + "SHELL:-s WASM=1" + "SHELL:-s WASM_ASYNC_COMPILATION=1") + +add_executable(wasm-sync-web $) +target_link_options(wasm-sync-web PUBLIC + "SHELL:-s ENVIRONMENT='web'" "SHELL:-s WASM=1" "SHELL:-s SINGLE_FILE=1" "SHELL:-s WASM_ASYNC_COMPILATION=0") -add_executable(wasm-async $) -target_link_options(wasm-async PUBLIC +add_executable(wasm-async-web $) +target_link_options(wasm-async-web PUBLIC + "SHELL:-s ENVIRONMENT='web'" "SHELL:-s WASM=1" "SHELL:-s SINGLE_FILE=1" "SHELL:-s WASM_ASYNC_COMPILATION=1") diff --git a/javascript/just.config.ts b/javascript/just.config.ts index 742b3da80d..9537dc7e80 100644 --- a/javascript/just.config.ts +++ b/javascript/just.config.ts @@ -45,37 +45,35 @@ function defineFlavor(flavor: string, env: NodeJS.ProcessEnv) { ); } -defineFlavor('asmjs-async', {WASM: '0', SYNC: '0'}); -defineFlavor('asmjs-sync', {WASM: '0', SYNC: '1'}); -defineFlavor('wasm-async', {WASM: '1', SYNC: '0'}); -defineFlavor('wasm-sync', {WASM: '1', SYNC: '1'}); +defineFlavor('asmjs-async-node', {WASM: '0', SYNC: '0'}); +defineFlavor('asmjs-sync-node', {WASM: '0', SYNC: '1'}); +defineFlavor('asmjs-async-web', {WASM: '0', SYNC: '0'}); +defineFlavor('asmjs-sync-web', {WASM: '0', SYNC: '1'}); +defineFlavor('wasm-async-node', {WASM: '1', SYNC: '0'}); +defineFlavor('wasm-sync-node', {WASM: '1', SYNC: '1'}); +defineFlavor('wasm-async-web', {WASM: '1', SYNC: '0'}); +defineFlavor('wasm-sync-web', {WASM: '1', SYNC: '1'}); -task('cmake-build:all', cmakeBuildTask()); -task( - 'cmake-build:async', - cmakeBuildTask({targets: ['asmjs-async', 'wasm-async']}), -); -task( - 'cmake-build:sync', - cmakeBuildTask({targets: ['asmjs-sync', 'wasm-sync']}), -); - -task('build', series(emcmakeGenerateTask(), 'cmake-build:all')); +task('build', series(emcmakeGenerateTask(), cmakeBuildTask())); task( 'test', series( emcmakeGenerateTask(), - series('cmake-build:asmjs-async', 'jest:asmjs-async'), - series('cmake-build:asmjs-sync', 'jest:asmjs-sync'), - series('cmake-build:wasm-async', 'jest:wasm-async'), - series('cmake-build:wasm-sync', 'jest:wasm-sync'), + series('cmake-build:asmjs-async-node', 'jest:asmjs-async-node'), + series('cmake-build:asmjs-sync-node', 'jest:asmjs-sync-node'), + series('cmake-build:wasm-async-node', 'jest:wasm-async-node'), + series('cmake-build:wasm-sync-node', 'jest:wasm-sync-node'), ), ); task( 'benchmark', - series(emcmakeGenerateTask(), 'cmake-build:sync', runBenchTask()), + series( + emcmakeGenerateTask(), + cmakeBuildTask({targets: ['asmjs-sync-node', 'wasm-sync-node']}), + runBenchTask(), + ), ); task( diff --git a/javascript/package.json b/javascript/package.json index 8428083f88..2f9ed0a94b 100644 --- a/javascript/package.json +++ b/javascript/package.json @@ -11,19 +11,35 @@ }, "exports": { ".": { - "browser": "./src/entrypoint/wasm-async.ts", - "node": "./src/entrypoint/wasm-async.ts", - "default": "./src/entrypoint/asmjs-async.ts" + "browser": "./src/entrypoint/wasm-async-web.ts", + "node": "./src/entrypoint/wasm-async-node.ts", + "default": "./src/entrypoint/asmjs-async-web.ts" }, "./sync": { - "browser": "./src/entrypoint/asmjs-sync.ts", - "node": "./src/entrypoint/wasm-sync.ts", - "default": "./src/entrypoint/asmjs-sync.ts" + "browser": "./src/entrypoint/asmjs-sync-web.ts", + "node": "./src/entrypoint/wasm-sync-node.ts", + "default": "./src/entrypoint/asmjs-sync-web.ts" }, - "./asmjs-async": "./src/entrypoint/asmjs-async.ts", - "./asmjs-sync": "./src/entrypoint/asmjs-sync.ts", - "./wasm-async": "./src/entrypoint/wasm-async.ts", - "./wasm-sync": "./src/entrypoint/wasm-sync.ts" + "./asmjs-async": { + "browser": "./src/entrypoint/asmjs-async-web.ts", + "node": "./src/entrypoint/asmjs-async-node.ts", + "default": "./src/entrypoint/asmjs-async-web.ts" + }, + "./asmjs-sync": { + "browser": "./src/entrypoint/asmjs-sync-web.ts", + "node": "./src/entrypoint/asmjs-sync-node.ts", + "default": "./src/entrypoint/asmjs-sync-web.ts" + }, + "./wasm-async": { + "browser": "./src/entrypoint/wasm-async-web.ts", + "node": "./src/entrypoint/wasm-async-node.ts", + "default": "./src/entrypoint/wasm-async-web.ts" + }, + "./wasm-sync": { + "browser": "./src/entrypoint/wasm-sync-web.ts", + "node": "./src/entrypoint/wasm-sync-node.ts", + "default": "./src/entrypoint/wasm-async-web.ts" + } }, "files": [ "binaries/**", @@ -36,11 +52,7 @@ "lint": "just lint", "lint:fix": "just lint --fix", "prepack": "just prepack", - "test": "just test", - "test:asmjs-async": "just test:asmjs-async", - "test:asmjs-sync": "just test:asmjs-sync", - "test:wasm-async": "just test:wasm-async", - "test:wasm-sync": "just test:wasm-sync" + "test": "just test" }, "devDependencies": { "@babel/cli": "^7.20.7", diff --git a/javascript/src/entrypoint/asmjs-async-node.ts b/javascript/src/entrypoint/asmjs-async-node.ts new file mode 100644 index 0000000000..36217d7785 --- /dev/null +++ b/javascript/src/entrypoint/asmjs-async-node.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import wrapAssembly from '../wrapAssembly'; +import type {Yoga} from '../wrapAssembly'; + +export * from '../generated/YGEnums'; +export type { + Config, + DirtiedFunction, + MeasureFunction, + Node, + Yoga, +} from '../wrapAssembly'; + +const loadAssembly = require('../../binaries/asmjs-async-node'); + +export async function loadYoga(): Promise { + return wrapAssembly(await loadAssembly()); +} diff --git a/javascript/src/entrypoint/wasm-async.ts b/javascript/src/entrypoint/asmjs-async-web.ts similarity index 89% rename from javascript/src/entrypoint/wasm-async.ts rename to javascript/src/entrypoint/asmjs-async-web.ts index 752f759da1..9069c1d8be 100644 --- a/javascript/src/entrypoint/wasm-async.ts +++ b/javascript/src/entrypoint/asmjs-async-web.ts @@ -19,7 +19,7 @@ export type { Yoga, } from '../wrapAssembly'; -const loadAssembly = require('../../binaries/wasm-async'); +const loadAssembly = require('../../binaries/asmjs-async-web'); export async function loadYoga(): Promise { return wrapAssembly(await loadAssembly()); diff --git a/javascript/src/entrypoint/asmjs-sync-node.ts b/javascript/src/entrypoint/asmjs-sync-node.ts new file mode 100644 index 0000000000..d91029235c --- /dev/null +++ b/javascript/src/entrypoint/asmjs-sync-node.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import wrapAssembly from '../wrapAssembly'; + +export * from '../generated/YGEnums'; +export type { + Config, + DirtiedFunction, + MeasureFunction, + Node, + Yoga, +} from '../wrapAssembly'; + +const loadAssembly = require('../../binaries/asmjs-sync-node'); +const Yoga = wrapAssembly(loadAssembly()); +export default Yoga; diff --git a/javascript/src/entrypoint/wasm-sync.ts b/javascript/src/entrypoint/asmjs-sync-web.ts similarity index 87% rename from javascript/src/entrypoint/wasm-sync.ts rename to javascript/src/entrypoint/asmjs-sync-web.ts index ff9bf7026f..5984e0a0ea 100644 --- a/javascript/src/entrypoint/wasm-sync.ts +++ b/javascript/src/entrypoint/asmjs-sync-web.ts @@ -18,6 +18,6 @@ export type { Yoga, } from '../wrapAssembly'; -const loadAssembly = require('../../binaries/wasm-sync'); +const loadAssembly = require('../../binaries/asmjs-sync-web'); const Yoga = wrapAssembly(loadAssembly()); export default Yoga; diff --git a/javascript/src/entrypoint/wasm-async-node.ts b/javascript/src/entrypoint/wasm-async-node.ts new file mode 100644 index 0000000000..8dea482ef6 --- /dev/null +++ b/javascript/src/entrypoint/wasm-async-node.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import wrapAssembly from '../wrapAssembly'; +import type {Yoga} from '../wrapAssembly'; + +export * from '../generated/YGEnums'; +export type { + Config, + DirtiedFunction, + MeasureFunction, + Node, + Yoga, +} from '../wrapAssembly'; + +const loadAssembly = require('../../binaries/wasm-async-node'); + +export async function loadYoga(): Promise { + return wrapAssembly(await loadAssembly()); +} diff --git a/javascript/src/entrypoint/asmjs-async.ts b/javascript/src/entrypoint/wasm-async-web.ts similarity index 89% rename from javascript/src/entrypoint/asmjs-async.ts rename to javascript/src/entrypoint/wasm-async-web.ts index 5ac7c71a68..092c7d86ee 100644 --- a/javascript/src/entrypoint/asmjs-async.ts +++ b/javascript/src/entrypoint/wasm-async-web.ts @@ -19,7 +19,7 @@ export type { Yoga, } from '../wrapAssembly'; -const loadAssembly = require('../../binaries/asmjs-async'); +const loadAssembly = require('../../binaries/wasm-async-web'); export async function loadYoga(): Promise { return wrapAssembly(await loadAssembly()); diff --git a/javascript/src/entrypoint/wasm-sync-node.ts b/javascript/src/entrypoint/wasm-sync-node.ts new file mode 100644 index 0000000000..f9f208d3f0 --- /dev/null +++ b/javascript/src/entrypoint/wasm-sync-node.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import wrapAssembly from '../wrapAssembly'; + +export * from '../generated/YGEnums'; +export type { + Config, + DirtiedFunction, + MeasureFunction, + Node, + Yoga, +} from '../wrapAssembly'; + +const loadAssembly = require('../../binaries/wasm-sync-node'); +const Yoga = wrapAssembly(loadAssembly()); +export default Yoga; diff --git a/javascript/src/entrypoint/asmjs-sync.ts b/javascript/src/entrypoint/wasm-sync-web.ts similarity index 88% rename from javascript/src/entrypoint/asmjs-sync.ts rename to javascript/src/entrypoint/wasm-sync-web.ts index 710dbdbe75..da1a53aa1f 100644 --- a/javascript/src/entrypoint/asmjs-sync.ts +++ b/javascript/src/entrypoint/wasm-sync-web.ts @@ -18,6 +18,6 @@ export type { Yoga, } from '../wrapAssembly'; -const loadAssembly = require('../../binaries/asmjs-sync'); +const loadAssembly = require('../../binaries/wasm-sync-web'); const Yoga = wrapAssembly(loadAssembly()); export default Yoga;