Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @bugra9
29 changes: 29 additions & 0 deletions .github/workflows/linux_build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: linux_build
on:
push:
branches:
- main
paths:
- packages/cpp.js/**
- packages/cppjs-plugin-*/**
pull_request:
branches:
- main
paths:
- packages/cpp.js/**
- packages/cppjs-plugin-*/**
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 22.x
- name: Install dependencies
run: pnpm install
- name: Build for Linux
run: pnpm run ci:linux:build
60 changes: 60 additions & 0 deletions .github/workflows/macos_build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: macos_build
on:
push:
branches:
- main
paths:
- packages/cpp.js/**
- packages/cppjs-plugin-*/**
pull_request:
branches:
- main
paths:
- packages/cpp.js/**
- packages/cppjs-plugin-*/**
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Install the Apple certificate and provisioning profile
env:
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
run: |
# create variables
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db

# import certificate and provisioning profile from secrets
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH

# create temporary keychain
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH

# import certificate to keychain
security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH

# apply provisioning profile
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: 22.x
- name: Install dependencies
run: |
pnpm install
pnpm cppjs config set XCODE_DEVELOPMENT_TEAM 7ZZLDWBUVT
- name: Build for Macos
run: pnpm run ci:macos:build
25 changes: 20 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,28 @@
"private": true,
"scripts": {
"docs:deploy": "push-dir --dir=website/build --branch=gh-pages --cleanup",
"build:gdal": "pnpm --filter=@cpp.js/package-iconv run build && pnpm --filter=@cpp.js/package-zlib run build && pnpm --filter=@cpp.js/package-expat run build && pnpm --filter=@cpp.js/package-webp run build && pnpm --filter=@cpp.js/package-tiff run build && pnpm --filter=@cpp.js/package-sqlite3 run build && pnpm --filter=@cpp.js/package-proj run build && pnpm --filter=@cpp.js/package-geotiff run build && pnpm --filter=@cpp.js/package-geos run build && pnpm --filter=@cpp.js/package-spatialite run build && pnpm --filter=@cpp.js/package-gdal run build",
"pack:clear": "zsh -c \"rm **/*.tgz\"",
"pack:list": "zsh -c \"ls -Slh **/*.tgz\"",
"pack:build": "pnpm pack:clear; node ./scripts/pack-all.mjs && pnpm pack:list"
"build:packages": "pnpm --filter=@cpp.js/package-iconv run build && pnpm --filter=@cpp.js/package-zlib run build && pnpm --filter=@cpp.js/package-expat run build && pnpm --filter=@cpp.js/package-webp run build && pnpm --filter=@cpp.js/package-tiff run build && pnpm --filter=@cpp.js/package-sqlite3 run build && pnpm --filter=@cpp.js/package-proj run build && pnpm --filter=@cpp.js/package-geotiff run build && pnpm --filter=@cpp.js/package-geos run build && pnpm --filter=@cpp.js/package-spatialite run build && pnpm --filter=@cpp.js/package-gdal run build",
"build:samples": "pnpm --filter=@cpp.js/sample-* run build",
"build:samples:lib": "pnpm --filter=@cpp.js/sample-lib-* run build",
"build:samples:lib:wasm": "pnpm --filter=@cpp.js/sample-lib-* run build:wasm",
"build:samples:lib:android": "pnpm --filter=@cpp.js/sample-lib-* run build:android",
"build:samples:lib:ios": "pnpm --filter=@cpp.js/sample-lib-* run build:ios",
"build:samples:wasm": "pnpm --filter=@cpp.js/sample-web-* run build && pnpm --filter=@cpp.js/sample-cloud-* run build && pnpm --filter=@cpp.js/sample-backend-* run build && pnpm run build:samples:lib:wasm",
"build:": "pnpm run build:packages; pnpm run build:samples;",
"clear:cache": "find packages -name \".cppjs\" -type d -maxdepth 2 -exec rm -rf {} +",
"clear:dist": "find packages -name \"*.xcframework\" -type d -maxdepth 2 -exec rm -rf {} +; find packages -name \"dist\" -type d -maxdepth 2 -exec rm -rf {} +",
"clear:pack": "find packages -name \"*.tgz\" -type d -maxdepth 2 -exec rm -rf {} +",
"clear": "pnpm run clear:cache; pnpm run clear:dist; pnpm run clear:pack",
"pack:list": "find packages -name \"*.tgz\" -type d -maxdepth 2",
"pack:build": "pnpm pack:clear; node ./scripts/pack-all.mjs && pnpm pack:list",
"ci:linux:build:package": "pnpm --filter=@cpp.js/package-zlib run build:wasm && pnpm --filter=@cpp.js/package-zlib run build:android",
"ci:linux:build": "pnpm run build:samples:lib:wasm && pnpm run build:samples:lib:android && pnpm run ci:linux:build:package",
"ci:windows:build": "pnpm run build:samples:lib:wasm && pnpm run build:samples:lib:android && pnpm run ci:linux:build:package",
"ci:ios:build:package": "pnpm --filter=@cpp.js/package-zlib run build:ios",
"ci:macos:build": "pnpm run build:samples:lib:ios && pnpm run ci:ios:build:package"
},
"devDependencies": {
"cpp.js": "workspace:^",
"cpp.js": "workspace:*",
"prettier": "^2.6.2",
"push-dir": "^0.4.1",
"eslint": "^7.32.0 || ^8.2.0",
Expand Down
3 changes: 0 additions & 3 deletions packages/cpp.js/.mocharc.yaml

This file was deleted.

1 change: 0 additions & 1 deletion packages/cpp.js/.npmignore

This file was deleted.

3 changes: 3 additions & 0 deletions packages/cpp.js/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
<a href="https://github.com/bugra9/cpp.js/blob/main/LICENSE"><img alt="License" src="https://img.shields.io/github/license/bugra9/cpp.js?style=for-the-badge" /></a>
<a href="https://github.com/bugra9/cpp.js/discussions"><img alt="Discussions" src="https://img.shields.io/github/discussions/bugra9/cpp.js?style=for-the-badge" /></a>
<a href="https://github.com/bugra9/cpp.js/issues"><img alt="Issues" src="https://img.shields.io/github/issues/bugra9/cpp.js?style=for-the-badge" /></a>
<br />
<img alt="Linux Build" src="https://img.shields.io/github/actions/workflow/status/bugra9/cpp.js/linux_build.yml?branch=main&style=for-the-badge&label=Linux%20Build">
<img alt="Macos Build" src="https://img.shields.io/github/actions/workflow/status/bugra9/cpp.js/macos_build.yml?branch=main&style=for-the-badge&label=Macos%20Build">
</div>

<h3 align="center">
Expand Down
14 changes: 9 additions & 5 deletions packages/cpp.js/package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"name": "cpp.js",
"version": "1.0.0-beta.7",
"version": "1.0.0-beta.20",
"license": "MIT",
"type": "module",
"homepage": "https://cpp.js.org",
"repository": "https://github.com/bugra9/cpp.js.git",
"description": "Bind C++ to JavaScript without extra code. Cpp.js supports WebAssembly and React Native for cross-platform compatibility.",
"type": "module",
"scripts": {
"test": "mocha"
},
Expand All @@ -15,14 +15,18 @@
},
"main": "src/index.js",
"dependencies": {
"@rollup/plugin-commonjs": "^26.0.1",
"@rollup/plugin-node-resolve": "^15.2.3",
"@rollup/plugin-commonjs": "^28.0.1",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^15.3.0",
"@rollup/plugin-virtual": "^3.0.2",
"commander": "^12.1.0",
"glob": "^8.0.3",
"rollup": "^4.18.0",
"rollup-plugin-uglify": "^6.0.4",
"upath": "^2.0.1"
"upath": "^2.0.1",
"decompress": "4.2.1",
"follow-redirects": "1.15.9",
"replace": "1.2.2"
},
"devDependencies": {
"mocha": "^10.2.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { rollup } from 'rollup';
import { nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import virtual from '@rollup/plugin-virtual';
import state from '../state/index.js';
import getData from './getData.js';

const nodeLibs = {
fs: 'export default {};',
Expand Down Expand Up @@ -34,14 +36,14 @@ const options = {
},
};

export default async function buildJS(compiler, input, type) {
const entryJS = `${compiler.config.paths.cli}/assets/${type}.js`;
const env = JSON.stringify(compiler.getData('env', null, type));
export default async function buildJS(input, type) {
const entryJS = `${state.config.paths.cli}/assets/${type}.js`;
const env = JSON.stringify(getData('env', 'Emscripten-x86_64', type));
const systemConfig = `export default {
env: ${env},
paths: {
wasm: '${compiler.config.general.name}.wasm',
data: '${compiler.config.general.name}.data.txt'
wasm: '${state.config.general.name}.wasm',
data: '${state.config.general.name}.data.txt'
}
}`;
let file = input;
Expand Down
68 changes: 68 additions & 0 deletions packages/cpp.js/src/actions/buildWasm.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import fs from 'node:fs';
import run from './run.js';
import getDependLibs from './getDependLibs.js';
import getData from './getData.js';
import buildJs from './buildJs.js';
import state from '../state/index.js';

export default async function buildWasm(type, isProd = false) {
const buildType = isProd ? 'Release' : 'Debug';
const libs = [
getDependLibs(),
`${state.config.paths.build}/Source-${buildType}/Emscripten-x86_64/lib${state.config.general.name}.a`,
`${state.config.paths.build}/Bridge-${buildType}/Emscripten-x86_64/lib${state.config.general.name}.a`,
];

if (type === 'browser') {
console.log('wasm compiling for browser...');
const t0 = performance.now();
const data = Object.entries(getData('data', 'Emscripten-x86_64', 'browser')).map(([key, value]) => ['--preload-file', `${key.replaceAll('@', '@@')}@${value}`]).flat();
run('emcc', [
'-lembind', '-Wl,--whole-archive',
...libs, ...(isProd ? ['-O3'] : []),
'-s', 'WASM=1', '-s', 'MODULARIZE=1', '-s', 'DYNAMIC_EXECUTION=0',
'-s', 'RESERVED_FUNCTION_POINTERS=200', '-s', 'DISABLE_EXCEPTION_CATCHING=0', '-s', 'FORCE_FILESYSTEM=1',
'-s', 'ALLOW_MEMORY_GROWTH=1',
'-s', 'EXPORTED_RUNTIME_METHODS=["FS", "ENV"]',
'-o', `${state.config.paths.build}/${state.config.general.name}.js`,
...data,
]);
const t1 = performance.now();
console.log('wasm compiled for browser...', Math.round(t1 - t0));
console.log('js compiling for browser...');
await buildJs(`${state.config.paths.build}/${state.config.general.name}.js`, 'browser');
const t2 = performance.now();
console.log('js compiled for browser...', Math.round(t2 - t1));
}

if (type === 'node') {
console.log('wasm compiling for node...');
run('emcc', [
'-lembind', '-Wl,--whole-archive', '-lnodefs.js',
...libs, ...(isProd ? ['-O3'] : []),
'-s', 'WASM=1', '-s', 'MODULARIZE=1', '-s', 'DYNAMIC_EXECUTION=0',
'-s', 'RESERVED_FUNCTION_POINTERS=200', '-s', 'DISABLE_EXCEPTION_CATCHING=0', '-s', 'FORCE_FILESYSTEM=1', '-s', 'NODERAWFS',
'-s', 'ALLOW_MEMORY_GROWTH=1',
'-s', 'EXPORTED_RUNTIME_METHODS=["FS", "ENV", "NODEFS"]',
'-o', `${state.config.paths.build}/${state.config.general.name}.js`,
]);
console.log('wasm compiled for node...');
console.log('js compiling for node...');
await buildJs(`${state.config.paths.build}/${state.config.general.name}.js`, 'node');
console.log('js compiled for node...');

Object.entries(getData('data', 'Emscripten-x86_64', 'node')).forEach(([key, value]) => {
if (fs.existsSync(key)) {
const dAssetPath = `${state.config.paths.build}/data/${value}`;
if (!fs.existsSync(dAssetPath)) {
fs.mkdirSync(dAssetPath, { recursive: true });
fs.cpSync(key, dAssetPath, { recursive: true });
}
}
});
}

if (fs.existsSync(`${state.config.paths.build}/${state.config.general.name}.data`)) {
fs.renameSync(`${state.config.paths.build}/${state.config.general.name}.data`, `${state.config.paths.build}/${state.config.general.name}.data.txt`);
}
}
Loading