From 9444b8593cb6990dfe462f8e888cfef89f8f6f53 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Wed, 17 Jul 2019 18:28:53 +0200 Subject: [PATCH 01/42] Saving current progress in QtIFW for windows --- cmake/install_operations.qs | 74 +++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 4 deletions(-) diff --git a/cmake/install_operations.qs b/cmake/install_operations.qs index 6f98920ffba..bf24bfa3a0e 100644 --- a/cmake/install_operations.qs +++ b/cmake/install_operations.qs @@ -17,10 +17,76 @@ function Component() component.addOperation("Execute", "chmod", "+x", "@TargetDir@/PreProcess/EP-Launch-Lite.app/Contents/MacOS/python"); component.addOperation("Execute", "chmod", "+x", "@TargetDir@/PostProcess/EP-Compare/EP-Compare.app/Contents/MacOS/EP-Compare"); - // Not sure necessary so not doing it yet - // component.addOperation("Execute", "chmod", "-R", "a+w", "@TargetDir@"); - // component.addOperation("Execute", "chmod", "-R", "a+w", "@TargetDir@/PreProcess/IDFVersionUpdater/IDFVersionUpdater.app/Contents/MacOS/"); - // component.addOperation("Execute", "chmod", "-R", "a+w", "@TargetDir@/PreProcess/IDFVersionUpdater/"); + // Not sure necessary so not doing it yet + // component.addOperation("Execute", "chmod", "-R", "a+w", "@TargetDir@"); + // component.addOperation("Execute", "chmod", "-R", "a+w", "@TargetDir@/PreProcess/IDFVersionUpdater/IDFVersionUpdater.app/Contents/MacOS/"); + // component.addOperation("Execute", "chmod", "-R", "a+w", "@TargetDir@/PreProcess/IDFVersionUpdater/"); + + } + + // On Windows + if( kernel == "winnt" ) { + + // Create Shortcuts in the Windows Start Menu + component.addElevatedOperation("CreateShortcut", "@TargetDir@/Documentation/index.html", "@StartMenuDir@/EnergyPlus Documentation.lnk") + component.addElevatedOperation("CreateShortcut", "@TargetDir@/PostProcess/EP-Compare/EP-Compare.exe", "@StartMenuDir@/EP-Compare.lnk") + component.addElevatedOperation("CreateShortcut", "@TargetDir@/PreProcess/EPDraw/EPDrawGUI.exe", "@StartMenuDir@/EPDrawGUI.lnk") + component.addElevatedOperation("CreateShortcut", "@TargetDir@/EP-Launch.exe", "@StartMenuDir@/EP-Launch.lnk") + component.addElevatedOperation("CreateShortcut", "@TargetDir@/ExampleFiles/ExampleFiles.html", "@StartMenuDir@/Example Files Summary.lnk") + component.addElevatedOperation("CreateShortcut", "@TargetDir@/ExampleFiles/ExampleFiles-ObjectsLink.html", "@StartMenuDir@/ExampleFiles Link to Objects.lnk") + component.addElevatedOperation("CreateShortcut", "@TargetDir@/PreProcess/IDFEditor/IDFEditor.exe", "@StartMenuDir@/IDFEditor.lnk") + component.addElevatedOperation("CreateShortcut", "@TargetDir@/PreProcess/IDFVersionUpdater/IDFVersionUpdater.exe", "@StartMenuDir@/IDFVersionUpdater.lnk") + component.addElevatedOperation("CreateShortcut", "@TargetDir@/readme.html", "@StartMenuDir@/Readme Notes.lnk") + component.addElevatedOperation("CreateShortcut", "@TargetDir@/PreProcess/WeatherConverter/Weather.exe", "@StartMenuDir@/Weather Statistics and Conversions.lnk") + + + // Associate file types + // TODO: should I Add a "Associate Files" checkbox to the installer options? + // "Associate *.idf, *.imf, and *.epg files with EP-Launch" + + // Note JM: you have to quote the %1 which represents the file path, otherwise any space in the path will think there are multiple args + component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Input Data File", "text/plain", "@TargetDir@/EP-Launch.exe,1"); + component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Input Macro File", "text/plain", "@TargetDir@/EP-Launch.exe,1"); + component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Group File", "text/plain", "@TargetDir@/EP-Launch.exe,1"); + + component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@/IDFEditor.exe \"%1\"", "EnergyPlus Location and Design Day Data", "text/plain", "@TargetDir@/IDFEditor.exe,1"); + component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@/IDFEditor.exe \"%1\"", "EnergyPlus Expand Objects Input Data File", "text/plain", "@TargetDir@/IDFEditor.exe,1"); + + // Here's what stuff gets weird. We need to write stuff to the registry apparently for EP-Launch + // In the registry under KEY_CURRENT_USER\Software\VB and VBA Program Settings\EP-Launch\UpdateCheck: + // Name, Type, Data + // AutoCheck, REG_SZ, True + // CheckURL, REG_SZ, http://nrel.github.io/EnergyPlus/epupdate.htm + // LastAnchor, REG_SZ, #9.1.0-mqjdfsiojf + + // REG ADD KeyName /v ValueName, /d Data, /f = force overwrite + component.addElevatedOperation("Execute", "cmd /C REG ADD \"KEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"AutoCheck\" /d \"True\" /f", + "UNDOEXECUTE", "cmd /C REG ADD \"KEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"AutoCheck\ /f"); + + component.addElevatedOperation("Execute", "cmd /C REG ADD \"KEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"CheckURL\" /d \"http://nrel.github.io/EnergyPlus/epupdate.htm\" /f", + "UNDOEXECUTE", "cmd /C REG ADD \"KEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"CheckURL\ /f"); + + // @Version@ = CPACK_PACKAGE_VERSION + component.addElevatedOperation("Execute", "cmd /C REG ADD \"KEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"LastAnchor\" /d \"#@Version@\" /f", + "UNDOEXECUTE", "cmd /C REG ADD \"KEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"LastAnchor\ /f"); + + // And weirder still, to copy and register DLLs + var systemArray = ["MSCOMCTL.OCX", "ComDlg32.OCX", "Msvcrtd.dll", "Dforrt.dll", "Gswdll32.dll", "Gsw32.exe", "Graph32.ocx", "MSINET.OCX", "Vsflex7L.ocx", "Msflxgrd.ocx"]; + var systemTargetDir = installer.environmentVariable("WINDIR"); + if( systemInfo.currentCpuArchitecture == "x86_64") { + systemTargetDir += "/SysWOW64/"; + } else { + systemTargetDir += "/System32/"; + } + for (i = 0; i < systemArray.length; i++) { + var sourceFile = "@TargetDir@/temp/" + systemArray[i]; + var targetFile = systemTargetDir + systemArray[i]; + if (!installer.fleExists(targetFile)) { + component.addElevatedOperation("Move", sourceFile, targetFile); + } + } + // Delete this temp directory + component.addElevatedOperation("Rmdir", "@TargetDir@/temp/"); } } From bc5a652dfcac292fcf42c2f6698e1cbf19af3349 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Wed, 17 Jul 2019 23:16:56 +0200 Subject: [PATCH 02/42] Fix typos and have it install to C:\EnergyPlusV-X-Y-Z as with NSIS --- cmake/Install.cmake | 4 +++- cmake/install_operations.qs | 14 +++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 9057c9558a7..0ed521b90fc 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -267,7 +267,9 @@ if( APPLE ) install(PROGRAMS scripts/runreadvars DESTINATION "./") install(CODE "MESSAGE(\"Creating symlinks.\")" COMPONENT Symlinks) - +elseif(WIN32) + set( CPACK_PACKAGE_INSTALL_DIRECTORY "EnergyPlusV${CPACK_PACKAGE_VERSION_MAJOR}-${CPACK_PACKAGE_VERSION_MINOR}-${CPACK_PACKAGE_VERSION_PATCH}" ) + set( CPACK_IFW_TARGET_DIRECTORY "C:/${CPACK_PACKAGE_INSTALL_DIRECTORY}" ) endif() if(UNIX) diff --git a/cmake/install_operations.qs b/cmake/install_operations.qs index bf24bfa3a0e..57a4d1c1a63 100644 --- a/cmake/install_operations.qs +++ b/cmake/install_operations.qs @@ -60,15 +60,15 @@ function Component() // LastAnchor, REG_SZ, #9.1.0-mqjdfsiojf // REG ADD KeyName /v ValueName, /d Data, /f = force overwrite - component.addElevatedOperation("Execute", "cmd /C REG ADD \"KEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"AutoCheck\" /d \"True\" /f", - "UNDOEXECUTE", "cmd /C REG ADD \"KEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"AutoCheck\ /f"); + component.addElevatedOperation("Execute", "cmd /C REG ADD \"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"AutoCheck\" /d \"True\" /f", + "UNDOEXECUTE", "cmd /C REG ADD \"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"AutoCheck\ /f"); - component.addElevatedOperation("Execute", "cmd /C REG ADD \"KEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"CheckURL\" /d \"http://nrel.github.io/EnergyPlus/epupdate.htm\" /f", - "UNDOEXECUTE", "cmd /C REG ADD \"KEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"CheckURL\ /f"); + component.addElevatedOperation("Execute", "cmd /C REG ADD \"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"CheckURL\" /d \"http://nrel.github.io/EnergyPlus/epupdate.htm\" /f", + "UNDOEXECUTE", "cmd /C REG ADD \"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"CheckURL\ /f"); // @Version@ = CPACK_PACKAGE_VERSION - component.addElevatedOperation("Execute", "cmd /C REG ADD \"KEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"LastAnchor\" /d \"#@Version@\" /f", - "UNDOEXECUTE", "cmd /C REG ADD \"KEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"LastAnchor\ /f"); + component.addElevatedOperation("Execute", "cmd /C REG ADD \"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"LastAnchor\" /d \"#@Version@\" /f", + "UNDOEXECUTE", "cmd /C REG ADD \"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"LastAnchor\ /f"); // And weirder still, to copy and register DLLs var systemArray = ["MSCOMCTL.OCX", "ComDlg32.OCX", "Msvcrtd.dll", "Dforrt.dll", "Gswdll32.dll", "Gsw32.exe", "Graph32.ocx", "MSINET.OCX", "Vsflex7L.ocx", "Msflxgrd.ocx"]; @@ -81,7 +81,7 @@ function Component() for (i = 0; i < systemArray.length; i++) { var sourceFile = "@TargetDir@/temp/" + systemArray[i]; var targetFile = systemTargetDir + systemArray[i]; - if (!installer.fleExists(targetFile)) { + if (!installer.fileExists(targetFile)) { component.addElevatedOperation("Move", sourceFile, targetFile); } } From 5494043280567ba216a1a41095eda23ea46071ab Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 10:30:31 +0200 Subject: [PATCH 03/42] wip still not workin 100% --- cmake/install_operations.qs | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/cmake/install_operations.qs b/cmake/install_operations.qs index 57a4d1c1a63..0f562030045 100644 --- a/cmake/install_operations.qs +++ b/cmake/install_operations.qs @@ -60,15 +60,27 @@ function Component() // LastAnchor, REG_SZ, #9.1.0-mqjdfsiojf // REG ADD KeyName /v ValueName, /d Data, /f = force overwrite - component.addElevatedOperation("Execute", "cmd /C REG ADD \"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"AutoCheck\" /d \"True\" /f", - "UNDOEXECUTE", "cmd /C REG ADD \"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"AutoCheck\ /f"); - - component.addElevatedOperation("Execute", "cmd /C REG ADD \"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"CheckURL\" /d \"http://nrel.github.io/EnergyPlus/epupdate.htm\" /f", - "UNDOEXECUTE", "cmd /C REG ADD \"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"CheckURL\ /f"); - - // @Version@ = CPACK_PACKAGE_VERSION - component.addElevatedOperation("Execute", "cmd /C REG ADD \"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"LastAnchor\" /d \"#@Version@\" /f", - "UNDOEXECUTE", "cmd /C REG ADD \"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\" /v \"LastAnchor\ /f"); + var reg = installer.environmentVariable("SystemRoot") + "\\System32\\reg.exe"; + + var keyName = "\"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\""; + + // Note by passing arguments separately to the (reg) command in addElevatedOperation (supports up to 10 args), + // Qt will escape each argument, so do not include double quote (eg: "\"AutoCheck\"") or they'll be interpreted literally + // For some reason I can't make it work, I end up with extra quotes in there... + var valueName = "AutoCheck"; + var data = "\"True\""; + component.addElevatedOperation("Execute", reg, "ADD", [keyName, "/v", valueName, "/d", data, "/f"].join(" "), + "UNDOEXECUTE", reg, "DELETE", [keyName, "/v", valueName, "/f"].join(" ")); + + var valueName = "CheckURL"; + var data = "\"http://nrel.github.io/EnergyPlus/epupdate.htm\""; + component.addElevatedOperation("Execute", reg, ["ADD", keyName, "/v", valueName, "/d", data, "/f"].join(" "), + "UNDOEXECUTE", reg, ["DELETE", keyName, "/v", valueName, "/f"].join(" ")); + + var valueName = "LastAnchor"; + var data = "#@Version@"; + component.addElevatedOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", + "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); // And weirder still, to copy and register DLLs var systemArray = ["MSCOMCTL.OCX", "ComDlg32.OCX", "Msvcrtd.dll", "Dforrt.dll", "Gswdll32.dll", "Gsw32.exe", "Graph32.ocx", "MSINET.OCX", "Vsflex7L.ocx", "Msflxgrd.ocx"]; From 8be29d137f260fc5cc5d6b508848892bec4dd3f6 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 11:02:13 +0200 Subject: [PATCH 04/42] Configure installer a bit more, LICENSE, trying to specify icons, name in startmenu, etc --- cmake/Install.cmake | 52 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 0ed521b90fc..7ba2a92d687 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -1,6 +1,11 @@ +include(CPackIFW) + set(CPACK_PACKAGE_VENDOR "US Department of Energy" ) +set(CPACK_IFW_PACKAGE_PUBLISHER "${CPACK_PACKAGE_VENDOR}") + set(CPACK_PACKAGE_CONTACT "Edwin Lee ") -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "EnergyPlus is a whole building energy simulation program that engineers, architects, and researchers use to model both energy consumption and water use in buildings.") +set(CPACK_PACKAGE_DESCRIPTION "EnergyPlus is a whole building energy simulation program that engineers, architects, and researchers use to model both energy consumption and water use in buildings.") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "EnergyPlus is a whole building energy simulation program.") list(APPEND CMAKE_MODULE_PATH "${CMAKE_BINARY_DIR}/Modules") @@ -12,6 +17,8 @@ set(CPACK_PACKAGE_VERSION_BUILD "${CMAKE_VERSION_BUILD}" ) set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}-${CPACK_PACKAGE_VERSION_BUILD}") # Default the debian package name to include version to allow several versions to be installed concurrently instead of overwriting any existing one # set(CPACK_DEBIAN_PACKAGE_NAME "energyplus-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") + +set(CPACK_IFW_PRODUCT_URL "https://www.energyplus.net") # set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://www.energyplus.net") include(cmake/TargetArch.cmake) @@ -250,6 +257,13 @@ if( WIN32 ) INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Vsflex7L.ocx" DESTINATION "./temp/") endif() +# The group, which will be used to configure the root package +# set(CPACK_IFW_PACKAGE_GROUP "EnergyPlus") +set(CPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTH 640) +set(CPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHT 480) +set(CPACK_IFW_PACKAGE_WINDOW_ICON "${CMAKE_SOURCE_DIR}/release/ep.gif") + + if( APPLE ) set(CPACK_PACKAGE_DEFAULT_LOCATION "/Applications") set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") @@ -267,9 +281,23 @@ if( APPLE ) install(PROGRAMS scripts/runreadvars DESTINATION "./") install(CODE "MESSAGE(\"Creating symlinks.\")" COMPONENT Symlinks) + + # Custom installer icon. Has to be .icns on mac, .ico on windows, not supported on Unix + set(CPACK_IFW_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/bin/EP-Compare/Run-Mac/EP-Compare.app/Contents/Resources/EnergyPlus.icns") elseif(WIN32) - set( CPACK_PACKAGE_INSTALL_DIRECTORY "EnergyPlusV${CPACK_PACKAGE_VERSION_MAJOR}-${CPACK_PACKAGE_VERSION_MINOR}-${CPACK_PACKAGE_VERSION_PATCH}" ) - set( CPACK_IFW_TARGET_DIRECTORY "C:/${CPACK_PACKAGE_INSTALL_DIRECTORY}" ) + + # TODO: TEMP + set(CPACK_IFW_VERBOSE ON) + + # Will also set CPACK_IFW_PACKAGE_START_MENU_DIRECTORY (name of default program group in Windows start menu) + set(CPACK_IFW_PACKAGE_NAME "EnergyPlusV${CPACK_PACKAGE_VERSION_MAJOR}-${CPACK_PACKAGE_VERSION_MINOR}-${CPACK_PACKAGE_VERSION_PATCH}") + + set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_IFW_PACKAGE_NAME}" ) + set(CPACK_IFW_TARGET_DIRECTORY "C:/${CPACK_PACKAGE_INSTALL_DIRECTORY}" ) + + # Custom installer icon. Has to be .icns on mac, .ico on windows, not supported on Unix + set(CPACK_IFW_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/release/RunEP.ico") + endif() if(UNIX) @@ -320,8 +348,8 @@ if ( BUILD_DOCS ) install(FILES "${CMAKE_BINARY_DIR}/doc-pdf/UsingEnergyPlusForCompliance.pdf" DESTINATION "./Documentation" COMPONENT Documentation) endif () -include(CPack) -include(CPackIFW) + +include(CPackComponent) #cpack_add_component(EnergyPlus #DISPLAY_NAME "EnergyPlus" @@ -361,9 +389,16 @@ cpack_add_component(Symlinks DESCRIPTION "This will symlink the executable to /usr/local/bin and copy the man page" ) +# Could add any upstream library license to this +cpack_add_component(licenses + DISPLAY_NAME "Licenses" + DESCRIPTION "License files for EnergyPlus" + REQUIRED) + # Regular stuff, like chmod +x cpack_ifw_configure_component(Unspecified SCRIPT cmake/install_operations.qs + LICENSES ) cpack_ifw_configure_component(Symlinks @@ -371,9 +406,16 @@ cpack_ifw_configure_component(Symlinks REQUIRES_ADMIN_RIGHTS ) +cpack_ifw_configure_component(licenses FORCED_INSTALLATION + LICENSES + "EnergyPlus" ${CPACK_RESOURCE_FILE_LICENSE} +) + + SET(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) INCLUDE(InstallRequiredSystemLibraries) INSTALL(FILES ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION "./" COMPONENT Libraries) +include(CPack) From ad64e758eca48d05d573879efb084df22b7567d3 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 11:08:23 +0200 Subject: [PATCH 05/42] Use copy instead of move, otherwise uninstall tries to move it back... --- cmake/install_operations.qs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmake/install_operations.qs b/cmake/install_operations.qs index 0f562030045..0c6e91ec6fb 100644 --- a/cmake/install_operations.qs +++ b/cmake/install_operations.qs @@ -94,10 +94,11 @@ function Component() var sourceFile = "@TargetDir@/temp/" + systemArray[i]; var targetFile = systemTargetDir + systemArray[i]; if (!installer.fileExists(targetFile)) { - component.addElevatedOperation("Move", sourceFile, targetFile); + component.addElevatedOperation("Copy", sourceFile, targetFile); } } - // Delete this temp directory + // Delete this temp directory: TODO use execute to avoid uninstall create + // the opposite (= Mkdir) component.addElevatedOperation("Rmdir", "@TargetDir@/temp/"); } From 9e4c8ce5335f649d24fc244f71cc7ff473fbe07d Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 11:59:58 +0200 Subject: [PATCH 06/42] Copy ep.icns, and create png and ico versions --- cmake/Install.cmake | 6 +++--- release/ep.icns | Bin 0 -> 33522 bytes release/ep.ico | Bin 0 -> 766 bytes release/ep.png | Bin 0 -> 8823 bytes release/ep_nobg.png | Bin 0 -> 20734 bytes 5 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 release/ep.icns create mode 100644 release/ep.ico create mode 100644 release/ep.png create mode 100644 release/ep_nobg.png diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 7ba2a92d687..0f23956e294 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -261,7 +261,7 @@ endif() # set(CPACK_IFW_PACKAGE_GROUP "EnergyPlus") set(CPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTH 640) set(CPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHT 480) -set(CPACK_IFW_PACKAGE_WINDOW_ICON "${CMAKE_SOURCE_DIR}/release/ep.gif") +set(CPACK_IFW_PACKAGE_WINDOW_ICON "${CMAKE_SOURCE_DIR}/release/ep_nobg.png") if( APPLE ) @@ -283,7 +283,7 @@ if( APPLE ) install(CODE "MESSAGE(\"Creating symlinks.\")" COMPONENT Symlinks) # Custom installer icon. Has to be .icns on mac, .ico on windows, not supported on Unix - set(CPACK_IFW_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/bin/EP-Compare/Run-Mac/EP-Compare.app/Contents/Resources/EnergyPlus.icns") + set(CPACK_IFW_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/release/ep.icns") elseif(WIN32) # TODO: TEMP @@ -296,7 +296,7 @@ elseif(WIN32) set(CPACK_IFW_TARGET_DIRECTORY "C:/${CPACK_PACKAGE_INSTALL_DIRECTORY}" ) # Custom installer icon. Has to be .icns on mac, .ico on windows, not supported on Unix - set(CPACK_IFW_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/release/RunEP.ico") + set(CPACK_IFW_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/release/ep.ico") endif() diff --git a/release/ep.icns b/release/ep.icns new file mode 100644 index 0000000000000000000000000000000000000000..92b933cf89ced3eda52068bf477274c4ea212ff9 GIT binary patch literal 33522 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 C(~nyK literal 0 HcmV?d00001 diff --git a/release/ep.png b/release/ep.png new file mode 100644 index 0000000000000000000000000000000000000000..5fabc9f0b2a8d8d2458ec6f09a689b213ff26582 GIT binary patch literal 8823 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 J+kNZc{{g7@xjO&= literal 0 HcmV?d00001 From 7ec13c38877ade095eba62a0d4e5b1a94b2e5091 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 13:41:34 +0200 Subject: [PATCH 07/42] Move all CPACK stuff into Install.cmake --- CMakeLists.txt | 18 +----------------- cmake/Install.cmake | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index db127bac2f2..ca5f1160027 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -243,23 +243,7 @@ if( BUILD_FORTRAN ) endif() if( BUILD_PACKAGE ) - set(CPACK_INSTALL_CMAKE_PROJECTS - "${CMAKE_BINARY_DIR};EnergyPlus;ALL;/" - ) - - if( BUILD_FORTRAN ) - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ExpandObjects/;ExpandObjects;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ReadVars/;ReadVars;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Transition/;Transition;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Basement/;Basement;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/HVAC-Diagram/;HVAC-Diagram;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ParametricPreprocessor/;ParametricPreprocessor;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Slab/;Slab;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ConvertESOMTR/;ConvertESOMTR;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/CalcSoilSurfTemp/;CalcSoilSurfTemp;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/AppGPostProcess/;AppGPostProcess;ALL;/") - endif() - + # We handle everything in a dedicated cmake file include(cmake/Install.cmake) endif() diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 0f23956e294..81e151ca4cf 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -41,6 +41,24 @@ if( WIN32 AND NOT UNIX ) endif() endif() +# Base install +set(CPACK_INSTALL_CMAKE_PROJECTS + "${CMAKE_BINARY_DIR};EnergyPlus;ALL;/" +) + +if( BUILD_FORTRAN ) + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ExpandObjects/;ExpandObjects;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ReadVars/;ReadVars;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Transition/;Transition;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Basement/;Basement;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/HVAC-Diagram/;HVAC-Diagram;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ParametricPreprocessor/;ParametricPreprocessor;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Slab/;Slab;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ConvertESOMTR/;ConvertESOMTR;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/CalcSoilSurfTemp/;CalcSoilSurfTemp;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/AppGPostProcess/;AppGPostProcess;;ALL;/") +endif() + install(FILES "${CMAKE_SOURCE_DIR}/LICENSE.txt" DESTINATION "./") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt") From 03c93ed4019104b44200d30be3b8ec84be7f577e Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 13:43:48 +0200 Subject: [PATCH 08/42] tweak license component --- cmake/Install.cmake | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 81e151ca4cf..1ccd28b59d7 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -1,3 +1,4 @@ +include(CPackComponent) include(CPackIFW) set(CPACK_PACKAGE_VENDOR "US Department of Energy" ) @@ -59,7 +60,7 @@ if( BUILD_FORTRAN ) list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/AppGPostProcess/;AppGPostProcess;;ALL;/") endif() -install(FILES "${CMAKE_SOURCE_DIR}/LICENSE.txt" DESTINATION "./") +install(FILES "${CMAKE_SOURCE_DIR}/LICENSE.txt" DESTINATION "./" COMPONENT Licenses) set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt") install( FILES "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Energy+.idd" DESTINATION ./ ) @@ -178,6 +179,8 @@ set( RULES_XLS Rules9-1-0-to-9-2-0.md ) install(FILES "${CMAKE_SOURCE_DIR}/release/Bugreprt.txt" DESTINATION "./") install(FILES "${CMAKE_SOURCE_DIR}/release/ep.gif" DESTINATION "./") install(FILES "${CMAKE_SOURCE_DIR}/release/readme.html" DESTINATION "./") +set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/release/readme.html") + install(FILES "${CMAKE_SOURCE_DIR}/bin/CurveFitTools/IceStorageCurveFitTool.xlsm" DESTINATION "PreProcess/HVACCurveFitTool/") install(FILES "${CMAKE_SOURCE_DIR}/idd/V9-1-0-Energy+.idd" DESTINATION "PreProcess/IDFVersionUpdater/") install(FILES "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Energy+.idd" DESTINATION "PreProcess/IDFVersionUpdater/" RENAME "V9-2-0-Energy+.idd" ) @@ -277,8 +280,8 @@ endif() # The group, which will be used to configure the root package # set(CPACK_IFW_PACKAGE_GROUP "EnergyPlus") -set(CPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTH 640) -set(CPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHT 480) +#set(CPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTH 640) +#set(CPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHT 480) set(CPACK_IFW_PACKAGE_WINDOW_ICON "${CMAKE_SOURCE_DIR}/release/ep_nobg.png") @@ -408,7 +411,7 @@ cpack_add_component(Symlinks ) # Could add any upstream library license to this -cpack_add_component(licenses +cpack_add_component(Licenses DISPLAY_NAME "Licenses" DESCRIPTION "License files for EnergyPlus" REQUIRED) @@ -416,7 +419,6 @@ cpack_add_component(licenses # Regular stuff, like chmod +x cpack_ifw_configure_component(Unspecified SCRIPT cmake/install_operations.qs - LICENSES ) cpack_ifw_configure_component(Symlinks @@ -424,7 +426,7 @@ cpack_ifw_configure_component(Symlinks REQUIRES_ADMIN_RIGHTS ) -cpack_ifw_configure_component(licenses FORCED_INSTALLATION +cpack_ifw_configure_component(Licenses FORCED_INSTALLATION LICENSES "EnergyPlus" ${CPACK_RESOURCE_FILE_LICENSE} ) From 378447de85bf2d16b2a3d6e60f943cbeeaf55c5e Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 14:01:17 +0200 Subject: [PATCH 09/42] move it above. I'm missing a bunch of things right now, installer is only 60MB --- cmake/Install.cmake | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 1ccd28b59d7..dc81f872e14 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -1,3 +1,21 @@ +# Base install +set(CPACK_INSTALL_CMAKE_PROJECTS + "${CMAKE_BINARY_DIR};EnergyPlus;ALL;/" +) + +if( BUILD_FORTRAN ) + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ExpandObjects/;ExpandObjects;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ReadVars/;ReadVars;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Transition/;Transition;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Basement/;Basement;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/HVAC-Diagram/;HVAC-Diagram;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ParametricPreprocessor/;ParametricPreprocessor;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Slab/;Slab;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ConvertESOMTR/;ConvertESOMTR;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/CalcSoilSurfTemp/;CalcSoilSurfTemp;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/AppGPostProcess/;AppGPostProcess;;ALL;/") +endif() + include(CPackComponent) include(CPackIFW) @@ -42,24 +60,6 @@ if( WIN32 AND NOT UNIX ) endif() endif() -# Base install -set(CPACK_INSTALL_CMAKE_PROJECTS - "${CMAKE_BINARY_DIR};EnergyPlus;ALL;/" -) - -if( BUILD_FORTRAN ) - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ExpandObjects/;ExpandObjects;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ReadVars/;ReadVars;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Transition/;Transition;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Basement/;Basement;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/HVAC-Diagram/;HVAC-Diagram;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ParametricPreprocessor/;ParametricPreprocessor;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Slab/;Slab;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ConvertESOMTR/;ConvertESOMTR;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/CalcSoilSurfTemp/;CalcSoilSurfTemp;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/AppGPostProcess/;AppGPostProcess;;ALL;/") -endif() - install(FILES "${CMAKE_SOURCE_DIR}/LICENSE.txt" DESTINATION "./" COMPONENT Licenses) set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt") From 576618e849510ac9bf9bfb9d6a0f006fdab9f742 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 14:02:38 +0200 Subject: [PATCH 10/42] Introduced double ;; by mistake --- cmake/Install.cmake | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index dc81f872e14..6bbd7cf3fd5 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -4,16 +4,16 @@ set(CPACK_INSTALL_CMAKE_PROJECTS ) if( BUILD_FORTRAN ) - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ExpandObjects/;ExpandObjects;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ReadVars/;ReadVars;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Transition/;Transition;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Basement/;Basement;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/HVAC-Diagram/;HVAC-Diagram;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ParametricPreprocessor/;ParametricPreprocessor;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Slab/;Slab;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ConvertESOMTR/;ConvertESOMTR;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/CalcSoilSurfTemp/;CalcSoilSurfTemp;;ALL;/") - list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/AppGPostProcess/;AppGPostProcess;;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ExpandObjects/;ExpandObjects;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ReadVars/;ReadVars;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Transition/;Transition;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Basement/;Basement;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/HVAC-Diagram/;HVAC-Diagram;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ParametricPreprocessor/;ParametricPreprocessor;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/Slab/;Slab;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/ConvertESOMTR/;ConvertESOMTR;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/CalcSoilSurfTemp/;CalcSoilSurfTemp;ALL;/") + list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/AppGPostProcess/;AppGPostProcess;ALL;/") endif() include(CPackComponent) From acb2265e0cf632b27a014641af556d9fc067d156 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 15:04:46 +0200 Subject: [PATCH 11/42] Move include(CPackXXX) around, it matters A TON. Ok, back to something workable! --- cmake/Install.cmake | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 6bbd7cf3fd5..8f8b787462c 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -16,9 +16,6 @@ if( BUILD_FORTRAN ) list(APPEND CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR}/src/AppGPostProcess/;AppGPostProcess;ALL;/") endif() -include(CPackComponent) -include(CPackIFW) - set(CPACK_PACKAGE_VENDOR "US Department of Energy" ) set(CPACK_IFW_PACKAGE_PUBLISHER "${CPACK_PACKAGE_VENDOR}") @@ -369,8 +366,10 @@ if ( BUILD_DOCS ) install(FILES "${CMAKE_BINARY_DIR}/doc-pdf/UsingEnergyPlusForCompliance.pdf" DESTINATION "./Documentation" COMPONENT Documentation) endif () - -include(CPackComponent) +# Careful: the position (and what you include) matters a lot! +include(CPack) +include(CPackIFW) +# include(CPackComponent) #cpack_add_component(EnergyPlus #DISPLAY_NAME "EnergyPlus" @@ -431,11 +430,6 @@ cpack_ifw_configure_component(Licenses FORCED_INSTALLATION "EnergyPlus" ${CPACK_RESOURCE_FILE_LICENSE} ) - SET(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) - INCLUDE(InstallRequiredSystemLibraries) - INSTALL(FILES ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION "./" COMPONENT Libraries) - -include(CPack) From 3caacd91ae6c44e8fcc9129bb721010e72c1cd13 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 15:38:37 +0200 Subject: [PATCH 12/42] Commit all potential iterations of reg ADD I tried... --- cmake/install_operations.qs | 39 ++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/cmake/install_operations.qs b/cmake/install_operations.qs index 0c6e91ec6fb..757d127ed4a 100644 --- a/cmake/install_operations.qs +++ b/cmake/install_operations.qs @@ -62,23 +62,48 @@ function Component() // REG ADD KeyName /v ValueName, /d Data, /f = force overwrite var reg = installer.environmentVariable("SystemRoot") + "\\System32\\reg.exe"; - var keyName = "\"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\""; + var keyName = "HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck"; // Note by passing arguments separately to the (reg) command in addElevatedOperation (supports up to 10 args), // Qt will escape each argument, so do not include double quote (eg: "\"AutoCheck\"") or they'll be interpreted literally // For some reason I can't make it work, I end up with extra quotes in there... var valueName = "AutoCheck"; - var data = "\"True\""; - component.addElevatedOperation("Execute", reg, "ADD", [keyName, "/v", valueName, "/d", data, "/f"].join(" "), - "UNDOEXECUTE", reg, "DELETE", [keyName, "/v", valueName, "/f"].join(" ")); + var data = "True"; + // Thinks everything is a KeyName = Computer\HKEY_CURRENT_USER\Software\VB and VBA Program Settings\EP-Launch\UpdateCheck" /v AutoCheck /d "True" /f + //component.addElevatedOperation("Execute", reg, "ADD", [keyName, "/v", valueName, "/d", data, "/f"].join(" "), + // "UNDOEXECUTE", reg, "DELETE", [keyName, "/v", valueName, "/f"].join(" ")); + // fails + //var keyName = "HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck"; + + //component.addElevatedOperation("Execute", [reg, "ADD", keyName, "/v", valueName, "/d", data, "/f"].join(" "), + // "UNDOEXECUTE", [reg, "DELETE", keyName, "/v", valueName, "/f"].join(" ")); + component.addElevatedOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", + "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); var valueName = "CheckURL"; - var data = "\"http://nrel.github.io/EnergyPlus/epupdate.htm\""; - component.addElevatedOperation("Execute", reg, ["ADD", keyName, "/v", valueName, "/d", data, "/f"].join(" "), - "UNDOEXECUTE", reg, ["DELETE", keyName, "/v", valueName, "/f"].join(" ")); + var data = "http://nrel.github.io/EnergyPlus/epupdate.htm"; + // fails + //var data = "\"http://nrel.github.io/EnergyPlus/epupdate.htm\""; + //var keyName = "\"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\""; + + //component.addElevatedOperation("Execute", "cmd", "/C", [reg, "ADD", keyName, "/v", valueName, "/d", data, "/f"].join(" "), + // "UNDOEXECUTE", "cmd", "/C", [reg, "DELETE", keyName, "/v", valueName, "/f"].join(" ")); + component.addElevatedOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", + "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); + + // fails + //component.addElevatedOperation("Execute", reg, ["ADD", keyName, "/v", valueName, "/d", data, "/f"].join(" "), + // "UNDOEXECUTE", reg, ["DELETE", keyName, "/v", valueName, "/f"].join(" ")); var valueName = "LastAnchor"; var data = "#@Version@"; + + // This creates the value and data fine, but the KeyName has an extra trailing quote: + // var keyName = "\"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\""; + //component.addElevatedOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", + // "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); + + var keyName = "HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck"; component.addElevatedOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); From 6f33b65f9bd89859a2e949c83f645700acd39fb9 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 15:39:28 +0200 Subject: [PATCH 13/42] Writing to registry seems to work like this! --- cmake/install_operations.qs | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/cmake/install_operations.qs b/cmake/install_operations.qs index 757d127ed4a..adf7912918d 100644 --- a/cmake/install_operations.qs +++ b/cmake/install_operations.qs @@ -66,44 +66,18 @@ function Component() // Note by passing arguments separately to the (reg) command in addElevatedOperation (supports up to 10 args), // Qt will escape each argument, so do not include double quote (eg: "\"AutoCheck\"") or they'll be interpreted literally - // For some reason I can't make it work, I end up with extra quotes in there... var valueName = "AutoCheck"; var data = "True"; - // Thinks everything is a KeyName = Computer\HKEY_CURRENT_USER\Software\VB and VBA Program Settings\EP-Launch\UpdateCheck" /v AutoCheck /d "True" /f - //component.addElevatedOperation("Execute", reg, "ADD", [keyName, "/v", valueName, "/d", data, "/f"].join(" "), - // "UNDOEXECUTE", reg, "DELETE", [keyName, "/v", valueName, "/f"].join(" ")); - // fails - //var keyName = "HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck"; - - //component.addElevatedOperation("Execute", [reg, "ADD", keyName, "/v", valueName, "/d", data, "/f"].join(" "), - // "UNDOEXECUTE", [reg, "DELETE", keyName, "/v", valueName, "/f"].join(" ")); component.addElevatedOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); var valueName = "CheckURL"; var data = "http://nrel.github.io/EnergyPlus/epupdate.htm"; - // fails - //var data = "\"http://nrel.github.io/EnergyPlus/epupdate.htm\""; - //var keyName = "\"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\""; - - //component.addElevatedOperation("Execute", "cmd", "/C", [reg, "ADD", keyName, "/v", valueName, "/d", data, "/f"].join(" "), - // "UNDOEXECUTE", "cmd", "/C", [reg, "DELETE", keyName, "/v", valueName, "/f"].join(" ")); component.addElevatedOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); - // fails - //component.addElevatedOperation("Execute", reg, ["ADD", keyName, "/v", valueName, "/d", data, "/f"].join(" "), - // "UNDOEXECUTE", reg, ["DELETE", keyName, "/v", valueName, "/f"].join(" ")); - var valueName = "LastAnchor"; var data = "#@Version@"; - - // This creates the value and data fine, but the KeyName has an extra trailing quote: - // var keyName = "\"HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck\""; - //component.addElevatedOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", - // "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); - - var keyName = "HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch\\UpdateCheck"; component.addElevatedOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); From 8f7b9f7cbca3a6947fd566700cf3dc04a9eaed8f Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 17:16:37 +0200 Subject: [PATCH 14/42] Move install operations into own folder. Create a "Associate File Types" component for windows --- cmake/Install.cmake | 18 ++++++- .../install_mac_createsymlinks.qs} | 0 cmake/{ => qtifw}/install_operations.qs | 52 ++++++++----------- cmake/qtifw/install_registerfiletype.qs | 27 ++++++++++ 4 files changed, 66 insertions(+), 31 deletions(-) rename cmake/{create_symlinks.qs => qtifw/install_mac_createsymlinks.qs} (100%) rename cmake/{ => qtifw}/install_operations.qs (53%) create mode 100644 cmake/qtifw/install_registerfiletype.qs diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 8f8b787462c..66c372fd51e 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -298,6 +298,7 @@ if( APPLE ) install(PROGRAMS scripts/runepmacro DESTINATION "./") install(PROGRAMS scripts/runreadvars DESTINATION "./") + # You need at least one "install(..." command for it to be registered as a component install(CODE "MESSAGE(\"Creating symlinks.\")" COMPONENT Symlinks) # Custom installer icon. Has to be .icns on mac, .ico on windows, not supported on Unix @@ -316,6 +317,9 @@ elseif(WIN32) # Custom installer icon. Has to be .icns on mac, .ico on windows, not supported on Unix set(CPACK_IFW_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/release/ep.ico") + # You need at least one "install(..." command for it to be registered as a component + install(CODE "MESSAGE(\"Registering filetypes.\")" COMPONENT RegisterFileType) + endif() if(UNIX) @@ -415,13 +419,23 @@ cpack_add_component(Licenses DESCRIPTION "License files for EnergyPlus" REQUIRED) +cpack_add_component(RegisterFileType + DISPLAY_NAME "Associate with EP-Launch" + DESCRIPTION "Associate *.idf, *.imf, and *.epg files with EP-Launch" +) + # Regular stuff, like chmod +x cpack_ifw_configure_component(Unspecified - SCRIPT cmake/install_operations.qs + SCRIPT cmake/qtifw/install_operations.qs ) cpack_ifw_configure_component(Symlinks - SCRIPT cmake/create_symlinks.qs + SCRIPT cmake/qtifw/install_mac_createsymlinks.qs + REQUIRES_ADMIN_RIGHTS +) + +cpack_ifw_configure_component(RegisterFileType + SCRIPT cmake/qtifw/install_registerfiletype.qs REQUIRES_ADMIN_RIGHTS ) diff --git a/cmake/create_symlinks.qs b/cmake/qtifw/install_mac_createsymlinks.qs similarity index 100% rename from cmake/create_symlinks.qs rename to cmake/qtifw/install_mac_createsymlinks.qs diff --git a/cmake/install_operations.qs b/cmake/qtifw/install_operations.qs similarity index 53% rename from cmake/install_operations.qs rename to cmake/qtifw/install_operations.qs index adf7912918d..593a71b313f 100644 --- a/cmake/install_operations.qs +++ b/cmake/qtifw/install_operations.qs @@ -28,29 +28,19 @@ function Component() if( kernel == "winnt" ) { // Create Shortcuts in the Windows Start Menu - component.addElevatedOperation("CreateShortcut", "@TargetDir@/Documentation/index.html", "@StartMenuDir@/EnergyPlus Documentation.lnk") - component.addElevatedOperation("CreateShortcut", "@TargetDir@/PostProcess/EP-Compare/EP-Compare.exe", "@StartMenuDir@/EP-Compare.lnk") - component.addElevatedOperation("CreateShortcut", "@TargetDir@/PreProcess/EPDraw/EPDrawGUI.exe", "@StartMenuDir@/EPDrawGUI.lnk") - component.addElevatedOperation("CreateShortcut", "@TargetDir@/EP-Launch.exe", "@StartMenuDir@/EP-Launch.lnk") - component.addElevatedOperation("CreateShortcut", "@TargetDir@/ExampleFiles/ExampleFiles.html", "@StartMenuDir@/Example Files Summary.lnk") - component.addElevatedOperation("CreateShortcut", "@TargetDir@/ExampleFiles/ExampleFiles-ObjectsLink.html", "@StartMenuDir@/ExampleFiles Link to Objects.lnk") - component.addElevatedOperation("CreateShortcut", "@TargetDir@/PreProcess/IDFEditor/IDFEditor.exe", "@StartMenuDir@/IDFEditor.lnk") - component.addElevatedOperation("CreateShortcut", "@TargetDir@/PreProcess/IDFVersionUpdater/IDFVersionUpdater.exe", "@StartMenuDir@/IDFVersionUpdater.lnk") - component.addElevatedOperation("CreateShortcut", "@TargetDir@/readme.html", "@StartMenuDir@/Readme Notes.lnk") - component.addElevatedOperation("CreateShortcut", "@TargetDir@/PreProcess/WeatherConverter/Weather.exe", "@StartMenuDir@/Weather Statistics and Conversions.lnk") - - - // Associate file types - // TODO: should I Add a "Associate Files" checkbox to the installer options? - // "Associate *.idf, *.imf, and *.epg files with EP-Launch" - - // Note JM: you have to quote the %1 which represents the file path, otherwise any space in the path will think there are multiple args - component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Input Data File", "text/plain", "@TargetDir@/EP-Launch.exe,1"); - component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Input Macro File", "text/plain", "@TargetDir@/EP-Launch.exe,1"); - component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Group File", "text/plain", "@TargetDir@/EP-Launch.exe,1"); - - component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@/IDFEditor.exe \"%1\"", "EnergyPlus Location and Design Day Data", "text/plain", "@TargetDir@/IDFEditor.exe,1"); - component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@/IDFEditor.exe \"%1\"", "EnergyPlus Expand Objects Input Data File", "text/plain", "@TargetDir@/IDFEditor.exe,1"); + component.addOperation("CreateShortcut", "@TargetDir@/Documentation/index.html", "@StartMenuDir@/EnergyPlus Documentation.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/PostProcess/EP-Compare/EP-Compare.exe", "@StartMenuDir@/EP-Compare.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/EPDraw/EPDrawGUI.exe", "@StartMenuDir@/EPDrawGUI.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/EP-Launch.exe", "@StartMenuDir@/EP-Launch.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/ExampleFiles/ExampleFiles.html", "@StartMenuDir@/Example Files Summary.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/ExampleFiles/ExampleFiles-ObjectsLink.html", "@StartMenuDir@/ExampleFiles Link to Objects.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/IDFEditor/IDFEditor.exe", "@StartMenuDir@/IDFEditor.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/IDFVersionUpdater/IDFVersionUpdater.exe", "@StartMenuDir@/IDFVersionUpdater.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/readme.html", "@StartMenuDir@/Readme Notes.lnk"); + component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/WeatherConverter/Weather.exe", "@StartMenuDir@/Weather Statistics and Conversions.lnk"); + + + // Note: Associate file types is done somewhere else // Here's what stuff gets weird. We need to write stuff to the registry apparently for EP-Launch // In the registry under KEY_CURRENT_USER\Software\VB and VBA Program Settings\EP-Launch\UpdateCheck: @@ -68,19 +58,22 @@ function Component() // Qt will escape each argument, so do not include double quote (eg: "\"AutoCheck\"") or they'll be interpreted literally var valueName = "AutoCheck"; var data = "True"; - component.addElevatedOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", + component.addOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); var valueName = "CheckURL"; var data = "http://nrel.github.io/EnergyPlus/epupdate.htm"; - component.addElevatedOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", + component.addOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); var valueName = "LastAnchor"; var data = "#@Version@"; - component.addElevatedOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", + component.addOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); + // Delete the entire keyName upon uninstallation + component.addOperation("Execute", "cmd", "/C", "echo do nothing", "UNDOEXECUTE", reg, "DELETE", keyName); + // And weirder still, to copy and register DLLs var systemArray = ["MSCOMCTL.OCX", "ComDlg32.OCX", "Msvcrtd.dll", "Dforrt.dll", "Gswdll32.dll", "Gsw32.exe", "Graph32.ocx", "MSINET.OCX", "Vsflex7L.ocx", "Msflxgrd.ocx"]; var systemTargetDir = installer.environmentVariable("WINDIR"); @@ -96,9 +89,10 @@ function Component() component.addElevatedOperation("Copy", sourceFile, targetFile); } } - // Delete this temp directory: TODO use execute to avoid uninstall create - // the opposite (= Mkdir) - component.addElevatedOperation("Rmdir", "@TargetDir@/temp/"); + // Delete this temp directory: use execute to avoid uninstall create + // the opposite (= Mkdir), plus it doesn't delete an empty directory anyways and we use copy (not move) above... + // component.addElevatedOperation("Rmdir", "@TargetDir@/temp"); + component.addElevatedOperation("Execute", "cmd" , "/C", "rmdir", "/S", "@TargetDir@\\temp"); } } diff --git a/cmake/qtifw/install_registerfiletype.qs b/cmake/qtifw/install_registerfiletype.qs new file mode 100644 index 00000000000..6c8fe0db6bf --- /dev/null +++ b/cmake/qtifw/install_registerfiletype.qs @@ -0,0 +1,27 @@ +// Associate file types + +function Component() +{ + Component.prototype.createOperations = function() + { + // call default implementation + component.createOperations(); + + // ... add custom operations + + var kernel = systemInfo.kernelType; + + // On Windows + if( kernel == "winnt" ) { + + // Note JM: you have to quote the %1 which represents the file path, otherwise any space in the path will think there are multiple args + component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Input Data File", "text/plain", "@TargetDir@/EP-Launch.exe,1"); + component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Input Macro File", "text/plain", "@TargetDir@/EP-Launch.exe,1"); + component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Group File", "text/plain", "@TargetDir@/EP-Launch.exe,1"); + + component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@/IDFEditor.exe \"%1\"", "EnergyPlus Location and Design Day Data", "text/plain", "@TargetDir@/IDFEditor.exe,1"); + component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@/IDFEditor.exe \"%1\"", "EnergyPlus Expand Objects Input Data File", "text/plain", "@TargetDir@/IDFEditor.exe,1"); + + } + } +} From d930e7f6acacac031f6950d94627d0ec0de41e1c Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 17:26:08 +0200 Subject: [PATCH 15/42] Copy and register DLLs: move that into its own component (need elevation) --- cmake/Install.cmake | 16 ++++++++++++- cmake/qtifw/install_operations.qs | 23 ++----------------- cmake/qtifw/install_win_copydll.qs | 36 ++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 22 deletions(-) create mode 100644 cmake/qtifw/install_win_copydll.qs diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 66c372fd51e..883d2586f82 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -319,6 +319,8 @@ elseif(WIN32) # You need at least one "install(..." command for it to be registered as a component install(CODE "MESSAGE(\"Registering filetypes.\")" COMPONENT RegisterFileType) + install(CODE "MESSAGE(\"Copying and Registering DLLs\")" COMPONENT CopyAndRegisterSystemDLLs) + endif() @@ -424,6 +426,12 @@ cpack_add_component(RegisterFileType DESCRIPTION "Associate *.idf, *.imf, and *.epg files with EP-Launch" ) +cpack_add_component(CopyAndRegisterSystemDLLs + DISPLAY_NAME "Copy and Register DLLs" + DESCRIPTION "This will copy and register system DLLs such as Fortran if they don't already exist" + REQUIRED +) + # Regular stuff, like chmod +x cpack_ifw_configure_component(Unspecified SCRIPT cmake/qtifw/install_operations.qs @@ -439,7 +447,13 @@ cpack_ifw_configure_component(RegisterFileType REQUIRES_ADMIN_RIGHTS ) -cpack_ifw_configure_component(Licenses FORCED_INSTALLATION +cpack_ifw_configure_component(CopyAndRegisterSystemDLLs + SCRIPT cmake/qtifw/install_win_copydll.qs + REQUIRES_ADMIN_RIGHTS +) + +cpack_ifw_configure_component(Licenses + FORCED_INSTALLATION LICENSES "EnergyPlus" ${CPACK_RESOURCE_FILE_LICENSE} ) diff --git a/cmake/qtifw/install_operations.qs b/cmake/qtifw/install_operations.qs index 593a71b313f..9577944d26a 100644 --- a/cmake/qtifw/install_operations.qs +++ b/cmake/qtifw/install_operations.qs @@ -40,7 +40,7 @@ function Component() component.addOperation("CreateShortcut", "@TargetDir@/PreProcess/WeatherConverter/Weather.exe", "@StartMenuDir@/Weather Statistics and Conversions.lnk"); - // Note: Associate file types is done somewhere else + // Note: Associate file types: done separately (optional) // Here's what stuff gets weird. We need to write stuff to the registry apparently for EP-Launch // In the registry under KEY_CURRENT_USER\Software\VB and VBA Program Settings\EP-Launch\UpdateCheck: @@ -74,26 +74,7 @@ function Component() // Delete the entire keyName upon uninstallation component.addOperation("Execute", "cmd", "/C", "echo do nothing", "UNDOEXECUTE", reg, "DELETE", keyName); - // And weirder still, to copy and register DLLs - var systemArray = ["MSCOMCTL.OCX", "ComDlg32.OCX", "Msvcrtd.dll", "Dforrt.dll", "Gswdll32.dll", "Gsw32.exe", "Graph32.ocx", "MSINET.OCX", "Vsflex7L.ocx", "Msflxgrd.ocx"]; - var systemTargetDir = installer.environmentVariable("WINDIR"); - if( systemInfo.currentCpuArchitecture == "x86_64") { - systemTargetDir += "/SysWOW64/"; - } else { - systemTargetDir += "/System32/"; - } - for (i = 0; i < systemArray.length; i++) { - var sourceFile = "@TargetDir@/temp/" + systemArray[i]; - var targetFile = systemTargetDir + systemArray[i]; - if (!installer.fileExists(targetFile)) { - component.addElevatedOperation("Copy", sourceFile, targetFile); - } - } - // Delete this temp directory: use execute to avoid uninstall create - // the opposite (= Mkdir), plus it doesn't delete an empty directory anyways and we use copy (not move) above... - // component.addElevatedOperation("Rmdir", "@TargetDir@/temp"); - component.addElevatedOperation("Execute", "cmd" , "/C", "rmdir", "/S", "@TargetDir@\\temp"); - + // And weirder still, to copy and register DLLs: done separately } } } diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs new file mode 100644 index 00000000000..b46bb68db97 --- /dev/null +++ b/cmake/qtifw/install_win_copydll.qs @@ -0,0 +1,36 @@ +// Windows commands to be performed elevated: copy and register DLLs + +function Component() +{ + Component.prototype.createOperations = function() + { + // call default implementation + component.createOperations(); + + // ... add custom operations + + // On Windows + if( kernel == "winnt" ) { + + var systemArray = ["MSCOMCTL.OCX", "ComDlg32.OCX", "Msvcrtd.dll", "Dforrt.dll", "Gswdll32.dll", "Gsw32.exe", "Graph32.ocx", "MSINET.OCX", "Vsflex7L.ocx", "Msflxgrd.ocx"]; + var systemTargetDir = installer.environmentVariable("WINDIR"); + if( systemInfo.currentCpuArchitecture == "x86_64") { + systemTargetDir += "/SysWOW64/"; + } else { + systemTargetDir += "/System32/"; + } + for (i = 0; i < systemArray.length; i++) { + var sourceFile = "@TargetDir@/temp/" + systemArray[i]; + var targetFile = systemTargetDir + systemArray[i]; + if (!installer.fileExists(targetFile)) { + component.addElevatedOperation("Copy", sourceFile, targetFile); + } + } + // Delete this temp directory: use execute to avoid uninstall create + // the opposite (= Mkdir), plus it doesn't delete an empty directory anyways and we use copy (not move) above... + // component.addElevatedOperation("Rmdir", "@TargetDir@/temp"); + component.addElevatedOperation("Execute", "cmd" , "/C", "rmdir", "/S", "@TargetDir@\\temp"); + + } + } +} From ede1d2549fec3853030e4b4f536a9d02c7c89733 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 17:41:19 +0200 Subject: [PATCH 16/42] Try to also register the DLLs we copied --- cmake/qtifw/install_win_copydll.qs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs index b46bb68db97..867f5188950 100644 --- a/cmake/qtifw/install_win_copydll.qs +++ b/cmake/qtifw/install_win_copydll.qs @@ -15,15 +15,25 @@ function Component() var systemArray = ["MSCOMCTL.OCX", "ComDlg32.OCX", "Msvcrtd.dll", "Dforrt.dll", "Gswdll32.dll", "Gsw32.exe", "Graph32.ocx", "MSINET.OCX", "Vsflex7L.ocx", "Msflxgrd.ocx"]; var systemTargetDir = installer.environmentVariable("WINDIR"); if( systemInfo.currentCpuArchitecture == "x86_64") { - systemTargetDir += "/SysWOW64/"; + // This is where the 32-bit stuff is stored on 64-bit systems + // (despite the name...) + systemTargetDir += "\\SysWOW64\\"; } else { - systemTargetDir += "/System32/"; + // This is 32-bit on a 32-bit system + systemTargetDir += "\\System32\\"; } + + var regdll = systemTargetDir + "regsvr32.exe"; + for (i = 0; i < systemArray.length; i++) { - var sourceFile = "@TargetDir@/temp/" + systemArray[i]; + var sourceFile = "@TargetDir@\\temp\\" + systemArray[i]; var targetFile = systemTargetDir + systemArray[i]; if (!installer.fileExists(targetFile)) { + // Copy the DLL component.addElevatedOperation("Copy", sourceFile, targetFile); + // Register it + component.addElevatedOperation("Execute", regdll, targetFile, + "UNDOEXECUTE", regdll, "/u", targetFile); } } // Delete this temp directory: use execute to avoid uninstall create From bcc3634152d02c51ce9fdf2191784614d0409f70 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Thu, 18 Jul 2019 17:47:40 +0200 Subject: [PATCH 17/42] forgot a var initialization --- cmake/qtifw/install_win_copydll.qs | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs index 867f5188950..a7430fc6daa 100644 --- a/cmake/qtifw/install_win_copydll.qs +++ b/cmake/qtifw/install_win_copydll.qs @@ -9,6 +9,7 @@ function Component() // ... add custom operations + var kernel = systemInfo.kernelType; // On Windows if( kernel == "winnt" ) { From bf91d7fb36ec6750ba6fa12afb9b52a2f456659d Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 12:03:18 +0200 Subject: [PATCH 18/42] Forgot a nasty silent flag, which was making QtIFW hang undefinitely --- cmake/qtifw/install_operations.qs | 4 +++- cmake/qtifw/install_win_copydll.qs | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cmake/qtifw/install_operations.qs b/cmake/qtifw/install_operations.qs index 9577944d26a..23c518aa79c 100644 --- a/cmake/qtifw/install_operations.qs +++ b/cmake/qtifw/install_operations.qs @@ -56,6 +56,8 @@ function Component() // Note by passing arguments separately to the (reg) command in addElevatedOperation (supports up to 10 args), // Qt will escape each argument, so do not include double quote (eg: "\"AutoCheck\"") or they'll be interpreted literally + // Mind the "/f" flag which avoids displaying a [Yes/No] prompt that you + // can't answer and making the installer freeze var valueName = "AutoCheck"; var data = "True"; component.addOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", @@ -72,7 +74,7 @@ function Component() "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); // Delete the entire keyName upon uninstallation - component.addOperation("Execute", "cmd", "/C", "echo do nothing", "UNDOEXECUTE", reg, "DELETE", keyName); + component.addOperation("Execute", "cmd", "/C", "echo do nothing", "UNDOEXECUTE", reg, "DELETE", keyName, "/f"); // And weirder still, to copy and register DLLs: done separately } diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs index a7430fc6daa..511c2dde7a8 100644 --- a/cmake/qtifw/install_win_copydll.qs +++ b/cmake/qtifw/install_win_copydll.qs @@ -33,13 +33,16 @@ function Component() // Copy the DLL component.addElevatedOperation("Copy", sourceFile, targetFile); // Register it - component.addElevatedOperation("Execute", regdll, targetFile, - "UNDOEXECUTE", regdll, "/u", targetFile); + // Mind the "/s" flag which avoids displaying a [Yes/No] prompt + // that you can't answer and making the installer freeze + component.addElevatedOperation("Execute", regdll, "/s", targetFile, + "UNDOEXECUTE", regdll, "/u", "/s", targetFile); } } // Delete this temp directory: use execute to avoid uninstall create // the opposite (= Mkdir), plus it doesn't delete an empty directory anyways and we use copy (not move) above... // component.addElevatedOperation("Rmdir", "@TargetDir@/temp"); + // /S = silent component.addElevatedOperation("Execute", "cmd" , "/C", "rmdir", "/S", "@TargetDir@\\temp"); } From 3648be1f8018316258d88cc99c6cd31a9d55211c Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 12:16:12 +0200 Subject: [PATCH 19/42] Forgot a /Q flag (though /S was silent but no), and have install(DLL to temp) be part of the Component CopyAndRegisterDLL --- cmake/Install.cmake | 24 ++++++++++++++---------- cmake/qtifw/install_win_copydll.qs | 4 ++-- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 883d2586f82..a0697171322 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -263,16 +263,20 @@ if( WIN32 ) INSTALL(FILES "${CMAKE_SOURCE_DIR}/bin/IDFVersionUpdater/Run-Win/IDFVersionUpdater Libs/Shell.dll" DESTINATION "PreProcess/IDFVersionUpdater/IDFVersionUpdater Libs/") INSTALL(FILES "${CMAKE_SOURCE_DIR}/bin/IDFVersionUpdater/Run-Win/IDFVersionUpdater.exe" DESTINATION "PreProcess/IDFVersionUpdater/") INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/EPMacro/Windows/EPMacro.exe" DESTINATION "./") - INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/ComDlg32.OCX" DESTINATION "./temp/") - INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Dforrt.dll" DESTINATION "./temp/") - INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Graph32.ocx" DESTINATION "./temp/") - INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Gsw32.exe" DESTINATION "./temp/") - INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Gswdll32.dll" DESTINATION "./temp/") - INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/MSCOMCTL.OCX" DESTINATION "./temp/") - INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Msflxgrd.ocx" DESTINATION "./temp/") - INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/MSINET.OCX" DESTINATION "./temp/") - INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Msvcrtd.dll" DESTINATION "./temp/") - INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Vsflex7L.ocx" DESTINATION "./temp/") + + # This copies system DLLs into a temp folder. It is later used by the install script of this specific component + # to check if the dll isn't present on the target system, in which case it will copy it to the system folder (eg: C:\Windows\SysWOW64\) + # and use the regsvr32.exe to register said DLL. + INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/ComDlg32.OCX" DESTINATION "./temp/" COMPONENT CopyAndRegisterSystemDLLs) + INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Dforrt.dll" DESTINATION "./temp/" COMPONENT CopyAndRegisterSystemDLLs) + INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Graph32.ocx" DESTINATION "./temp/" COMPONENT CopyAndRegisterSystemDLLs) + INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Gsw32.exe" DESTINATION "./temp/" COMPONENT CopyAndRegisterSystemDLLs) + INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Gswdll32.dll" DESTINATION "./temp/" COMPONENT CopyAndRegisterSystemDLLs) + INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/MSCOMCTL.OCX" DESTINATION "./temp/" COMPONENT CopyAndRegisterSystemDLLs) + INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Msflxgrd.ocx" DESTINATION "./temp/" COMPONENT CopyAndRegisterSystemDLLs) + INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/MSINET.OCX" DESTINATION "./temp/" COMPONENT CopyAndRegisterSystemDLLs) + INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Msvcrtd.dll" DESTINATION "./temp/" COMPONENT CopyAndRegisterSystemDLLs) + INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/bin/System/Vsflex7L.ocx" DESTINATION "./temp/" COMPONENT CopyAndRegisterSystemDLLs) endif() # The group, which will be used to configure the root package diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs index 511c2dde7a8..07f07427558 100644 --- a/cmake/qtifw/install_win_copydll.qs +++ b/cmake/qtifw/install_win_copydll.qs @@ -42,8 +42,8 @@ function Component() // Delete this temp directory: use execute to avoid uninstall create // the opposite (= Mkdir), plus it doesn't delete an empty directory anyways and we use copy (not move) above... // component.addElevatedOperation("Rmdir", "@TargetDir@/temp"); - // /S = silent - component.addElevatedOperation("Execute", "cmd" , "/C", "rmdir", "/S", "@TargetDir@\\temp"); + // /S = recursive, /Q = quiet + component.addElevatedOperation("Execute", "cmd" , "/C", "rmdir", "/S", "/Q", "@TargetDir@\\temp"); } } From 38bc3d8541b90bb32be5e0849104690c634532e4 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 12:39:44 +0200 Subject: [PATCH 20/42] Set up a global deletion of the entire "EP-Launch" registry key instead of individual --- cmake/qtifw/install_operations.qs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/cmake/qtifw/install_operations.qs b/cmake/qtifw/install_operations.qs index 23c518aa79c..07a7aa51116 100644 --- a/cmake/qtifw/install_operations.qs +++ b/cmake/qtifw/install_operations.qs @@ -60,21 +60,19 @@ function Component() // can't answer and making the installer freeze var valueName = "AutoCheck"; var data = "True"; - component.addOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", - "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); + component.addOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f"); var valueName = "CheckURL"; var data = "http://nrel.github.io/EnergyPlus/epupdate.htm"; - component.addOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", - "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); + component.addOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f"); var valueName = "LastAnchor"; var data = "#@Version@"; - component.addOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f", - "UNDOEXECUTE", reg, "DELETE", keyName, "/v", valueName, "/f"); + component.addOperation("Execute", reg, "ADD", keyName, "/v", valueName, "/d", data, "/f"); // Delete the entire keyName upon uninstallation - component.addOperation("Execute", "cmd", "/C", "echo do nothing", "UNDOEXECUTE", reg, "DELETE", keyName, "/f"); + var keyName = "HKEY_CURRENT_USER\\Software\\VB and VBA Program Settings\\EP-Launch"; + component.addOperation("Execute", "cmd", "/C", "echo Set up uninstall operation to delete EP-Launch registry keys", "UNDOEXECUTE", reg, "DELETE", keyName, "/f"); // And weirder still, to copy and register DLLs: done separately } From 04338b582d0fb665bc92d0b448fcf7a635533931 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 14:04:04 +0200 Subject: [PATCH 21/42] Add log messages (for debug) --- cmake/qtifw/install_win_copydll.qs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs index 07f07427558..e6d8ffe9bd0 100644 --- a/cmake/qtifw/install_win_copydll.qs +++ b/cmake/qtifw/install_win_copydll.qs @@ -30,11 +30,13 @@ function Component() var sourceFile = "@TargetDir@\\temp\\" + systemArray[i]; var targetFile = systemTargetDir + systemArray[i]; if (!installer.fileExists(targetFile)) { + console.log("Copying DLL: " + targetFile); // Copy the DLL component.addElevatedOperation("Copy", sourceFile, targetFile); // Register it // Mind the "/s" flag which avoids displaying a [Yes/No] prompt // that you can't answer and making the installer freeze + console.log("Registering DLL: " + [regdll, "/s", targetFile].join(" ")); component.addElevatedOperation("Execute", regdll, "/s", targetFile, "UNDOEXECUTE", regdll, "/u", "/s", targetFile); } From 79619f4250d6e57945a8611220d4a6b3b06108f5 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 14:14:21 +0200 Subject: [PATCH 22/42] Fix autodocs generation error --- cmake/Install.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index a0697171322..0957df384b9 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -65,7 +65,8 @@ install( FILES "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Energy+.schema.epJSON" DESTINA # Some docs are generated on the fly here, create a dir for the 'built' files set( DOCS_OUT "${CMAKE_BINARY_DIR}/autodocs" ) -install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E make_directory \"${DOCS_OUT}\")") +# This is NOT an install command, we actually want it to be performed so we can generate the package, so do it at build system generation +file(MAKE_DIRECTORY ${DOCS_OUT}) # the output variables listing install(CODE "execute_process(COMMAND \"${PYTHON_EXECUTABLE}\" \"${CMAKE_SOURCE_DIR}/doc/tools/parse_output_variables.py\" \"${CMAKE_SOURCE_DIR}/src/EnergyPlus\" \"${DOCS_OUT}/SetupOutputVariables.csv\" \"${DOCS_OUT}/SetupOutputVariables.md\")") From 30b5af19daa67b6a023937deb7c4c5202bb452a4 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 14:55:35 +0200 Subject: [PATCH 23/42] Try with iconId =1 --- cmake/qtifw/install_registerfiletype.qs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/qtifw/install_registerfiletype.qs b/cmake/qtifw/install_registerfiletype.qs index 6c8fe0db6bf..e6b7f97cf8f 100644 --- a/cmake/qtifw/install_registerfiletype.qs +++ b/cmake/qtifw/install_registerfiletype.qs @@ -14,14 +14,14 @@ function Component() // On Windows if( kernel == "winnt" ) { + var iconId = 0; // Note JM: you have to quote the %1 which represents the file path, otherwise any space in the path will think there are multiple args - component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Input Data File", "text/plain", "@TargetDir@/EP-Launch.exe,1"); - component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Input Macro File", "text/plain", "@TargetDir@/EP-Launch.exe,1"); - component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Group File", "text/plain", "@TargetDir@/EP-Launch.exe,1"); - - component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@/IDFEditor.exe \"%1\"", "EnergyPlus Location and Design Day Data", "text/plain", "@TargetDir@/IDFEditor.exe,1"); - component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@/IDFEditor.exe \"%1\"", "EnergyPlus Expand Objects Input Data File", "text/plain", "@TargetDir@/IDFEditor.exe,1"); + component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Input Data File", "text/plain", "@TargetDir@/EP-Launch.exe," + iconId); + component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Input Macro File", "text/plain", "@TargetDir@/EP-Launch.exe," + iconId); + component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Group File", "text/plain", "@TargetDir@/EP-Launch.exe," + iconId); + component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@/IDFEditor.exe \"%1\"", "EnergyPlus Location and Design Day Data", "text/plain", "@TargetDir@/IDFEditor.exe," + iconId); + component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@/IDFEditor.exe \"%1\"", "EnergyPlus Expand Objects Input Data File", "text/plain", "@TargetDir@/IDFEditor.exe," + iconId); } } } From 8ae8a162319f9df0749b727458fcbb987aa083e8 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 15:17:24 +0200 Subject: [PATCH 24/42] EP-Launch considers everything as a single arg... --- cmake/qtifw/install_registerfiletype.qs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/cmake/qtifw/install_registerfiletype.qs b/cmake/qtifw/install_registerfiletype.qs index e6b7f97cf8f..6d3c84d6298 100644 --- a/cmake/qtifw/install_registerfiletype.qs +++ b/cmake/qtifw/install_registerfiletype.qs @@ -14,14 +14,19 @@ function Component() // On Windows if( kernel == "winnt" ) { - var iconId = 0; - // Note JM: you have to quote the %1 which represents the file path, otherwise any space in the path will think there are multiple args - component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Input Data File", "text/plain", "@TargetDir@/EP-Launch.exe," + iconId); - component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Input Macro File", "text/plain", "@TargetDir@/EP-Launch.exe," + iconId); - component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@/EP-Launch.exe \"%1\"", "EnergyPlus Group File", "text/plain", "@TargetDir@/EP-Launch.exe," + iconId); + var iconId = 1; + // Note JM: you normally have to quote the %1 which represents the file path, otherwise any space in the path will think there are multiple args + // That is "@TargetDir@/EP-Launch.exe \"%1\"" + // Except that EP-Launch.exe doesn't behave like most programs. + // It does its internal escaping/considers whatever is passed as a single argument. + // eg: `C:\EnergyPlusV9-2-0\EP-Launch.exe 5ZoneFPIU - Copy.idf` + // successfully loads a file named ``5ZoneFPIU - Copy.idf + component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@/EP-Launch.exe %1", "EnergyPlus Input Data File", "text/plain", "@TargetDir@/EP-Launch.exe," + iconId); + component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@/EP-Launch.exe %1", "EnergyPlus Input Macro File", "text/plain", "@TargetDir@/EP-Launch.exe," + iconId); + component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@/EP-Launch.exe %1", "EnergyPlus Group File", "text/plain", "@TargetDir@/EP-Launch.exe," + iconId); - component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@/IDFEditor.exe \"%1\"", "EnergyPlus Location and Design Day Data", "text/plain", "@TargetDir@/IDFEditor.exe," + iconId); - component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@/IDFEditor.exe \"%1\"", "EnergyPlus Expand Objects Input Data File", "text/plain", "@TargetDir@/IDFEditor.exe," + iconId); + component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@/IDFEditor.exe %1", "EnergyPlus Location and Design Day Data", "text/plain", "@TargetDir@/IDFEditor.exe," + iconId); + component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@/IDFEditor.exe %1", "EnergyPlus Expand Objects Input Data File", "text/plain", "@TargetDir@/IDFEditor.exe," + iconId); } } } From b96972f1e2c4657fc16be44b967bc859768eb2f9 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 15:19:07 +0200 Subject: [PATCH 25/42] Use systemroot instead of windir --- cmake/qtifw/install_win_copydll.qs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs index e6d8ffe9bd0..a684d9e50af 100644 --- a/cmake/qtifw/install_win_copydll.qs +++ b/cmake/qtifw/install_win_copydll.qs @@ -14,7 +14,8 @@ function Component() if( kernel == "winnt" ) { var systemArray = ["MSCOMCTL.OCX", "ComDlg32.OCX", "Msvcrtd.dll", "Dforrt.dll", "Gswdll32.dll", "Gsw32.exe", "Graph32.ocx", "MSINET.OCX", "Vsflex7L.ocx", "Msflxgrd.ocx"]; - var systemTargetDir = installer.environmentVariable("WINDIR"); + var systemTargetDir = installer.environmentVariable("SystemRoot"); + // Note: all dlls in ./bin/System are 32-bits if( systemInfo.currentCpuArchitecture == "x86_64") { // This is where the 32-bit stuff is stored on 64-bit systems // (despite the name...) From 2a116148c134930dbe0f56d41188989b64e864d8 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 15:42:43 +0200 Subject: [PATCH 26/42] Backslash escape calls to EPlaunch --- cmake/qtifw/install_registerfiletype.qs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cmake/qtifw/install_registerfiletype.qs b/cmake/qtifw/install_registerfiletype.qs index 6d3c84d6298..1d6f3f6b3ce 100644 --- a/cmake/qtifw/install_registerfiletype.qs +++ b/cmake/qtifw/install_registerfiletype.qs @@ -21,12 +21,13 @@ function Component() // It does its internal escaping/considers whatever is passed as a single argument. // eg: `C:\EnergyPlusV9-2-0\EP-Launch.exe 5ZoneFPIU - Copy.idf` // successfully loads a file named ``5ZoneFPIU - Copy.idf - component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@/EP-Launch.exe %1", "EnergyPlus Input Data File", "text/plain", "@TargetDir@/EP-Launch.exe," + iconId); - component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@/EP-Launch.exe %1", "EnergyPlus Input Macro File", "text/plain", "@TargetDir@/EP-Launch.exe," + iconId); - component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@/EP-Launch.exe %1", "EnergyPlus Group File", "text/plain", "@TargetDir@/EP-Launch.exe," + iconId); + // RegisterFileType, extension, command, description of filetype, contentType, icon + component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Input Data File", "text/plain", "@TargetDir@\\EP-Launch.exe," + iconId); + component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Input Macro File", "text/plain", "@TargetDir@\\EP-Launch.exe," + iconId); + component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Group File", "text/plain", "@TargetDir@\\EP-Launch.exe," + iconId); - component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@/IDFEditor.exe %1", "EnergyPlus Location and Design Day Data", "text/plain", "@TargetDir@/IDFEditor.exe," + iconId); - component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@/IDFEditor.exe %1", "EnergyPlus Expand Objects Input Data File", "text/plain", "@TargetDir@/IDFEditor.exe," + iconId); + component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@\\IDFEditor.exe %1", "EnergyPlus Location and Design Day Data", "text/plain", "@TargetDir@\\IDFEditor.exe," + iconId); + component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@\\IDFEditor.exe %1", "EnergyPlus Expand Objects Input Data File", "text/plain", "@TargetDir@\\IDFEditor.exe," + iconId); } } } From ce149187554961d512b7bafdd9e6976a82bcd7e9 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 15:43:05 +0200 Subject: [PATCH 27/42] Missed the fact that only OCX need to be registred via regsvr32 --- cmake/qtifw/install_win_copydll.qs | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs index a684d9e50af..166dcc4b4fb 100644 --- a/cmake/qtifw/install_win_copydll.qs +++ b/cmake/qtifw/install_win_copydll.qs @@ -13,7 +13,15 @@ function Component() // On Windows if( kernel == "winnt" ) { - var systemArray = ["MSCOMCTL.OCX", "ComDlg32.OCX", "Msvcrtd.dll", "Dforrt.dll", "Gswdll32.dll", "Gsw32.exe", "Graph32.ocx", "MSINET.OCX", "Vsflex7L.ocx", "Msflxgrd.ocx"]; + var systemArray = [ + // OCX: needs copy AND registration + "MSCOMCTL.OCX", "ComDlg32.OCX", "Graph32.ocx", + "MSINET.OCX", "Vsflex7L.ocx", "Msflxgrd.ocx", + + // DLL and exe: just copy + "Msvcrtd.dll", "Dforrt.dll", "Gswdll32.dll", "Gsw32.exe" + ]; + var systemTargetDir = installer.environmentVariable("SystemRoot"); // Note: all dlls in ./bin/System are 32-bits if( systemInfo.currentCpuArchitecture == "x86_64") { @@ -34,12 +42,17 @@ function Component() console.log("Copying DLL: " + targetFile); // Copy the DLL component.addElevatedOperation("Copy", sourceFile, targetFile); - // Register it - // Mind the "/s" flag which avoids displaying a [Yes/No] prompt - // that you can't answer and making the installer freeze - console.log("Registering DLL: " + [regdll, "/s", targetFile].join(" ")); - component.addElevatedOperation("Execute", regdll, "/s", targetFile, - "UNDOEXECUTE", regdll, "/u", "/s", targetFile); + + // Register it: Only for "OCX" + + // If it's a .ocx (case insensitive) + if (systemArray[i].toLowerCase().indexOf(".ocx") !== 1) { + // Mind the "/s" flag which avoids displaying a [Yes/No] prompt + // that you can't answer and making the installer freeze + console.log("Registering DLL: " + [regdll, "/s", targetFile].join(" ")); + component.addElevatedOperation("Execute", regdll, "/s", targetFile, + "UNDOEXECUTE", regdll, "/u", "/s", targetFile); + } } } // Delete this temp directory: use execute to avoid uninstall create From 7ac78fe792bdd0c5f2e5e4adcb38f2ed855ef5ff Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 15:51:42 +0200 Subject: [PATCH 28/42] typo in javascript, indexOf should compare to -1 --- cmake/qtifw/install_win_copydll.qs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs index 166dcc4b4fb..38c073cc3a5 100644 --- a/cmake/qtifw/install_win_copydll.qs +++ b/cmake/qtifw/install_win_copydll.qs @@ -46,7 +46,7 @@ function Component() // Register it: Only for "OCX" // If it's a .ocx (case insensitive) - if (systemArray[i].toLowerCase().indexOf(".ocx") !== 1) { + if (systemArray[i].toLowerCase().indexOf(".ocx") !== -1) { // Mind the "/s" flag which avoids displaying a [Yes/No] prompt // that you can't answer and making the installer freeze console.log("Registering DLL: " + [regdll, "/s", targetFile].join(" ")); From 462622ea10495a1c8d7bc23774acc90d80c3d36b Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 16:55:55 +0200 Subject: [PATCH 29/42] DO not hard specify the icon, default to the opening program one --- cmake/qtifw/install_registerfiletype.qs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/cmake/qtifw/install_registerfiletype.qs b/cmake/qtifw/install_registerfiletype.qs index 1d6f3f6b3ce..bba6dafa59c 100644 --- a/cmake/qtifw/install_registerfiletype.qs +++ b/cmake/qtifw/install_registerfiletype.qs @@ -14,7 +14,6 @@ function Component() // On Windows if( kernel == "winnt" ) { - var iconId = 1; // Note JM: you normally have to quote the %1 which represents the file path, otherwise any space in the path will think there are multiple args // That is "@TargetDir@/EP-Launch.exe \"%1\"" // Except that EP-Launch.exe doesn't behave like most programs. @@ -22,12 +21,15 @@ function Component() // eg: `C:\EnergyPlusV9-2-0\EP-Launch.exe 5ZoneFPIU - Copy.idf` // successfully loads a file named ``5ZoneFPIU - Copy.idf // RegisterFileType, extension, command, description of filetype, contentType, icon - component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Input Data File", "text/plain", "@TargetDir@\\EP-Launch.exe," + iconId); - component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Input Macro File", "text/plain", "@TargetDir@\\EP-Launch.exe," + iconId); - component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Group File", "text/plain", "@TargetDir@\\EP-Launch.exe," + iconId); - - component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@\\IDFEditor.exe %1", "EnergyPlus Location and Design Day Data", "text/plain", "@TargetDir@\\IDFEditor.exe," + iconId); - component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@\\IDFEditor.exe %1", "EnergyPlus Expand Objects Input Data File", "text/plain", "@TargetDir@\\IDFEditor.exe," + iconId); + // Note: Here you do **not** want to specify the specific iconID, it won't work + // eg: var iconId = 1; icon = "@TargetDir@\\EP-Launch.exe," + iconId + // EP-Launch.exe + component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Input Data File", "text/plain"); + component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Input Macro File", "text/plain"); + component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Group File", "text/plain"); + // IDFEditor.exe + component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@\\IDFEditor.exe %1", "EnergyPlus Location and Design Day Data", "text/plain"); + component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@\\IDFEditor.exe %1", "EnergyPlus Expand Objects Input Data File", "text/plain"); } } } From e761330930708fdd8c00f2e2927cca29cc48e532 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 16:56:29 +0200 Subject: [PATCH 30/42] Order matters for registering ocx: some depend on DLL that need to be copied before --- cmake/qtifw/install_win_copydll.qs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs index 38c073cc3a5..b827a9a945a 100644 --- a/cmake/qtifw/install_win_copydll.qs +++ b/cmake/qtifw/install_win_copydll.qs @@ -13,13 +13,13 @@ function Component() // On Windows if( kernel == "winnt" ) { + // OCX: needs copy AND registration + // DLL and exe: just copy + // Note: the order of ocx/dll in the array matters for registering the ocx! var systemArray = [ - // OCX: needs copy AND registration - "MSCOMCTL.OCX", "ComDlg32.OCX", "Graph32.ocx", - "MSINET.OCX", "Vsflex7L.ocx", "Msflxgrd.ocx", - - // DLL and exe: just copy - "Msvcrtd.dll", "Dforrt.dll", "Gswdll32.dll", "Gsw32.exe" + "MSCOMCTL.OCX", "ComDlg32.OCX", "Msvcrtd.dll", "Dforrt.dll", + "Gswdll32.dll", "Gsw32.exe", "Graph32.ocx", + "MSINET.OCX", "Vsflex7L.ocx", "Msflxgrd.ocx" ]; var systemTargetDir = installer.environmentVariable("SystemRoot"); From 3a46bbc772b45536fa0cb6d5e6bd32866e23a459 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 18:03:43 +0200 Subject: [PATCH 31/42] Use a two pass approach for DLLs: copy, then register. Avoid order dependency --- cmake/qtifw/install_win_copydll.qs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs index b827a9a945a..ecdba5ab999 100644 --- a/cmake/qtifw/install_win_copydll.qs +++ b/cmake/qtifw/install_win_copydll.qs @@ -16,6 +16,9 @@ function Component() // OCX: needs copy AND registration // DLL and exe: just copy // Note: the order of ocx/dll in the array matters for registering the ocx! + // To be safe and not depend on order, let's be smarter: we copy + // everything in one pass, then we register the ones that need to be in a + // second pass var systemArray = [ "MSCOMCTL.OCX", "ComDlg32.OCX", "Msvcrtd.dll", "Dforrt.dll", "Gswdll32.dll", "Gsw32.exe", "Graph32.ocx", @@ -35,6 +38,8 @@ function Component() var regdll = systemTargetDir + "regsvr32.exe"; + // Store ocx to be registered + var dllsToReg = []; for (i = 0; i < systemArray.length; i++) { var sourceFile = "@TargetDir@\\temp\\" + systemArray[i]; var targetFile = systemTargetDir + systemArray[i]; @@ -44,17 +49,22 @@ function Component() component.addElevatedOperation("Copy", sourceFile, targetFile); // Register it: Only for "OCX" - - // If it's a .ocx (case insensitive) + // If it's a .ocx (case insensitive), we save it to be registered if (systemArray[i].toLowerCase().indexOf(".ocx") !== -1) { - // Mind the "/s" flag which avoids displaying a [Yes/No] prompt - // that you can't answer and making the installer freeze - console.log("Registering DLL: " + [regdll, "/s", targetFile].join(" ")); - component.addElevatedOperation("Execute", regdll, "/s", targetFile, - "UNDOEXECUTE", regdll, "/u", "/s", targetFile); + dllsToReg.push(targetFile); } } } + + for (i = 0; i < dllsToReg.length; i++) { + targetFile = dllsToReg[i]; + // Mind the "/s" flag which avoids displaying a [Yes/No] prompt + // that you can't answer and making the installer freeze + console.log("Registering DLL: " + [regdll, "/s", targetFile].join(" ")); + component.addElevatedOperation("Execute", regdll, "/s", targetFile, + "UNDOEXECUTE", regdll, "/u", "/s", targetFile); + + } // Delete this temp directory: use execute to avoid uninstall create // the opposite (= Mkdir), plus it doesn't delete an empty directory anyways and we use copy (not move) above... // component.addElevatedOperation("Rmdir", "@TargetDir@/temp"); From 6cbc18644407f4981a44141a3a04e6902041482b Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Fri, 19 Jul 2019 18:27:44 +0200 Subject: [PATCH 32/42] Upon discussion, unregistering/deleting DLLs is NOT wanted, so removng --- cmake/qtifw/install_win_copydll.qs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs index ecdba5ab999..67a4c6b03da 100644 --- a/cmake/qtifw/install_win_copydll.qs +++ b/cmake/qtifw/install_win_copydll.qs @@ -47,7 +47,10 @@ function Component() console.log("Copying DLL: " + targetFile); // Copy the DLL component.addElevatedOperation("Copy", sourceFile, targetFile); - + // Copy without deleting on uninstall (technically the "/Y" + // (=overwrite with no prompt) isn't needed since we tested target + // didn't exist already + component.addElevatedOperation("Execute", "cmd", "/C", "copy", sourceFile, targetFile, "/Y"); // Register it: Only for "OCX" // If it's a .ocx (case insensitive), we save it to be registered if (systemArray[i].toLowerCase().indexOf(".ocx") !== -1) { @@ -61,8 +64,9 @@ function Component() // Mind the "/s" flag which avoids displaying a [Yes/No] prompt // that you can't answer and making the installer freeze console.log("Registering DLL: " + [regdll, "/s", targetFile].join(" ")); - component.addElevatedOperation("Execute", regdll, "/s", targetFile, - "UNDOEXECUTE", regdll, "/u", "/s", targetFile); + component.addElevatedOperation("Execute", regdll, "/s", targetFile); + // We do not undo + // "UNDOEXECUTE", regdll, "/u", "/s", targetFile); } // Delete this temp directory: use execute to avoid uninstall create From 30105dcda8089943cca11d5c2fad55bd0e081ba0 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Mon, 22 Jul 2019 14:57:25 +0200 Subject: [PATCH 33/42] Forgot to comment out one line to avoid deletion of copied dlls on uninstall --- cmake/qtifw/install_win_copydll.qs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmake/qtifw/install_win_copydll.qs b/cmake/qtifw/install_win_copydll.qs index 67a4c6b03da..1b36466a495 100644 --- a/cmake/qtifw/install_win_copydll.qs +++ b/cmake/qtifw/install_win_copydll.qs @@ -45,8 +45,9 @@ function Component() var targetFile = systemTargetDir + systemArray[i]; if (!installer.fileExists(targetFile)) { console.log("Copying DLL: " + targetFile); - // Copy the DLL - component.addElevatedOperation("Copy", sourceFile, targetFile); + // Copy the DLL (includes reverting on uninstall) + // component.addElevatedOperation("Copy", sourceFile, targetFile); + // Copy without deleting on uninstall (technically the "/Y" // (=overwrite with no prompt) isn't needed since we tested target // didn't exist already From 2439fc08ee3e1422778fbdd47ba62489c50710b0 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Mon, 22 Jul 2019 15:10:22 +0200 Subject: [PATCH 34/42] Remove junk left by old installer that prevents icon from showing up --- cmake/qtifw/install_registerfiletype.qs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/cmake/qtifw/install_registerfiletype.qs b/cmake/qtifw/install_registerfiletype.qs index bba6dafa59c..cf1cc8249ef 100644 --- a/cmake/qtifw/install_registerfiletype.qs +++ b/cmake/qtifw/install_registerfiletype.qs @@ -30,6 +30,27 @@ function Component() // IDFEditor.exe component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@\\IDFEditor.exe %1", "EnergyPlus Location and Design Day Data", "text/plain"); component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@\\IDFEditor.exe %1", "EnergyPlus Expand Objects Input Data File", "text/plain"); + + // We also need to remove the registry entries that the previous + // installers based on NSIS were doing, since there was no clean up back + // then and they are getting in the way of our new RegisterFileType + // (icons not showing on IDF, IMF etc) + + // The old stuff also installed things in "HKCR\.idf" etc, but I'm wary + // of touching these since they might have been set to something else + // manually like a text editor for eg + var reg = installer.environmentVariable("SystemRoot") + "\\System32\\reg.exe"; + + var keyNamesToDelete = [ + "EP-Launch.epg", "EP-Launch.idf", "EP-Launch.imf", + "IDFEditor.ddy", "IDFEditor.expidf" + ]; + + for (i = 0; i < keyNamesToDelete.length; i++) { + var keyName = "HKEY_CLASSES_ROOT\\" + keyNamesToDelete[i]; + // Delete the entry, silently (/f) + component.addOperation("Execute", reg, "DELETE", keyName, "/f"); + } } } } From 90f3f2806422e32b6b36dc16a399b986195eab72 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Mon, 22 Jul 2019 16:15:34 +0200 Subject: [PATCH 35/42] Made a mistake in path to IDFEditor.exe --- cmake/qtifw/install_registerfiletype.qs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/qtifw/install_registerfiletype.qs b/cmake/qtifw/install_registerfiletype.qs index cf1cc8249ef..b08ff1edfed 100644 --- a/cmake/qtifw/install_registerfiletype.qs +++ b/cmake/qtifw/install_registerfiletype.qs @@ -19,17 +19,17 @@ function Component() // Except that EP-Launch.exe doesn't behave like most programs. // It does its internal escaping/considers whatever is passed as a single argument. // eg: `C:\EnergyPlusV9-2-0\EP-Launch.exe 5ZoneFPIU - Copy.idf` - // successfully loads a file named ``5ZoneFPIU - Copy.idf - // RegisterFileType, extension, command, description of filetype, contentType, icon - // Note: Here you do **not** want to specify the specific iconID, it won't work - // eg: var iconId = 1; icon = "@TargetDir@\\EP-Launch.exe," + iconId + // successfully loads a file named `5ZoneFPIU - Copy.idf`` + // RegisterFileType: [extension, command, description of filetype, contentType, icon] + // Note: Here you do **not** need to specify the specific iconID, since the EP-launch icon id is actually zero, which is default + // eg: var iconId = 0; icon = "@TargetDir@\\EP-Launch.exe," + iconId // EP-Launch.exe component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Input Data File", "text/plain"); component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Input Macro File", "text/plain"); component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Group File", "text/plain"); // IDFEditor.exe - component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@\\IDFEditor.exe %1", "EnergyPlus Location and Design Day Data", "text/plain"); - component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@\\IDFEditor.exe %1", "EnergyPlus Expand Objects Input Data File", "text/plain"); + component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@\\PreProcess\\IDFEditor\\IDFEditor.exe %1", "EnergyPlus Location and Design Day Data", "text/plain"); + component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@\\PreProcess\\IDFEditor\\IDFEditor.exe %1", "EnergyPlus Expand Objects Input Data File", "text/plain"); // We also need to remove the registry entries that the previous // installers based on NSIS were doing, since there was no clean up back From 6831eeb4dd934b5327fe3ec97b48c885397466b3 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Mon, 22 Jul 2019 16:16:27 +0200 Subject: [PATCH 36/42] Ignore return code for deletion of old registry entries. --- cmake/qtifw/install_registerfiletype.qs | 44 +++++++++++++------------ 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/cmake/qtifw/install_registerfiletype.qs b/cmake/qtifw/install_registerfiletype.qs index b08ff1edfed..d6d3a8804ee 100644 --- a/cmake/qtifw/install_registerfiletype.qs +++ b/cmake/qtifw/install_registerfiletype.qs @@ -14,29 +14,12 @@ function Component() // On Windows if( kernel == "winnt" ) { - // Note JM: you normally have to quote the %1 which represents the file path, otherwise any space in the path will think there are multiple args - // That is "@TargetDir@/EP-Launch.exe \"%1\"" - // Except that EP-Launch.exe doesn't behave like most programs. - // It does its internal escaping/considers whatever is passed as a single argument. - // eg: `C:\EnergyPlusV9-2-0\EP-Launch.exe 5ZoneFPIU - Copy.idf` - // successfully loads a file named `5ZoneFPIU - Copy.idf`` - // RegisterFileType: [extension, command, description of filetype, contentType, icon] - // Note: Here you do **not** need to specify the specific iconID, since the EP-launch icon id is actually zero, which is default - // eg: var iconId = 0; icon = "@TargetDir@\\EP-Launch.exe," + iconId - // EP-Launch.exe - component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Input Data File", "text/plain"); - component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Input Macro File", "text/plain"); - component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Group File", "text/plain"); - // IDFEditor.exe - component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@\\PreProcess\\IDFEditor\\IDFEditor.exe %1", "EnergyPlus Location and Design Day Data", "text/plain"); - component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@\\PreProcess\\IDFEditor\\IDFEditor.exe %1", "EnergyPlus Expand Objects Input Data File", "text/plain"); - // We also need to remove the registry entries that the previous // installers based on NSIS were doing, since there was no clean up back // then and they are getting in the way of our new RegisterFileType // (icons not showing on IDF, IMF etc) - // The old stuff also installed things in "HKCR\.idf" etc, but I'm wary + // Note: The old stuff also installed things in "HKCR\.idf" etc, but I'm wary // of touching these since they might have been set to something else // manually like a text editor for eg var reg = installer.environmentVariable("SystemRoot") + "\\System32\\reg.exe"; @@ -48,9 +31,28 @@ function Component() for (i = 0; i < keyNamesToDelete.length; i++) { var keyName = "HKEY_CLASSES_ROOT\\" + keyNamesToDelete[i]; - // Delete the entry, silently (/f) - component.addOperation("Execute", reg, "DELETE", keyName, "/f"); + // Delete the entry, silently (/f). + // We specify the return codes to ignore the error when the key didn't exist to begin with (which returns 1) + component.addOperation("Execute", "{0,1}", reg, "DELETE", keyName, "/f"); } - } + + // Note JM: you normally have to quote the %1 which represents the file path, otherwise any space in the path will think there are multiple args + // That is "@TargetDir@/EP-Launch.exe \"%1\"" + // Except that EP-Launch.exe doesn't behave like most programs. + // It does its internal escaping/considers whatever is passed as a single argument. + // eg: `C:\EnergyPlusV9-2-0\EP-Launch.exe 5ZoneFPIU - Copy.idf` + // successfully loads a file named `5ZoneFPIU - Copy.idf`` + // RegisterFileType: [extension, command, description of filetype, contentType, icon] + // Note: Here you do **not** need to specify the specific iconID, since the EP-launch icon id is actually zero, which is default + // eg: var iconId = 0; icon = "@TargetDir@\\EP-Launch.exe," + iconId + // EP-Launch.exe + component.addElevatedOperation("RegisterFileType", "idf", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Input Data File", "text/plain"); + component.addElevatedOperation("RegisterFileType", "imf", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Input Macro File", "text/plain"); + component.addElevatedOperation("RegisterFileType", "epg", "@TargetDir@\\EP-Launch.exe %1", "EnergyPlus Group File", "text/plain"); + // IDFEditor.exe + component.addElevatedOperation("RegisterFileType", "ddy", "@TargetDir@\\PreProcess\\IDFEditor\\IDFEditor.exe %1", "EnergyPlus Location and Design Day Data", "text/plain"); + component.addElevatedOperation("RegisterFileType", "expidf", "@TargetDir@\\PreProcess\\IDFEditor\\IDFEditor.exe %1", "EnergyPlus Expand Objects Input Data File", "text/plain"); + + } // End of if winnt } } From f02633b560f02849b35b7e29fc7e36b818d15960 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Mon, 22 Jul 2019 16:17:20 +0200 Subject: [PATCH 37/42] Update description of component registerfiletype --- cmake/Install.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 0957df384b9..4bdfe26cafc 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -427,8 +427,8 @@ cpack_add_component(Licenses REQUIRED) cpack_add_component(RegisterFileType - DISPLAY_NAME "Associate with EP-Launch" - DESCRIPTION "Associate *.idf, *.imf, and *.epg files with EP-Launch" + DISPLAY_NAME "Associate with EP-Launch and IDFEditor" + DESCRIPTION "Associate *.idf, *.imf, and *.epg files with EP-Launch, *.ddy and *.expidf with IDFEditor.exe" ) cpack_add_component(CopyAndRegisterSystemDLLs From 141f23547083b853bcda9bea917327c2fa187e15 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Tue, 23 Jul 2019 15:44:47 +0200 Subject: [PATCH 38/42] Default the correct expected binary generators by platform while still allowing user changes --- cmake/Install.cmake | 77 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 4bdfe26cafc..d566e67f906 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -1,3 +1,80 @@ +# Default the Binary generators: problem is that none of the CPACK_BINARY_XXX wil show up in CMakeCache, +# which makes it less clear what will happen in terms of package generation +#if(WIN32) + #set(CPACK_GENERATOR "IFW;ZIP") +#elseif(APPLE) + #set(CPACK_GENERATOR "IFW;TGZ") +#elseif(UNIX) + #set(CPACK_GENERATOR "STGZ;TGZ") +#endif() + + + +# So instead, let's cache the default value we want for the individual options for CPACK_BINARY_ +if (UNIX) + + # Set everything to off for now + set(CPACK_BINARY_DEB OFF CACHE BOOL "Recommended OFF") + set(CPACK_BINARY_FREEBSD OFF CACHE BOOL "Recommended OFF") + set(CPACK_BINARY_RPM OFF CACHE BOOL "Recommended OFF") + set(CPACK_BINARY_TBZ2 OFF CACHE BOOL "Recommended OFF") + set(CPACK_BINARY_NSIS OFF CACHE BOOL "Recommended OFF") + + if(APPLE) + set(CPACK_BINARY_IFW ON CACHE BOOL "Enable to build IFW package, which is the recommend method") + set(CPACK_BINARY_STGZ OFF CACHE BOOL "Recommended OFF") + + # Mac Specific options to turn off + set(CPACK_BINARY_BUNDLE OFF CACHE BOOL "Recommended OFF") + set(CPACK_BINARY_DRAGNDROP OFF CACHE BOOL "Recommended OFF") + set(CPACK_BINARY_OSXX11 OFF CACHE BOOL "Recommended OFF") + set(CPACK_BINARY_PACKAGEMAKER OFF CACHE BOOL "This was the legacy method on Apple, superseeded by IFW.") + set(CPACK_BINRARY_PRODUCTBUILD OFF CACHE BOOL "Recommended OFF") + + else() + set(CPACK_BINARY_IFW OFF CACHE BOOL "This should be off") + set(CPACK_BINARY_STGZ ON CACHE BOOL "Enable to build a Linux sh installer script, which is the recommended method") # Uses STGZ currently (install .sh script CACHE BOOL) + + # Unix (non Apple CACHE BOOL) specific option to turn off + set(CPACK_BINARY_TZ OFF CACHE BOOL "Recommended OFF") + endif() + # Tar.gz for inclusion in other programs for eg + set(CPACK_BINARY_TGZ ON CACHE BOOL "Enable to build a tar.gz package, recommended for an official release") + + +elseif(WIN32) + set(CPACK_BINARY_IFW ON CACHE BOOL "Enable to build IFW package, which is the recommend method") + set(CPACK_BINARY_ZIP ON CACHE BOOL "Enable to build a ZIP package, recommended for an official release") + + # We want to force update the cache to avoid user suddenly getting build errors + set(CPACK_BINARY_NSIS OFF CACHE BOOL "This was the legacy method on Windows, superseeded by IFW" FORCE) + + set(CPACK_BINARY_7Z OFF CACHE BOOL "Recommended OFF") + set(CPACK_BINARY_NUGET OFF CACHE BOOL "Recommended OFF") + set(CPACK_BINARY_WIX OFF CACHE BOOL "Recommended OFF") +endif() + +# Turn off source generators +# Need a list, which can't be empty, but not have sensible defined value. So a list of two empty element works as +# a workaround +# list(CPACK_SOURCE_GENERATOR ";") + +# Instead use indiv CPACK_SOURCE_: all to OFF +if (UNIX) + + set(CPACK_SOURCE_RPM OFF CACHE BOOL "Recommended OFF") + set(CPACK_SOURCE_TBZ2 OFF CACHE BOOL "Recommended OFF") + set(CPACK_SOURCE_TGZ OFF CACHE BOOL "Recommended OFF") + set(CPACK_SOURCE_TXZ OFF CACHE BOOL "Recommended OFF") + set(CPACK_SOURCE_TZ OFF CACHE BOOL "Recommended OFF") + set(CPACK_SOURCE_ZIP OFF CACHE BOOL "Recommended OFF") + +elseif(WIN32) + + set(CPACK_SOURCE_7Z OFF CACHE BOOL "Recommended OFF") + set(CPACK_SOURCE_ZIP OFF CACHE BOOL "Recommended OFF") +endif() + # Base install set(CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR};EnergyPlus;ALL;/" From b8f94bd4041a56322a39c76cd2ec1a3c8bca8c40 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Tue, 23 Jul 2019 15:54:35 +0200 Subject: [PATCH 39/42] Organization of the file --- cmake/Install.cmake | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index d566e67f906..8b5d43a64ca 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -1,3 +1,8 @@ +###################################################################################################################################################### +# D E F A U L T G E N E R A T O R S # +###################################################################################################################################################### + + # Default the Binary generators: problem is that none of the CPACK_BINARY_XXX wil show up in CMakeCache, # which makes it less clear what will happen in terms of package generation #if(WIN32) @@ -54,6 +59,7 @@ elseif(WIN32) set(CPACK_BINARY_WIX OFF CACHE BOOL "Recommended OFF") endif() + # Turn off source generators # Need a list, which can't be empty, but not have sensible defined value. So a list of two empty element works as # a workaround @@ -75,6 +81,11 @@ elseif(WIN32) set(CPACK_SOURCE_ZIP OFF CACHE BOOL "Recommended OFF") endif() + +###################################################################################################################################################### +# B A S E I N S T A L L & P R O J E C T I N F O # +###################################################################################################################################################### + # Base install set(CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR};EnergyPlus;ALL;/" @@ -140,6 +151,9 @@ set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt") install( FILES "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Energy+.idd" DESTINATION ./ ) install( FILES "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Energy+.schema.epJSON" DESTINATION ./ ) + +################################################################# A U T O D O C S ################################################################## + # Some docs are generated on the fly here, create a dir for the 'built' files set( DOCS_OUT "${CMAKE_BINARY_DIR}/autodocs" ) # This is NOT an install command, we actually want it to be performed so we can generate the package, so do it at build system generation @@ -170,6 +184,10 @@ else() message(WARNING "No GITHUB_TOKEN found in environment; package won't include the change log") endif() + +################################################################# D A T A S E T S ################################################################## + + # Install files that are in the current repo INSTALL(FILES "${CMAKE_SOURCE_DIR}/datasets/AirCooledChiller.idf" DESTINATION "./DataSets" COMPONENT Datasets) INSTALL(FILES "${CMAKE_SOURCE_DIR}/datasets/ASHRAE_2005_HOF_Materials.idf" DESTINATION "./DataSets" COMPONENT Datasets) @@ -223,6 +241,9 @@ INSTALL(FILES "${CMAKE_SOURCE_DIR}/datasets/Macro/SandiaPVdata.imf" DESTINATION INSTALL(FILES "${CMAKE_SOURCE_DIR}/datasets/Macro/SolarCollectors.imf" DESTINATION "./MacroDataSets" COMPONENT Datasets) INSTALL(FILES "${CMAKE_SOURCE_DIR}/datasets/Macro/UtilityTariffObjects.imf" DESTINATION "./MacroDataSets" COMPONENT Datasets) + +############################################################# W E A T H E R D A T A ############################################################# + # weather files INSTALL(FILES "${CMAKE_SOURCE_DIR}/weather/USA_CA_San.Francisco.Intl.AP.724940_TMY3.ddy" DESTINATION "./WeatherData" COMPONENT WeatherData) INSTALL(FILES "${CMAKE_SOURCE_DIR}/weather/USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw" DESTINATION "./WeatherData" COMPONENT WeatherData) @@ -240,6 +261,9 @@ INSTALL(FILES "${CMAKE_SOURCE_DIR}/weather/USA_VA_Sterling-Washington.Dulles.Int INSTALL(FILES "${CMAKE_SOURCE_DIR}/weather/USA_VA_Sterling-Washington.Dulles.Intl.AP.724030_TMY3.epw" DESTINATION "./WeatherData" COMPONENT WeatherData) INSTALL(FILES "${CMAKE_SOURCE_DIR}/weather/USA_VA_Sterling-Washington.Dulles.Intl.AP.724030_TMY3.stat" DESTINATION "./WeatherData" COMPONENT WeatherData) + +############################################################# E X A M P L E F I L E S ######################################################### + INSTALL( DIRECTORY testfiles/ DESTINATION ExampleFiles/ COMPONENT ExampleFiles PATTERN _* EXCLUDE @@ -248,6 +272,9 @@ INSTALL( DIRECTORY testfiles/ DESTINATION ExampleFiles/ PATTERN performance EXCLUDE ) + +############################################################# M I S C E L L A N E O U S ########################################################## + # TODO Remove version from file name or generate # These files names are stored in variables because they also appear as start menu shortcuts later. set( RULES_XLS Rules9-1-0-to-9-2-0.md ) @@ -268,6 +295,11 @@ install(FILES "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/workflows/coeff_conv.py" DESTIN install(FILES "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/workflows/energyplus.py" DESTINATION "workflows/") # COMPONENT Workflows) install(FILES "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/workflows/transition.py" DESTINATION "workflows/") # COMPONENT Workflows) + +###################################################################################################################################################### +# P L A T F O R M S P E C I F I C # +###################################################################################################################################################### + if( WIN32 ) # calcsoilsurftemp is now built from source, just need to install the batch run script INSTALL(FILES "${CMAKE_SOURCE_DIR}/src/CalcSoilSurfTemp/RunCalcSoilSurfTemp.bat" DESTINATION "PreProcess/CalcSoilSurfTemp/") @@ -433,10 +465,13 @@ if( UNIX AND NOT APPLE ) install(PROGRAMS scripts/runreadvars DESTINATION "./") endif() +# TODO: Unused now configure_file("${CMAKE_SOURCE_DIR}/cmake/CMakeCPackOptions.cmake.in" "${CMAKE_BINARY_DIR}/CMakeCPackOptions.cmake" @ONLY) set(CPACK_PROJECT_CONFIG_FILE "${CMAKE_BINARY_DIR}/CMakeCPackOptions.cmake") +########################################################## D O C U M E N T A T I O N ############################################################# + if ( BUILD_DOCS ) install(FILES "${CMAKE_BINARY_DIR}/doc-pdf/Acknowledgments.pdf" DESTINATION "./Documentation" COMPONENT Documentation) install(FILES "${CMAKE_BINARY_DIR}/doc-pdf/AuxiliaryPrograms.pdf" DESTINATION "./Documentation" COMPONENT Documentation) @@ -454,6 +489,11 @@ if ( BUILD_DOCS ) install(FILES "${CMAKE_BINARY_DIR}/doc-pdf/UsingEnergyPlusForCompliance.pdf" DESTINATION "./Documentation" COMPONENT Documentation) endif () + +###################################################################################################################################################### +# P A C K A G I N G & C O M P O N E N T S # +###################################################################################################################################################### + # Careful: the position (and what you include) matters a lot! include(CPack) include(CPackIFW) From 40f63c506cb1f619fedd880a2ad45f71c83cec16 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Tue, 23 Jul 2019 16:02:56 +0200 Subject: [PATCH 40/42] Comment out the InstallRequiredSystemLibraries stuff --- cmake/Install.cmake | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 8b5d43a64ca..9a312c8243c 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -489,6 +489,13 @@ if ( BUILD_DOCS ) install(FILES "${CMAKE_BINARY_DIR}/doc-pdf/UsingEnergyPlusForCompliance.pdf" DESTINATION "./Documentation" COMPONENT Documentation) endif () +########################################################## S Y S T E M L I B R A R I E S ############################################################# + +# TODO: is this unecessary now? I had forgotten to actually create a Libraries via cpack_add_component but everything seemed fined +# At worse, try not to uncomment this as is, but place it inside an if(PLATFORM) statement +#SET(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) +#INCLUDE(InstallRequiredSystemLibraries) +#INSTALL(FILES ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION "./" COMPONENT Libraries) ###################################################################################################################################################### # P A C K A G I N G & C O M P O N E N T S # @@ -554,6 +561,11 @@ cpack_add_component(CopyAndRegisterSystemDLLs REQUIRED ) +#cpack_add_component(Libraries +# DISPLAY_NAME "Install required system libraries" +# DESCRIPTION "This is probably not required right now..." +#) + # Regular stuff, like chmod +x cpack_ifw_configure_component(Unspecified SCRIPT cmake/qtifw/install_operations.qs @@ -579,7 +591,3 @@ cpack_ifw_configure_component(Licenses LICENSES "EnergyPlus" ${CPACK_RESOURCE_FILE_LICENSE} ) - -SET(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) -INCLUDE(InstallRequiredSystemLibraries) -INSTALL(FILES ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION "./" COMPONENT Libraries) From 1d054d89ae373401e38340dbae561abf47831993 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Tue, 23 Jul 2019 16:24:37 +0200 Subject: [PATCH 41/42] If user was building NSIS on windows, force it OFF and force IFW instead This is a temporary thing to avoid users who were already building packages getting puzzled --- cmake/Install.cmake | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 9a312c8243c..e1f513e1488 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -51,12 +51,20 @@ elseif(WIN32) set(CPACK_BINARY_IFW ON CACHE BOOL "Enable to build IFW package, which is the recommend method") set(CPACK_BINARY_ZIP ON CACHE BOOL "Enable to build a ZIP package, recommended for an official release") - # We want to force update the cache to avoid user suddenly getting build errors - set(CPACK_BINARY_NSIS OFF CACHE BOOL "This was the legacy method on Windows, superseeded by IFW" FORCE) - + set(CPACK_BINARY_NSIS OFF CACHE BOOL "This was the legacy method on Windows, superseeded by IFW") set(CPACK_BINARY_7Z OFF CACHE BOOL "Recommended OFF") set(CPACK_BINARY_NUGET OFF CACHE BOOL "Recommended OFF") set(CPACK_BINARY_WIX OFF CACHE BOOL "Recommended OFF") + + + # TODO: the "FORCE" is temporary to avoid people having an existing build directory build IFW, remove after next release + # We want to force update the cache to avoid user suddenly getting build errors + if(CPACK_BINARY_NSIS) + set(CPACK_BINARY_NSIS OFF CACHE BOOL "This was the legacy method on Windows, superseeded by IFW" FORCE) + set(CPACK_BINARY_IFW ON CACHE BOOL "Enable to build IFW package, which is the recommend method" FORCE) + message("Switching from NSIS to IFW as the supported generator has changed on Windows") + endif() + endif() From 85375914746c75084782b5f250ab814be973f303 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Tue, 23 Jul 2019 16:31:46 +0200 Subject: [PATCH 42/42] Fix english typos --- cmake/Install.cmake | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index e1f513e1488..76279cc4a7f 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -3,7 +3,7 @@ ###################################################################################################################################################### -# Default the Binary generators: problem is that none of the CPACK_BINARY_XXX wil show up in CMakeCache, +# Default the Binary generators: problem is that none of the CPACK_BINARY_ will show up in CMakeCache, # which makes it less clear what will happen in terms of package generation #if(WIN32) #set(CPACK_GENERATOR "IFW;ZIP") @@ -26,14 +26,14 @@ if (UNIX) set(CPACK_BINARY_NSIS OFF CACHE BOOL "Recommended OFF") if(APPLE) - set(CPACK_BINARY_IFW ON CACHE BOOL "Enable to build IFW package, which is the recommend method") + set(CPACK_BINARY_IFW ON CACHE BOOL "Enable to build IFW package, which is the recommended method") set(CPACK_BINARY_STGZ OFF CACHE BOOL "Recommended OFF") # Mac Specific options to turn off set(CPACK_BINARY_BUNDLE OFF CACHE BOOL "Recommended OFF") set(CPACK_BINARY_DRAGNDROP OFF CACHE BOOL "Recommended OFF") set(CPACK_BINARY_OSXX11 OFF CACHE BOOL "Recommended OFF") - set(CPACK_BINARY_PACKAGEMAKER OFF CACHE BOOL "This was the legacy method on Apple, superseeded by IFW.") + set(CPACK_BINARY_PACKAGEMAKER OFF CACHE BOOL "This was the legacy method on Apple, superseded by IFW.") set(CPACK_BINRARY_PRODUCTBUILD OFF CACHE BOOL "Recommended OFF") else() @@ -51,7 +51,7 @@ elseif(WIN32) set(CPACK_BINARY_IFW ON CACHE BOOL "Enable to build IFW package, which is the recommend method") set(CPACK_BINARY_ZIP ON CACHE BOOL "Enable to build a ZIP package, recommended for an official release") - set(CPACK_BINARY_NSIS OFF CACHE BOOL "This was the legacy method on Windows, superseeded by IFW") + set(CPACK_BINARY_NSIS OFF CACHE BOOL "This was the legacy method on Windows, superseded by IFW") set(CPACK_BINARY_7Z OFF CACHE BOOL "Recommended OFF") set(CPACK_BINARY_NUGET OFF CACHE BOOL "Recommended OFF") set(CPACK_BINARY_WIX OFF CACHE BOOL "Recommended OFF") @@ -60,7 +60,7 @@ elseif(WIN32) # TODO: the "FORCE" is temporary to avoid people having an existing build directory build IFW, remove after next release # We want to force update the cache to avoid user suddenly getting build errors if(CPACK_BINARY_NSIS) - set(CPACK_BINARY_NSIS OFF CACHE BOOL "This was the legacy method on Windows, superseeded by IFW" FORCE) + set(CPACK_BINARY_NSIS OFF CACHE BOOL "This was the legacy method on Windows, superseded by IFW" FORCE) set(CPACK_BINARY_IFW ON CACHE BOOL "Enable to build IFW package, which is the recommend method" FORCE) message("Switching from NSIS to IFW as the supported generator has changed on Windows") endif()