Browse Source

Code signed package work (+3 squashed commits)
Squashed commits:
[8169905] Windows package support
[8efa836] Package needs to run after phase2
[68b8983] Working on package task

Josh Engebretson 9 years ago
parent
commit
191c9f5a2f

+ 1 - 0
Build/Scripts/Bootstrap.js

@@ -32,6 +32,7 @@ function printHelp() {
     console.log("--with-docs     : Build and install API documents into the editor (requires npm on path)");
     console.log("--with-examples : Install examples into the editor (require git on path)");
     console.log("--task=name     : Build the specified task (for development)");
+    console.log("--package       : packages the editor to Artifacts/Dist");
     console.log("--------------------------")
 
     process.exit(0);

+ 11 - 3
Build/Scripts/BuildConfig.js

@@ -20,14 +20,21 @@ function processOptions(config) {
         }
     }
 
-
     // paths
     config.atomicRoot = path.resolve(__dirname, "../..") + "/";
-    config.artifactsRoot = config.atomicRoot + "/Artifacts/";
+    config.artifactsRoot = config.atomicRoot + "Artifacts/";
 
     config.editorAppFolder = (os.platform() == "darwin") ? config.artifactsRoot + "/AtomicEditor/AtomicEditor.app/" : config.artifactsRoot + "AtomicEditor/";
     config.toolDataFolder = config.editorAppFolder + (os.platform() == "darwin" ? "Contents/Resources/ToolData/" : "Resources/ToolData/");
 
+    // jenkins, TODO: abstract anything that requires jenkins
+    config.jenkins = process.env.ATOMIC_JENKINS_BUILD == 1;
+    config.buildSHA =  process.env.ATOMIC_BUILD_SHA ? process.env.ATOMIC_BUILD_SHA : "UNKNOWN_BUILD_SHA";
+    config.devIDApp = process.env.ATOMIC_DEV_ID_APP ? process.env.ATOMIC_DEV_ID_APP : "";
+
+    config.pfxFile = process.env.ATOMIC_PFX_FILE ? process.env.ATOMIC_PFX_FILE : "";
+    config.pfxPW = process.env.ATOMIC_PFX_PW ? process.env.ATOMIC_PFX_PW : "";
+
     return config;
 }
 
@@ -39,6 +46,7 @@ exports = module.exports = processOptions(require('minimist')(process.argv.slice
         "with-android" : false,
         "with-ios" : false,
         "with-docs" : false,
-        "with-examples" : false
+        "with-examples" : false,
+        "package" : false
     }
 }));

+ 1 - 3
Build/Scripts/BuildIOS.js

@@ -4,8 +4,6 @@ var path = require("path");
 var host = require("./Host");
 var config = require("./BuildConfig");
 
-var jenkinsBuild = process.env.ATOMIC_JENKINS_BUILD == 1;
-
 var atomicRoot = config.atomicRoot;
 var buildDir = config.artifactsRoot + "Build/IOS/";
 
