Skip to content

Commit 99fbe95

Browse files
committed
v2
1 parent c1fc11e commit 99fbe95

File tree

1,658 files changed

+175237
-885
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,658 files changed

+175237
-885
lines changed
File renamed without changes.
File renamed without changes.
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const nodeLibs = {
1414
buffer: 'export default {};',
1515
crypto: 'export default {};',
1616
stream: 'export default {};',
17+
ws: 'export default {};',
1718
};
1819

1920
const options = {
@@ -42,7 +43,8 @@ export default async function buildJS(input, type) {
4243
env: ${env},
4344
paths: {
4445
wasm: '${state.config.general.name}.wasm',
45-
data: '${state.config.general.name}.data.txt'
46+
data: '${state.config.general.name}.data.txt',
47+
worker: '${state.config.general.name}.js',
4648
}
4749
}`;
4850
let file = input;
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import fs from 'node:fs';
2+
import replace from 'replace';
3+
import run from './run.js';
4+
import getDependLibs from './getDependLibs.js';
5+
import getData from './getData.js';
6+
import buildJs from './buildJs.js';
7+
import triggerExtensions from './extensions.js';
8+
import state from '../state/index.js';
9+
10+
export default async function buildWasm(type, isProd = false) {
11+
const buildType = isProd ? 'Release' : 'Debug';
12+
const libs = [
13+
...getDependLibs(),
14+
`${state.config.paths.build}/Source-${buildType}/Emscripten-x86_64/lib${state.config.general.name}.a`,
15+
`${state.config.paths.build}/Bridge-${buildType}/Emscripten-x86_64/lib${state.config.general.name}.a`,
16+
];
17+
18+
const binary = getData('binary', 'Emscripten-x86_64');
19+
20+
if (type === 'browser') {
21+
console.log('wasm compiling for browser...');
22+
const t0 = performance.now();
23+
const emccFlags = [
24+
...(binary?.emccFlags || []),
25+
...(getData('binary', 'Emscripten-x86_64', 'browser')?.emccFlags || []),
26+
];
27+
28+
triggerExtensions('buildWasm', 'beforeBuildBrowser', [emccFlags]);
29+
30+
if (state.config.build.usePthread && !emccFlags.includes('-pthread')) {
31+
emccFlags.push('-pthread');
32+
emccFlags.push('-sPTHREAD_POOL_SIZE=4');
33+
}
34+
35+
const data = Object.entries(getData('data', 'Emscripten-x86_64', 'browser')).map(([key, value]) => ['--preload-file', `${key.replaceAll('@', '@@')}@${value}`]).flat();
36+
run('emcc', [
37+
'-lembind', '-Wl,--whole-archive',
38+
...emccFlags,
39+
// '-lwebsocket.js', '-sPROXY_POSIX_SOCKETS', '-sWEBSOCKET_DEBUG=1', '-sJSPI', '-g', '-sWASMFS',
40+
'-sWASM_BIGINT=1', '-s', 'FORCE_FILESYSTEM=1',
41+
'-sEXPORT_NAME=Module2', // '-pthread', '-sPTHREAD_POOL_SIZE=5',
42+
...libs, ...(isProd ? ['-O3'] : []),
43+
'-s', 'WASM=1', '-s', 'MODULARIZE=1', '-s', 'DYNAMIC_EXECUTION=0',
44+
/* '-s', 'RESERVED_FUNCTION_POINTERS=200',*/ // '-s', 'FORCE_FILESYSTEM=1',
45+
// '-s', 'ALLOW_MEMORY_GROWTH=1',
46+
'-s', 'EXPORTED_RUNTIME_METHODS=["FS", "ENV"]',
47+
'-fwasm-exceptions',
48+
'-o', `${state.config.paths.build}/${state.config.general.name}.js`,
49+
...data,
50+
]);
51+
const t1 = performance.now();
52+
console.log('wasm compiled for browser...', Math.round(t1 - t0));
53+
console.log('js compiling for browser...');
54+
replace({
55+
regex: 'var _scriptName = ',
56+
replacement: `var _scriptName = 'cpp.worker.js'; //`,
57+
paths: [`${state.config.paths.build}/${state.config.general.name}.js`],
58+
recursive: false,
59+
silent: true,
60+
});
61+
/* replace({
62+
regex: 'val === 10',
63+
replacement: 'false',
64+
paths: [`${state.config.paths.build}/${state.config.general.name}.js`],
65+
recursive: false,
66+
silent: true,
67+
}); */
68+
await buildJs(`${state.config.paths.build}/${state.config.general.name}.js`, 'browser');
69+
// fs.rmSync(`${state.config.paths.build}/${state.config.general.name}.js`);
70+
// fs.copyFileSync(`${state.config.paths.build}/${state.config.general.name}.browser.js`, `${state.config.paths.build}/${state.config.general.name}.js`);
71+
// fs.renameSync(`${state.config.paths.build}/${state.config.general.name}.js`, `${state.config.paths.build}/${state.config.general.name}.worker.browser.js`);
72+
const t2 = performance.now();
73+
console.log('js compiled for browser...', Math.round(t2 - t1));
74+
}
75+
76+
if (type === 'node') {
77+
console.log('wasm compiling for node...');
78+
const emccFlags = [
79+
...(binary?.emccFlags || []),
80+
...(getData('binary', 'Emscripten-x86_64', 'node')?.emccFlags || []),
81+
];
82+
83+
triggerExtensions('buildWasm', 'beforeBuildNodeJS', [emccFlags]);
84+
85+
if (state.config.build.usePthread && !emccFlags.includes('-pthread')) {
86+
emccFlags.push('-pthread');
87+
emccFlags.push('-sPTHREAD_POOL_SIZE=4');
88+
}
89+
90+
run('emcc', [
91+
'-lembind', '-Wl,--whole-archive', '-lnodefs.js',
92+
...emccFlags,
93+
// '-s', 'FETCH', '-sJSPI', '-sWASM_BIGINT=1', '-pthread', '-sPTHREAD_POOL_SIZE=5',
94+
'-sWASM_BIGINT=1', '-s', 'FORCE_FILESYSTEM=1',
95+
...libs, ...(isProd ? ['-O3'] : []),
96+
'-s', 'WASM=1', '-s', 'MODULARIZE=1', '-s', 'DYNAMIC_EXECUTION=0',
97+
// '-s', 'RESERVED_FUNCTION_POINTERS=200', '-s', 'DISABLE_EXCEPTION_CATCHING=0', '-s', 'FORCE_FILESYSTEM=1',
98+
// '-s', 'ALLOW_MEMORY_GROWTH=1',
99+
'-s', 'NODERAWFS',
100+
'-s', 'EXPORTED_RUNTIME_METHODS=["FS", "ENV", "NODEFS"]',
101+
'-fwasm-exceptions',
102+
'-o', `${state.config.paths.build}/${state.config.general.name}.js`,
103+
]);
104+
console.log('wasm compiled for node...');
105+
console.log('js compiling for node...');
106+
await buildJs(`${state.config.paths.build}/${state.config.general.name}.js`, 'node');
107+
if (emccFlags.includes('FETCH')) {
108+
fs.appendFileSync(`${state.config.paths.build}/${state.config.general.name}.node.js`, 'var XMLHttpRequest = require(\'xhr2\');\n');
109+
}
110+
// fs.renameSync(`${state.config.paths.build}/${state.config.general.name}.js`, `${state.config.paths.build}/${state.config.general.name}.worker.node.js`);
111+
console.log('js compiled for node...');
112+
113+
Object.entries(getData('data', 'Emscripten-x86_64', 'node')).forEach(([key, value]) => {
114+
if (fs.existsSync(key)) {
115+
const dAssetPath = `${state.config.paths.build}/data/${value}`;
116+
if (!fs.existsSync(dAssetPath)) {
117+
fs.mkdirSync(dAssetPath, { recursive: true });
118+
fs.cpSync(key, dAssetPath, { recursive: true });
119+
}
120+
}
121+
});
122+
}
123+
124+
if (fs.existsSync(`${state.config.paths.build}/${state.config.general.name}.data`)) {
125+
fs.renameSync(`${state.config.paths.build}/${state.config.general.name}.data`, `${state.config.paths.build}/${state.config.general.name}.data.txt`);
126+
}
127+
}
File renamed without changes.

