mirror of
https://github.com/leon-ai/leon.git
synced 2024-09-11 18:27:21 +03:00
139 lines
3.8 KiB
JavaScript
139 lines
3.8 KiB
JavaScript
|
import path from 'node:path'
|
||
|
import fs from 'node:fs'
|
||
|
|
||
|
import { command } from 'execa'
|
||
|
import archiver from 'archiver'
|
||
|
import prettyBytes from 'pretty-bytes'
|
||
|
|
||
|
import { LogHelper } from '@/helpers/log-helper'
|
||
|
import { LoaderHelper } from '@/helpers/loader-helper'
|
||
|
import { OSHelper, OSTypes } from '@/helpers/os-helper'
|
||
|
|
||
|
/**
|
||
|
* Build binaries for the given OS according to the given build target
|
||
|
* 1. Get the correct OS platform and CPU architecture
|
||
|
* 2. If Linux, install the required dependencies
|
||
|
* 3. Build the given build target
|
||
|
* 4. Pack the distribution entities into a ZIP file
|
||
|
*/
|
||
|
|
||
|
const BUILD_TARGETS = new Map()
|
||
|
const PYTHON_BRIDGE_SRC_PATH = 'bridges/python/src'
|
||
|
const TCP_SERVER_SRC_PATH = 'tcp_server/src'
|
||
|
|
||
|
const BINARIES_FOLDER_NAME = OSHelper.getBinariesFolderName()
|
||
|
|
||
|
BUILD_TARGETS.set('python-bridge', {
|
||
|
name: 'Python bridge',
|
||
|
pipfilePath: path.join(PYTHON_BRIDGE_SRC_PATH, 'Pipfile'),
|
||
|
setupFilePath: path.join(PYTHON_BRIDGE_SRC_PATH, 'setup.py'),
|
||
|
distPath: 'bridges/python/dist',
|
||
|
archiveName: `leon-python-bridge-${BINARIES_FOLDER_NAME}.zip`
|
||
|
})
|
||
|
BUILD_TARGETS.set('tcp-server', {
|
||
|
name: 'TCP server',
|
||
|
pipfilePath: path.join(TCP_SERVER_SRC_PATH, 'Pipfile'),
|
||
|
setupFilePath: path.join(TCP_SERVER_SRC_PATH, 'setup.py'),
|
||
|
distPath: 'tcp_server/dist',
|
||
|
archiveName: `leon-tcp-server-${BINARIES_FOLDER_NAME}.zip`
|
||
|
})
|
||
|
;(async () => {
|
||
|
LoaderHelper.start()
|
||
|
|
||
|
const { argv } = process
|
||
|
const givenBuildTarget = argv[2].toLowerCase()
|
||
|
|
||
|
if (!BUILD_TARGETS.has(givenBuildTarget)) {
|
||
|
LogHelper.error(
|
||
|
`Invalid build target: ${givenBuildTarget}. Valid targets are: ${Array.from(
|
||
|
BUILD_TARGETS.keys()
|
||
|
).join(', ')}`
|
||
|
)
|
||
|
process.exit(1)
|
||
|
}
|
||
|
|
||
|
const {
|
||
|
name: buildTarget,
|
||
|
pipfilePath,
|
||
|
setupFilePath,
|
||
|
distPath,
|
||
|
archiveName
|
||
|
} = BUILD_TARGETS.get(givenBuildTarget)
|
||
|
const buildPath = path.join(distPath, BINARIES_FOLDER_NAME)
|
||
|
|
||
|
const { type: osType } = OSHelper.getInformation()
|
||
|
|
||
|
/**
|
||
|
* Install requirements
|
||
|
*/
|
||
|
try {
|
||
|
if (osType === OSTypes.Linux) {
|
||
|
LogHelper.info('Checking whether the "patchelf" utility can be found...')
|
||
|
|
||
|
await command('patchelf --version', { shell: true })
|
||
|
|
||
|
LogHelper.success('The "patchelf" utility has been found')
|
||
|
}
|
||
|
} catch (e) {
|
||
|
const installPatchelfCommand = 'sudo apt install patchelf'
|
||
|
|
||
|
LogHelper.error(
|
||
|
`The "patchelf" utility is not installed. Please run the following command: "${installPatchelfCommand}" or install it via a packages manager supported by your Linux distribution such as DNF, YUM, etc. Then try again`
|
||
|
)
|
||
|
process.exit(1)
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Build
|
||
|
*/
|
||
|
try {
|
||
|
LogHelper.info(`Building the ${buildTarget}...`)
|
||
|
|
||
|
// Required environment variables to set up
|
||
|
process.env.PIPENV_PIPFILE = pipfilePath
|
||
|
process.env.PIPENV_VENV_IN_PROJECT = true
|
||
|
|
||
|
await command(
|
||
|
`pipenv run python ${setupFilePath} build --build-exe ${buildPath}`,
|
||
|
{
|
||
|
shell: true,
|
||
|
stdio: 'inherit'
|
||
|
}
|
||
|
)
|
||
|
|
||
|
LogHelper.success(`The ${buildTarget} has been built`)
|
||
|
} catch (e) {
|
||
|
LogHelper.error(`An error occurred while building the ${buildTarget}: ${e}`)
|
||
|
process.exit(1)
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Pack distribution entities into a ZIP archive
|
||
|
*/
|
||
|
const archivePath = path.join(distPath, archiveName)
|
||
|
LogHelper.info(`Packing to ${archivePath}...`)
|
||
|
|
||
|
const output = fs.createWriteStream(archivePath)
|
||
|
const archive = archiver('zip')
|
||
|
|
||
|
output.on('close', () => {
|
||
|
const size = prettyBytes(archive.pointer())
|
||
|
|
||
|
LogHelper.info(`Total archive size: ${size}`)
|
||
|
LogHelper.success(`${buildTarget} has been packed to ${archivePath}`)
|
||
|
process.exit(0)
|
||
|
})
|
||
|
|
||
|
archive.on('error', (err) => {
|
||
|
LogHelper.error(
|
||
|
`An error occurred while packing the ${buildTarget}: ${err}`
|
||
|
)
|
||
|
})
|
||
|
|
||
|
archive.pipe(output)
|
||
|
|
||
|
archive.directory(buildPath, BINARIES_FOLDER_NAME)
|
||
|
|
||
|
await archive.finalize()
|
||
|
})()
|