diff --git a/src/api/make.js b/src/api/make.js index 4dbe2abb6a..8033b675d2 100644 --- a/src/api/make.js +++ b/src/api/make.js @@ -8,7 +8,7 @@ import getForgeConfig from '../util/forge-config'; import runHook from '../util/hook'; import { info, warn } from '../util/messages'; import readPackageJSON from '../util/read-package-json'; -import requireSearch from '../util/require-search'; +import { requireSearchRaw } from '../util/require-search'; import resolveDir from '../util/resolve-dir'; import packager from './package'; @@ -20,7 +20,7 @@ import packager from './package'; * @property {boolean} [skipPackage=false] Whether to skip the pre-make packaging step * @property {Array} [overrideTargets] An array of make targets to override your forge config * @property {string} [arch=host architecture] The target architecture - * @property {string} [platform=process.platform] The target platform. NOTE: This is limited to be the current platform at the moment + * @property {string} [platform=process.platform] The target platform. * @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables */ @@ -53,9 +53,29 @@ export default async (providedOptions = {}) => { forgeConfig = await getForgeConfig(dir); }); - if (platform && platform !== process.platform && !(process.platform === 'darwin' && platform === 'mas')) { - throw "You cannot run 'make' for a platform other than your system's platform"; - } + const makers = {}; + const targets = overrideTargets || forgeConfig.make_targets[platform]; + + targets.forEach((target) => { + const maker = requireSearchRaw(__dirname, [ + `../makers/${platform}/${target}.js`, + `../makers/generic/${target}.js`, + `electron-forge-maker-${target}`, + target, + path.resolve(dir, target), + path.resolve(dir, 'node_modules', target), + ]); + + if (!maker) { + throw `Could not find a build target with the name: ${target} for the platform: ${platform}`; + } + + if (platform !== process.platform && (!maker.supportedPlatforms || maker.supportedPlatforms.indexOf(process.platform) === -1)) { + throw `Cannot build for ${platform} target ${target} from your ${process.platform} device`; + } + + makers[target] = maker.default; + }); if (!skipPackage) { info(interactive, 'We need to package your application before we can make it'.green); @@ -71,18 +91,12 @@ export default async (providedOptions = {}) => { } const declaredArch = arch; - const declaredPlatform = platform; - - let targets = forgeConfig.make_targets[declaredPlatform]; - if (overrideTargets) { - targets = overrideTargets; - } info(interactive, 'Making for the following targets:', `${targets.join(', ')}`.cyan); let targetArchs = [declaredArch]; if (declaredArch === 'all') { - switch (process.platform) { + switch (platform) { case 'darwin': targetArchs = ['x64']; break; @@ -103,25 +117,16 @@ export default async (providedOptions = {}) => { await runHook(forgeConfig, 'preMake'); for (const targetArch of targetArchs) { - const packageDir = path.resolve(outDir, `${appName}-${declaredPlatform}-${targetArch}`); + const packageDir = path.resolve(outDir, `${appName}-${platform}-${targetArch}`); if (!(await fs.exists(packageDir))) { throw new Error(`Couldn't find packaged app at: ${packageDir}`); } for (const target of targets) { + const maker = makers[target]; + // eslint-disable-next-line no-loop-func - await asyncOra(`Making for target: ${target.cyan} - On platform: ${declaredPlatform.cyan} - For arch: ${targetArch.cyan}`, async () => { - const maker = requireSearch(__dirname, [ - `../makers/${process.platform}/${target}.js`, - `../makers/generic/${target}.js`, - `electron-forge-maker-${target}`, - target, - path.resolve(dir, target), - path.resolve(dir, 'node_modules', target), - ]); - if (!maker) { - throw `Could not find a build target with the name: ${target} for the platform: ${declaredPlatform}`; - } + await asyncOra(`Making for target: ${target.cyan} - On platform: ${platform.cyan} - For arch: ${targetArch.cyan}`, async () => { try { outputs.push(await (maker.default || maker)(packageDir, appName, targetArch, forgeConfig, packageJSON)); } catch (err) {