@@ -26,7 +24,7 @@ namespace('build', function() {
 
         cmds.push("cmake -DIOS=1 -DATOMIC_DEV_BUILD=0 -G Xcode ../../../");
 
-        if (jenkinsBuild) {
+        if (config.jenkins) {
             cmds.push("security -v list-keychains -d system -s /Users/jenkins/Library/Keychains/codesign.keychain");
             cmds.push("security -v unlock-keychain /Users/jenkins/Library/Keychains/codesign.keychain");
         }

+ 6 - 0
Build/Scripts/BuildMac.js

@@ -65,6 +65,12 @@ namespace('build', function() {
 
             copyAtomicEditor();
 
+            if (config.package) {
+
+                jake.Task['package:mac_editor'].invoke();
+
+            }
+
             complete();
 
         }, {

+ 2 - 0
Build/Scripts/BuildTasks.js

@@ -1,6 +1,8 @@
 
+var os = require('os');
 var host = require("./Host");
 var config = require("./BuildConfig");
+require("./PackageEditor");
 
 // return an object with package name keys and module name lists as values
 function installBuildTasks(rootTask) {

+ 6 - 0
Build/Scripts/BuildWindows.js

@@ -68,6 +68,12 @@ namespace('build', function() {
 
             copyAtomicEditor();
 
+            if (config.package) {
+
+                jake.Task['package:windows_editor'].invoke();
+
+            }
+
             complete();
 
         }, {

+ 100 - 0
Build/Scripts/PackageEditor.js

@@ -0,0 +1,100 @@
+var host = require("./Host");
+var config = require("./BuildConfig");
+
+namespace('package', function() {
+
+    task('windows_editor', {
+        async: true
+    }, function() {
+
+        var srcDir = config.artifactsRoot + "AtomicEditor/";
+        var dstDir = config.artifactsRoot + "Dist/";
+
+        host.cleanCreateDir(dstDir);
+
+        var installerName = "AtomicEditor_Windows64_Setup_" + config.buildSHA + ".exe";
+        var installerPath = config.artifactsRoot + "Dist/" + installerName;
+
+        var nsisDefines = "/DATOMIC_ROOT=" + config.atomicRoot;
+        nsisDefines += " /DEDITOR_VERSION=1";
+        nsisDefines += " /DINSTALLER_NAME=" + installerName;
+
+        var makeNSISCmd = config.atomicRoot + "\\Build\\Scripts\\Windows\\CreateInstaller.bat";
+        makeNSISCmd += " " + nsisDefines + " " + config.atomicRoot + "/Build/Scripts/Windows/Installer/AtomicEditor.nsi";
+        var editorExe = dstDir + "/AtomicEditor.exe";
+
+        var pfxFile = process.env.ATOMIC_PFX_FILE;
+        var pfxPW = process.env.ATOMIC_PFX_PW;
+
+        var signBaseCmd = "signtool.exe sign /f " + pfxFile;
+        signBaseCmd += " /p " + pfxPW;
+        signBaseCmd += " /t http://timestamp.verisign.com/scripts/timestamp.dll";
+        signBaseCmd += " /v ";
+
+        var signEditorCmd = signBaseCmd + config.artifactsRoot + "AtomicEditor/AtomicEditor.exe";
+        var signInstallerCmd = signBaseCmd + installerPath;
+
+        var cmds = [];
+
+        if (pfxFile && pfxPW) {
+            cmds.push(signEditorCmd);
+        }
+
+        cmds.push(makeNSISCmd);
+
+        if (pfxFile && pfxPW) {
+            cmds.push(signInstallerCmd);
+        }
+
+        jake.exec(cmds, function() {
+          complete();
+        }, {
+          printStdout: true
+        });
+
+
+    });
+
+    task('mac_editor', {
+        async: true
+    }, function() {
+
+
+        var editorAppFolder = config.editorAppFolder;
+        var srcDir = config.artifactsRoot + "AtomicEditor/";
+        var dstDir = config.artifactsRoot + "Dist/";
+        var editorZip = dstDir + "AtomicEditor_MacOSX_" +  config.buildSHA + ".zip";
+        var devIDApp = config.devIDApp;
+
+        host.cleanCreateDir(dstDir);
+
+        cmds = [];
+
+        if (config.jenkins) {
+            cmds.push("security unlock-keychain -p \"jenkins\" /Users/jenkins/Library/Keychains/login.keychain  ");
+        }
+
+        if (devIDApp) {
+            cmds.push("codesign --deep --force --verify --verbose --sign \"Developer ID Application: " + devIDApp + "\" " + editorAppFolder);
+        }
+
+        cmds.push("cd " + srcDir + " && zip -r -X " + editorZip +" ./AtomicEditor.app");
+
+        jake.exec(cmds, function() {
+
+          console.log("Packaged Mac Editor to ", editorZip);
+
+          if (!devIDApp) {
+              console.log("\nDeveloper ID Application not specified, code is not be signed!\n\n");
+          }
+
+          complete();
+
+        }, {
+          printStdout: true,
+          printStderr: true
+        });
+
+    });
+
+});

+ 1 - 0
Build/Scripts/Windows/CreateInstaller.bat

@@ -0,0 +1 @@
+"C:\Program Files (x86)\NSIS\makensis.exe" %1=%2 %3=%4 %5=%6 %7

+ 138 - 0
Build/Scripts/Windows/Installer/AtomicEditor.nsi

@@ -0,0 +1,138 @@
+;--------------------------------
+;Atomic Editor NSIS Installation Script
+;--------------------------------
+
+!ifndef ATOMIC_ROOT
+!error "ATOMIC_ROOT NOT DEFINED"
+!endif
+
+!ifndef EDITOR_VERSION
+!error "EDITOR_VERSION NOT DEFINED"
+!endif
+
+!ifndef INSTALLER_NAME
+!error "INSTALLER_NAME NOT DEFINED"
+!endif
+
+!define prodname "Atomic Editor"
+!define coname "THUNDERBEAST GAMES LLC"
+!define outfile "${ATOMIC_ROOT}\Artifacts\Dist\${INSTALLER_NAME}"
+!define appexe "AtomicEditor.exe"
+!define produrl "http://www.atomicgameengine.com/"
+
+;--------------------------------
+;Include Modern UI
+;--------------------------------
+
+!include "MUI.nsh"
+
+!define MUI_HEADERIMAGE
+!define MUI_HEADERIMAGE_RIGHT
+!define MUI_HEADERIMAGE_BITMAP "Windows_Installer_Header.bmp"
+!define MUI_WELCOMEFINISHPAGE_BITMAP "Windows_Installer_LeftImage.bmp"
+!define MUI_HEADERIMAGE_UNBITMAP "Windows_Installer_Header.bmp"
+!define MUI_HEADER_TRANSPARENT_TEXT
+
+;--------------------------------
+;General
+;--------------------------------
+
+;Name and file
+Name "${prodname}"
+OutFile "${outfile}"
+RequestExecutionLevel admin
+
+;Default installation folder
+InstallDir "$PROGRAMFILES64\${prodname}"
+
+;Get installation folder from registry if available
+InstallDirRegKey HKLM "Software\${coname}\InstallDir" "${prodname}"
+
+;--------------------------------
+;Interface Settings
+;--------------------------------
+
+!define MUI_ABORTWARNING
+
+;--------------------------------
+;Pages
+;--------------------------------
+
+!insertmacro MUI_PAGE_WELCOME
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+	; These indented statements modify settings for MUI_PAGE_FINISH
+	!define MUI_FINISHPAGE_NOAUTOCLOSE
+	!define MUI_FINISHPAGE_RUN "$INSTDIR\${appexe}"
+	!define MUI_FINISHPAGE_RUN_CHECKED
+	!define MUI_FINISHPAGE_RUN_TEXT "Launch the Atomic Editor"
+!insertmacro MUI_PAGE_FINISH
+
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+
+;--------------------------------
+;Languages
+;--------------------------------
+
+!insertmacro MUI_LANGUAGE "English"
+
+;--------------------------------
+;Installer Sections
+;--------------------------------
+
+Section "${prodname}" SecMain
+
+	SetShellVarContext all
+
+	SetOutPath "$INSTDIR"
+
+  File /r "${ATOMIC_ROOT}\Artifacts\AtomicEditor\*.*"
+
+	;Store installation folder
+	WriteRegStr HKLM "Software\${coname}\InstallDir" "${prodname}" $INSTDIR
+
+	; Create shortcut
+	CreateShortCut "$DESKTOP\${prodname}.lnk" "$INSTDIR\${appexe}"
+	CreateShortCut "$SMPROGRAMS\${prodname}.lnk" "$INSTDIR\${appexe}"
+
+	; Update Add/Remove Programs
+	DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${prodname}"
+	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${prodname}" "DisplayName" "${prodname}"
+	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${prodname}" "UninstallString" "$INSTDIR\Uninstall.exe"
+	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${prodname}" "InstallLocation" "$INSTDIR"
+	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${prodname}" "DisplayIcon" "$INSTDIR\${appexe},0"
+	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${prodname}" "Publisher" "${coname}"
+	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${prodname}" "URLInfoAbout" "${produrl}"
+	WriteRegDWord HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${prodname}" "NoRepair" 1
+	WriteRegDWord HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${prodname}" "NoModify" 1
+
+	;Create uninstaller
+	WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+SectionEnd
+
+;--------------------------------
+;Uninstaller Section
+;--------------------------------
+
+Section "Uninstall"
+
+	SetShellVarContext all
+
+	; Remove short cut
+	Delete "$SMPROGRAMS\${prodname}.lnk"
+	Delete "$DESKTOP\${prodname}.lnk"
+
+	; Remove installation folder
+  RMDir /r $INSTDIR
+
+	; Remove from Add/Remove Programs
+	DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${prodname}"
+
+	; Remove installation folder
+	DeleteRegValue HKLM "Software\${coname}\InstallDir" "${prodname}"
+	DeleteRegKey /ifempty HKLM "Software\${coname}\InstallDir"
+	DeleteRegKey /ifempty HKLM "Software\${coname}"
+
+SectionEnd

BIN
Build/Scripts/Windows/Installer/Windows_Installer_Header.bmp


BIN
Build/Scripts/Windows/Installer/Windows_Installer_LeftImage.bmp


+ 10 - 1
Source/AtomicApp/AppBase.cpp

@@ -50,7 +50,16 @@ namespace Atomic
         }
         else
         {
-            String commandline = String::Joined(arguments_, " ");
+			// Add quotes to any arguments that need them, and construct command line
+
+			Vector<String> args = arguments_;
+			for (unsigned i = 0; i < args.Size(); i++)
+			{
+				if (arguments_[i].Contains(" "))
+					args[i] = ToString("\"%s\"", arguments_[i].CString());
+			}
+
+            String commandline = String::Joined(args, " ");
 
             ParseArguments(commandline, false);
 

+ 7 - 1
Source/ToolCore/ToolEnvironment.cpp

@@ -78,8 +78,14 @@ bool ToolEnvironment::InitFromPackage()
 
     // atomicNETNuGetBinary_ = ToString("%sBuild/Managed/nuget/nuget.exe", rootSourceDir_.CString());       
 
+#ifdef ATOMIC_DEBUG
+	String config = "Debug";
+#else
+	String config = "Release";
+#endif
+
     atomicNETRootDir_ = resourcesDir + "ToolData/AtomicNET/";
-    atomicNETCoreAssemblyDir_ = atomicNETRootDir_ + "Release/";
+    atomicNETCoreAssemblyDir_ = atomicNETRootDir_ + config + "/";
 
 #ifdef ATOMIC_PLATFORM_OSX
     monoExecutableDir_ = "/Library/Frameworks/Mono.framework/Versions/Current/Commands/";