diff --git a/npm-scripts.js b/npm-scripts.js index 66ce1e5001..2e8a8ab4b5 100644 --- a/npm-scripts.js +++ b/npm-scripts.js @@ -3,7 +3,7 @@ const process = require('process'); const os = require('os'); const fs = require('fs'); -const { execSync } = require('child_process'); +const { execSync, spawnSync } = require('child_process'); const { version } = require('./package.json'); const isFreeBSD = os.platform() === 'freebsd'; @@ -227,6 +227,21 @@ function buildWorker() { console.log('npm-scripts.js [INFO] buildWorker()'); + if (isWindows) + { + if (!fs.existsSync('worker/out/msys/bin/make.exe')) + { + installMsysMake(); + } + + const msysPath = `${process.cwd()}\\worker\\out\\msys\\bin`; + + if (!process.env['PATH'].includes(msysPath)) + { + process.env['PATH'] = `${msysPath};${process.env['PATH']}`; + } + } + executeCmd(`${MAKE} -C worker`); } @@ -240,6 +255,11 @@ function cleanWorker() executeCmd(`${MAKE} clean-subprojects -C worker`); // Clean PIP/Meson/Ninja. executeCmd(`${MAKE} clean-pip -C worker`); + + if (isWindows) + { + executeCmd('rd /s /q worker\\out\\msys'); + } } function lintNode() @@ -323,3 +343,25 @@ function executeCmd(command, exitOnError = true) } } } + +function installMsysMake() +{ + console.log('npm-scripts.js [INFO] installMsysMake()'); + + let res = spawnSync('where', [ 'python3.exe' ]); + + if (res.status !== 0) + { + res = spawnSync('where', [ 'python.exe' ]); + + if (res.status !== 0) + { + // eslint-disable-next-line no-console + console.error('`npm-scripts.js [ERROR] installMsysMake() cannot find Python executable'); + + process.exit(1); + } + } + + executeCmd(`${String(res.stdout).trim()} worker\\scripts\\getmake.py`); +} diff --git a/worker/build.rs b/worker/build.rs index 1686acf30c..7d2264bfaf 100644 --- a/worker/build.rs +++ b/worker/build.rs @@ -77,7 +77,40 @@ fn main() { } #[cfg(target_os = "windows")] { - // Nothing special is needed so far + if !std::path::Path::new("worker/out/msys/bin/make.exe").exists() { + let python = if Command::new("where") + .arg("python3.exe") + .status() + .expect("Failed to start") + .success() + { + "python3" + } else { + "python" + }; + + if !Command::new(python) + .arg("scripts\\getmake.py") + .status() + .expect("Failed to start") + .success() + { + panic!("Failed to install MSYS/make") + } + } + + env::set_var( + "PATH", + format!( + "{}\\worker\\out\\msys\\bin;{}", + env::current_dir() + .unwrap() + .into_os_string() + .into_string() + .unwrap(), + env::var("PATH").unwrap() + ), + ); } // Build diff --git a/worker/scripts/cpu_cores.sh b/worker/scripts/cpu_cores.sh index e507b693d5..b5cdde81d0 100755 --- a/worker/scripts/cpu_cores.sh +++ b/worker/scripts/cpu_cores.sh @@ -6,8 +6,9 @@ OS="$(uname -s)" NUM_CORES= case "${OS}" in - Linux*|MINGW*) NUM_CORES=$(nproc);; + Linux*) NUM_CORES=$(nproc);; Darwin*|FreeBSD) NUM_CORES=$(sysctl -n hw.ncpu);; + MINGW*) NUM_CORES=$NUMBER_OF_PROCESSORS;; *) NUM_CORES=1;; esac diff --git a/worker/scripts/getmake.py b/worker/scripts/getmake.py new file mode 100644 index 0000000000..c6c0dbb9a3 --- /dev/null +++ b/worker/scripts/getmake.py @@ -0,0 +1,17 @@ +import io, hashlib, tarfile, urllib.request + +def get(url, digest): + data = urllib.request.urlopen(url).read() + assert hashlib.sha256(data).hexdigest() == digest + tar = tarfile.open(fileobj=io.BytesIO(data)) + tar.extractall('worker/out/msys') + tar.close() + +get('https://sourceforge.net/projects/mingw/files/MSYS/Base/msys-core/msys-1.0.19-1/msysCORE-1.0.19-1-msys-1.0.19-bin.tar.xz/download', '8c4157d739a460f85563bc4451e9f1bbd42b13c4f63770d43b9f45a781f07858') +get('https://sourceforge.net/projects/mingw/files/MSYS/Base/libiconv/libiconv-1.14-1/libiconv-1.14-1-msys-1.0.17-dll-2.tar.lzma/download', '196921e8c232259c8e6a6852b9ee8d9ab2d29a91419f0c8dc27ba6f034231683') +get('https://sourceforge.net/projects/mingw/files/MSYS/Base/gettext/gettext-0.18.1.1-1/libintl-0.18.1.1-1-msys-1.0.17-dll-8.tar.lzma/download', '29db8c969661c511fbe2a341ab25c993c5f9c555842a75d6ddbcfa70dec16910') +get('https://sourceforge.net/projects/mingw/files/MSYS/Base/coreutils/coreutils-5.97-3/coreutils-5.97-3-msys-1.0.13-bin.tar.lzma/download', 'f8c7990416ea16a74ac336dcfe0f596bc46b8724b2d58cf8a3509414220b2366') +get('https://sourceforge.net/projects/mingw/files/MSYS/Base/regex/regex-1.20090805-2/libregex-1.20090805-2-msys-1.0.13-dll-1.tar.lzma/download', '85dd8c1e27a90675c5f867be57ba7ae2bb55dde8cd2d19f284c896be134bd3d1') +get('https://sourceforge.net/projects/mingw/files/MSYS/Base/termcap/termcap-0.20050421_1-2/libtermcap-0.20050421_1-2-msys-1.0.13-dll-0.tar.lzma/download', '62b58fe0880f0972fcc84a819265989b02439c1c5185870227bd25f870f7adb6') +get('https://sourceforge.net/projects/mingw/files/MSYS/Base/bash/bash-3.1.23-1/bash-3.1.23-1-msys-1.0.18-bin.tar.xz/download', '38da5419969ab883058a96322bb0f51434dd4e9f71de09cd4f75b96750944533') +get('https://sourceforge.net/projects/mingw/files/MSYS/Base/make/make-3.81-3/make-3.81-3-msys-1.0.13-bin.tar.lzma/download', '847f0cbbf07135801c8e67bf692d29b1821e816ad828753c997fa869a9b89988')