build-binary.cjs•3.78 kB
#!/usr/bin/env node
const { execSync } = require('child_process');
const fs = require('fs');
const os = require('os');
/**
* Platform-specific binary creation using Node.js SEA
*/
const PLATFORM_CONFIGS = {
'darwin-arm64': {
output: '1mcp',
steps: [
'node -e "require(\'fs\').copyFileSync(process.execPath, \'1mcp\')"',
'codesign --remove-signature 1mcp',
'npx postject 1mcp NODE_SEA_BLOB sea-prep.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 --macho-segment-name NODE_SEA',
'codesign --sign - --entitlements entitlements.plist 1mcp',
'chmod +x 1mcp'
]
},
'darwin-x64': {
output: '1mcp',
steps: [
'node -e "require(\'fs\').copyFileSync(process.execPath, \'1mcp\')"',
'codesign --remove-signature 1mcp',
'npx postject 1mcp NODE_SEA_BLOB sea-prep.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 --macho-segment-name NODE_SEA',
'codesign --sign - --entitlements entitlements.plist 1mcp',
'chmod +x 1mcp'
]
},
'linux-x64': {
output: '1mcp',
steps: [
'node -e "require(\'fs\').copyFileSync(process.execPath, \'1mcp\')"',
'npx postject 1mcp NODE_SEA_BLOB sea-prep.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2',
'chmod +x 1mcp'
]
},
'linux-arm64': {
output: '1mcp',
steps: [
'node -e "require(\'fs\').copyFileSync(process.execPath, \'1mcp\')"',
'npx postject 1mcp NODE_SEA_BLOB sea-prep.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2',
'chmod +x 1mcp'
]
},
'win32-x64': {
output: '1mcp.exe',
steps: [
'node -e "require(\'fs\').copyFileSync(process.execPath, \'1mcp.exe\')"',
'npx postject 1mcp.exe NODE_SEA_BLOB sea-prep.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2'
]
},
'win32-arm64': {
output: '1mcp.exe',
steps: [
'node -e "require(\'fs\').copyFileSync(process.execPath, \'1mcp.exe\')"',
'npx postject 1mcp.exe NODE_SEA_BLOB sea-prep.blob --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2'
]
}
};
function detectPlatform() {
const platform = os.platform();
const arch = os.arch();
if (platform === 'darwin') {
return arch === 'x64' ? 'darwin-x64' : 'darwin-arm64';
} else if (platform === 'win32') {
return arch === 'x64' ? 'win32-x64' : 'win32-arm64';
} else if (platform === 'linux') {
return arch === 'x64' ? 'linux-x64' : 'linux-arm64';
}
throw new Error(`Unsupported platform: ${platform}-${arch}`);
}
function buildBinary(targetPlatform) {
const platform = targetPlatform || detectPlatform();
const config = PLATFORM_CONFIGS[platform];
if (!config) {
throw new Error(`Unsupported platform: ${platform}`);
}
console.log(`🔨 Building binary for ${platform}...`);
try {
// Verify SEA blob exists
if (!fs.existsSync('sea-prep.blob')) {
throw new Error('SEA blob not found. Run SEA build first.');
}
// Execute platform-specific steps
config.steps.forEach((step, index) => {
console.log(`📦 Step ${index + 1}/${config.steps.length}: ${step.split(' ')[0]}...`);
execSync(step, { stdio: 'inherit' });
});
// Verify binary was created
if (!fs.existsSync(config.output)) {
throw new Error(`Binary ${config.output} was not created`);
}
console.log(`✅ Binary created: ${config.output}`);
return config.output;
} catch (error) {
console.error(`❌ Binary build failed for ${platform}:`, error.message);
process.exit(1);
}
}
if (require.main === module) {
const targetPlatform = process.argv[2];
buildBinary(targetPlatform);
}
module.exports = { buildBinary, PLATFORM_CONFIGS };