packages/cpp.js/src/actions/createLib.js renamed to cppjs-core/cpp.js/src/actions/createLib.js

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import os from 'node:os';
22
import fs from 'node:fs';
33
import replace from 'replace';
4+
import getData from './getData.js';
45
import run from './run.js';
56
import getCmakeParameters from './getCmakeParameters.js';
7+
import triggerExtensions from './extensions.js';
68
import state from '../state/index.js';
79

810
const cpuCount = os.cpus().length - 1;
@@ -26,8 +28,8 @@ export default function createLib(platform, fileType, options = {}) {
2628
const buildEnv = { params: [] };
2729
let buildParams;
2830
const depPaths = state.config.allDependencyPaths[platform];
29-
if (state.config.build) {
30-
const { getBuildParams, getExtraLibs } = state.config.build;
31+
if (state.config.build.withBuildConfig) {
32+
const { getBuildParams, getExtraLibs, usePthread } = state.config.build;
3133
buildEnv.console = true;
3234
const ext = sharedPlatforms.includes(basePlatform) ? 'so' : 'a';
3335
buildParams = getBuildParams ? getBuildParams(platform, depPaths, ext, buildPath) : [];
@@ -36,30 +38,49 @@ export default function createLib(platform, fileType, options = {}) {
3638
buildParams.push(`-DCMAKE_PREFIX_PATH=${libdir}`, `-DCMAKE_FIND_ROOT_PATH=${libdir}`, `-DBUILD_TYPE=${cmakeBuildType}`);
3739
}
3840

39-
const cFlags = Object.values(depPaths).map((d) => `-I${d.header}`).join(' ');
40-
const ldFlags = Object.values(depPaths).map((d) => `-L${d.libPath}`).join(' ');
41+
const cFlags = Object.values(depPaths).filter(d => d.header).map((d) => `-I${d.header}`);
42+
const ldFlags = Object.values(depPaths).filter(d => d.libPath).map((d) => `-L${d.libPath}`);
4143
let dependLibs = '';
4244
if (state.config.build?.buildType === 'configure') {
43-
dependLibs = Object.keys(depPaths).map((d) => `-l${d}`).join(' ');
45+
dependLibs = Object.keys(depPaths).filter(d => d).map((d) => `-l${d}`).join(' ');
4446
}
4547

4648
const extraLibs = getExtraLibs ? getExtraLibs(platform) : [];
4749

48-
buildEnv.params.push('-e', `CFLAGS=${cFlags}`);
49-
buildEnv.params.push('-e', `CPPFLAGS=${cFlags}`);
50-
buildEnv.params.push('-e', `LDFLAGS=${ldFlags} ${extraLibs.join(' ')}`);
50+
triggerExtensions('createLib', 'setFlagWithBuildConfig', [buildEnv, cFlags, ldFlags]);
51+
52+
if (usePthread) {
53+
cFlags.push('-pthread');
54+
ldFlags.push('-pthread');
55+
}
56+
57+
buildEnv.params.push('-e', `CFLAGS=${cFlags.join(' ')}`);
58+
buildEnv.params.push('-e', `CXXFLAGS=${cFlags.join(' ')}`);
59+
buildEnv.params.push('-e', `LDFLAGS=${ldFlags.join(' ')} ${extraLibs.join(' ')}`);
5160
// buildEnv.params.push('-e', `LIBS=${dependLibs} ${extraLibs.join(' ')}`);
5261

53-
state.config.build.env?.forEach((e) => {
62+
let configBuildEnv = state.config.build.env;
63+
if (configBuildEnv && typeof configBuildEnv === 'function') {
64+
configBuildEnv = configBuildEnv(platform);
65+
}
66+
configBuildEnv?.forEach((e) => {
5467
buildEnv.params.push('-e', e);
5568
});
5669
} else {
5770
buildParams = getCmakeParameters(platform, options);
71+
72+
triggerExtensions('createLib', 'setFlagWithoutBuildConfig', [buildEnv]);
73+
74+
if (state.config.build.usePthread) {
75+
buildEnv.params.push('-e', `CFLAGS=-pthread`);
76+
buildEnv.params.push('-e', `CXXFLAGS=-pthread`);
77+
buildEnv.params.push('-e', `LDFLAGS=-pthread`);
78+
}
5879
}
5980

6081
console.log(`${platform} is compiling...`);
6182
const t0 = performance.now();
62-
const cmakeDir = state.config.build ? `${state.config.paths.build}/source` : state.config.paths.cmakeDir;
83+
const cmakeDir = state.config.build.withBuildConfig ? `${state.config.paths.build}/source` : state.config.paths.cmakeDir;
6384

6485
if (state.config.build?.beforeRun) {
6586
const dataList = state.config.build?.beforeRun(cmakeDir);
File renamed without changes.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import state from '../state/index.js';
2+
3+
export default function triggerExtensions(fileName, hook, params = []) {
4+
state.config.extensions?.forEach(e => {
5+
e?.[fileName]?.[hook](state, ...params);
6+
});
7+
}
File renamed without changes.

0 commit comments

Comments
 (0)