128 lines
3.0 KiB
TypeScript
128 lines
3.0 KiB
TypeScript
#!/usr/bin/env bun
|
|
// Usage: bun scripts/build.ts [--all | --target=<name>]
|
|
// No flags: builds for current platform (dist/toes)
|
|
// --all: builds for all targets (macos-arm64, macos-x64, linux-arm64, linux-x64)
|
|
// --target=toes-macos-arm64: builds specific target
|
|
import { existsSync, mkdirSync } from 'fs'
|
|
import { join } from 'path'
|
|
|
|
const DIST_DIR = join(import.meta.dir, '..', 'dist')
|
|
const ENTRY_POINT = join(import.meta.dir, '..', 'src', 'cli', 'index.ts')
|
|
|
|
interface BuildTarget {
|
|
arch: string
|
|
name: string
|
|
os: string
|
|
}
|
|
|
|
const TARGETS: BuildTarget[] = [
|
|
{ os: 'darwin', arch: 'arm64', name: 'toes-macos-arm64' },
|
|
{ os: 'darwin', arch: 'x64', name: 'toes-macos-x64' },
|
|
{ os: 'linux', arch: 'arm64', name: 'toes-linux-arm64' },
|
|
{ os: 'linux', arch: 'x64', name: 'toes-linux-x64' },
|
|
]
|
|
|
|
// Ensure dist directory exists
|
|
if (!existsSync(DIST_DIR)) {
|
|
mkdirSync(DIST_DIR, { recursive: true })
|
|
}
|
|
|
|
// Parse command line args
|
|
const args = process.argv.slice(2)
|
|
const buildAll = args.includes('--all')
|
|
const targetArg = args.find(arg => arg.startsWith('--target='))?.split('=')[1]
|
|
|
|
async function buildTarget(target: BuildTarget) {
|
|
console.log(`Building ${target.name}...`)
|
|
|
|
const output = join(DIST_DIR, target.name)
|
|
|
|
const proc = Bun.spawn([
|
|
'bun',
|
|
'build',
|
|
ENTRY_POINT,
|
|
'--compile',
|
|
'--target',
|
|
'bun',
|
|
'--minify',
|
|
'--sourcemap=external',
|
|
'--outfile',
|
|
output,
|
|
], {
|
|
stdout: 'inherit',
|
|
stderr: 'inherit',
|
|
env: {
|
|
...process.env,
|
|
BUN_TARGET_OS: target.os,
|
|
BUN_TARGET_ARCH: target.arch,
|
|
},
|
|
})
|
|
|
|
const exitCode = await proc.exited
|
|
|
|
if (exitCode === 0) {
|
|
console.log(`✓ Built ${target.name}`)
|
|
} else {
|
|
console.error(`✗ Failed to build ${target.name}`)
|
|
process.exit(exitCode)
|
|
}
|
|
}
|
|
|
|
async function buildCurrent() {
|
|
const platform = process.platform
|
|
const arch = process.arch
|
|
|
|
console.log(`Building for current platform (${platform}-${arch})...`)
|
|
|
|
const output = join(DIST_DIR, 'toes')
|
|
|
|
const proc = Bun.spawn([
|
|
'bun',
|
|
'build',
|
|
ENTRY_POINT,
|
|
'--compile',
|
|
'--target',
|
|
'bun',
|
|
'--minify',
|
|
'--sourcemap=external',
|
|
'--outfile',
|
|
output,
|
|
], {
|
|
stdout: 'inherit',
|
|
stderr: 'inherit',
|
|
})
|
|
|
|
const exitCode = await proc.exited
|
|
|
|
if (exitCode === 0) {
|
|
console.log(`✓ Built toes at ${output}`)
|
|
console.log('\nTo install globally:')
|
|
console.log(` sudo cp ${output} /usr/local/bin/toes`)
|
|
} else {
|
|
console.error('✗ Build failed')
|
|
process.exit(exitCode)
|
|
}
|
|
}
|
|
|
|
// Main build logic
|
|
if (buildAll) {
|
|
console.log('Building for all targets...\n')
|
|
for (const target of TARGETS) {
|
|
await buildTarget(target)
|
|
}
|
|
console.log('\n✓ All builds complete')
|
|
} else if (targetArg) {
|
|
const target = TARGETS.find(t => t.name === targetArg)
|
|
if (!target) {
|
|
console.error(`Unknown target: ${targetArg}`)
|
|
console.error('Available targets:')
|
|
for (const t of TARGETS) {
|
|
console.error(` ${t.name}`)
|
|
}
|
|
process.exit(1)
|
|
}
|
|
await buildTarget(target)
|
|
} else {
|
|
await buildCurrent()
|
|
}
|