From a5a78830f557e5ffc2b4613200970ac75767328b Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Mon, 14 Nov 2022 10:14:51 +0100 Subject: [PATCH 01/14] Extract palladio version information from cmake to separate shared file --- src/CMakeLists.txt | 18 ++++++++++++++---- version.txt | 4 ++++ 2 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 version.txt diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 37c4067..05c0e76 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -20,10 +20,20 @@ set(HOUDINI_RELATIVE_PALLADIO_PATH "${HOUDINI_RELATIVE_PACKAGES_PATH}/palladio") ### versioning -set(PLD_VERSION_MAJOR 2) -set(PLD_VERSION_MINOR 0) -set(PLD_VERSION_PATCH 0) -set(PLD_VERSION_PRE "-beta.1") # set to empty string for final releases +file(READ "${CMAKE_CURRENT_LIST_DIR}/../version.txt" VERSION_FILE) + +string(REGEX MATCH "PLD_VERSION_MAJOR ([^\n]*)" _ ${VERSION_FILE}) +set(PLD_VERSION_MAJOR ${CMAKE_MATCH_1}) + +string(REGEX MATCH "PLD_VERSION_MINOR ([^\n]*)" _ ${VERSION_FILE}) +set(PLD_VERSION_MINOR ${CMAKE_MATCH_1}) + +string(REGEX MATCH "PLD_VERSION_PATCH ([^\n]*)" _ ${VERSION_FILE}) +set(PLD_VERSION_PATCH ${CMAKE_MATCH_1}) + +string(REGEX MATCH "PLD_VERSION_PRE ([^\n]*)" _ ${VERSION_FILE}) +set(PLD_VERSION_PRE ${CMAKE_MATCH_1}) + if (NOT PLD_VERSION_BUILD) set(PLD_VERSION_BUILD DEV) endif () diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..6a1d7c4 --- /dev/null +++ b/version.txt @@ -0,0 +1,4 @@ +PLD_VERSION_MAJOR 2 +PLD_VERSION_MINOR 0 +PLD_VERSION_PATCH 0 +PLD_VERSION_PRE -beta.1 \ No newline at end of file From 76f0bfebb3bd288befb855559ceda0acab2a26d7 Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Wed, 16 Nov 2022 09:53:24 +0100 Subject: [PATCH 02/14] Add install subdir to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a157fa6..aadfbbd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /build +/install /.idea /src/.idea /src/Pipfile.lock From f6d83f3baffaf299dde60165530da27044106a6d Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Tue, 8 Nov 2022 18:32:14 +0100 Subject: [PATCH 03/14] Add python script with templates for creating msi installer with WIX --- deploy/build.py | 247 +++++++++++++++++++ deploy/installer_config.json | 19 ++ deploy/resources/banner.png | Bin 0 -> 5199 bytes deploy/resources/dialog.png | Bin 0 -> 24344 bytes deploy/resources/license.rtf | Bin 0 -> 1222 bytes deploy/resources/palladio.ico | Bin 0 -> 4286 bytes deploy/templates/deployment.properties.in | 5 + deploy/templates/palladio.wxs.in | 37 +++ deploy/templates/palladio_directory.in | 1 + deploy/templates/palladio_feature.in | 4 + deploy/templates/palladio_registry_search.in | 3 + 11 files changed, 316 insertions(+) create mode 100644 deploy/build.py create mode 100644 deploy/installer_config.json create mode 100644 deploy/resources/banner.png create mode 100644 deploy/resources/dialog.png create mode 100644 deploy/resources/license.rtf create mode 100644 deploy/resources/palladio.ico create mode 100644 deploy/templates/deployment.properties.in create mode 100644 deploy/templates/palladio.wxs.in create mode 100644 deploy/templates/palladio_directory.in create mode 100644 deploy/templates/palladio_feature.in create mode 100644 deploy/templates/palladio_registry_search.in diff --git a/deploy/build.py b/deploy/build.py new file mode 100644 index 0000000..29908e5 --- /dev/null +++ b/deploy/build.py @@ -0,0 +1,247 @@ +import argparse +import glob +import subprocess +import json +import shutil +import os +from pathlib import Path +from string import Template + +# Dirs and Paths +SCRIPT_DIR = Path(__file__).resolve().parent +CFG_PATH = SCRIPT_DIR / f'installer_config.json' +RESOURCE_DIR = SCRIPT_DIR / f'resources' + +VERSION_PATH = SCRIPT_DIR / f'../version.txt' + +DEFAULT_BUILD_DIR = SCRIPT_DIR / f'../build/build_msi' + +TEMPLATE_DIR = SCRIPT_DIR / f'templates' +DEPLOYMENT_PROPERTIES_TEMPLATE_PATH = TEMPLATE_DIR / 'deployment.properties.in' + +WIX_TEMPLATE_PATH = TEMPLATE_DIR / f'palladio.wxs.in' +WIX_REG_SEARCH_TEMPLATE_PATH = TEMPLATE_DIR / f'palladio_registry_search.in' +WIX_DIRECTORY_TEMPLATE_PATH = TEMPLATE_DIR / f'palladio_directory.in' +WIX_FEATURE_TEMPLATE_PATH = TEMPLATE_DIR / f'palladio_feature.in' + +PROJECT_NAME = 'Palladio' +PLATFORM = 'win64' +PACKAGE_VENDOR_ESCAPED = 'Esri R&amp;D Center Zurich' + + +def get_palladio_version_string(includePre=False, build_version=''): + version_map = {} + delimiter = '.' + with open(VERSION_PATH, 'r') as version_file: + version_text = version_file.read() + lines = version_text.splitlines() + for line in lines: + key_value = line.split(' ') + if len(key_value) == 2: + version_map[key_value[0]] = key_value[1] + version_string = version_map['PLD_VERSION_MAJOR'] + delimiter + \ + version_map['PLD_VERSION_MINOR'] + \ + delimiter + version_map['PLD_VERSION_PATCH'] + if includePre: + version_string += version_map['PLD_VERSION_PRE'] + if len(build_version) > 0: + version_string += '+b' + build_version + return version_string + + +def gen_installer_filename(build_version): + return PROJECT_NAME + '-installer-' + get_palladio_version_string(True, build_version) + '.msi' + + +def rel_to_os_dir(path): + return Path(path).absolute() + + +def clear_folder(path): + if path.exists(): + shutil.rmtree(path) + os.makedirs(path) + + +def run_wix_command(cmd, build_dir): + process = subprocess.run(args=[str(i) for i in cmd], cwd=build_dir, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + universal_newlines=True) + print(process.args) + print(process.stdout) + print(process.stderr) + + +def wix_harvest(houdini_version, binaries_install_dir, build_dir): + output_path = build_dir / f'houdini{houdini_version}.wxs' + wxs_file = output_path + wxs_var = f'-dPalladioInstallComponentDir{houdini_version}={binaries_install_dir}' + heat_cmd = ['heat', 'dir', binaries_install_dir, '-dr', f'PalladioInstallComponentDir{houdini_version}', '-ag', + '-cg', f'PalladioInstallComponent{houdini_version}', '-sfrag', '-template fragment', '-var', f'wix.PalladioInstallComponentDir{houdini_version}', '-srd', '-sreg', '-o', output_path] + + run_wix_command(heat_cmd, build_dir) + + return wxs_file, wxs_var + + +def wix_compile(sources, vars, build_dir): + candle_cmd = ['candle', '-arch', 'x64', + build_dir / 'palladio.wxs'] + sources + vars + run_wix_command(candle_cmd, build_dir) + + objects = glob.glob(str(build_dir / '*.wixobj')) + return objects + + +def wix_link(objects, vars, build_dir, installer_filename): + light_cmd = ['light', f'-dWixUILicenseRtf={SCRIPT_DIR}\\resources\\license.rtf', f'-dInstallDir=', '-ext', 'WixUIExtension', + '-cultures:en-us', '-ext', 'WixUtilExtension', '-o', f'{build_dir}\\' + installer_filename] + light_cmd.extend(objects) + light_cmd.extend(vars) + run_wix_command(light_cmd, build_dir) + + +def create_installer(houdini_versions, binary_folders, build_dir, installer_filename): + wxs_files = [] + wxs_vars = [] + for houdini_version_key in binary_folders: + rel_path_string = binary_folders[houdini_version_key] + major = houdini_versions[houdini_version_key]['major'] + minor = houdini_versions[houdini_version_key]['minor'] + + binary_path = rel_to_os_dir(rel_path_string) + + print(binary_path, " ", houdini_version_key) + wxs_file, wxs_var = wix_harvest( + str(major) + str(minor), binary_path, build_dir) + wxs_files.append(wxs_file) + wxs_vars.append(wxs_var) + + wix_objects = wix_compile(wxs_files, wxs_vars, build_dir) + wix_link(wix_objects, wxs_vars, build_dir, installer_filename) + + +def copy_binaries(binary_folders, build_dir): + clear_folder(build_dir) + + valid_binaries = {} + for binary_folder in binary_folders: + src_path = binary_folders[binary_folder] + if len(src_path) == 0: + continue + os_src_path = rel_to_os_dir(src_path) + if os_src_path.exists(): + binary_path = build_dir / f'install' / Path(binary_folder) + print("copy ", os_src_path, " to ", binary_path) + shutil.copytree(os_src_path, binary_path) + valid_binaries[binary_folder] = binary_path + return valid_binaries + + +def fill_template(src_path, token_value_dict): + result = '' + with open(src_path, 'r') as file: + src = Template(file.read()) + result = src.substitute(token_value_dict) + return result + + +def fill_template_to_file(src_path, dest_path, token_value_dict): + result = fill_template(src_path, token_value_dict) + with open(dest_path, 'w') as outfile: + outfile.write(result) + + +def fill_wix_template(houdini_versions, copied_binaries, build_dir): + wix_reg_search = '' + wix_directories = '' + wix_features = '' + + for version in copied_binaries: + version_dict = { + 'HOU_MAJOR': houdini_versions[version]['major'], + 'HOU_MINOR': houdini_versions[version]['minor'], + 'HOU_PATCH': houdini_versions[version]['patch'] + } + newline = '' + if len(wix_reg_search) > 0: + newline = '\n' + wix_reg_search += newline + \ + fill_template(WIX_REG_SEARCH_TEMPLATE_PATH, version_dict) + wix_directories += newline + \ + fill_template(WIX_DIRECTORY_TEMPLATE_PATH, version_dict) + wix_features += newline + \ + fill_template(WIX_FEATURE_TEMPLATE_PATH, version_dict) + + wix_properties = { + 'PROJECT_NAME': PROJECT_NAME, + 'PLD_VERSION_MMP': get_palladio_version_string(), + 'PACKAGE_VENDOR_ESCAPED': PACKAGE_VENDOR_ESCAPED, + 'RESOURCE_FOLDER': RESOURCE_DIR, + 'HOUDINI_REGISTRY_SEARCH': wix_reg_search, + 'HOUDINI_DIRECTORY': wix_directories, + 'PALLADIO_FOR_HOUDINI_FEATURE': wix_features + } + fill_template_to_file(WIX_TEMPLATE_PATH, build_dir / + f'palladio.wxs', wix_properties) + + +def fill_deployment_properties_templates(installer_filename, build_dir, build_version): + deployment_properties = { + 'PACKAGE_NAME': PROJECT_NAME, + 'PLD_VERSION_BASE': get_palladio_version_string(), + 'PLD_VERSION': get_palladio_version_string(True, build_version), + 'PACKAGE_FILE_NAME': installer_filename, + 'PLD_PKG_OS': PLATFORM + } + fill_template_to_file(DEPLOYMENT_PROPERTIES_TEMPLATE_PATH, build_dir / + f'deployment.properties', deployment_properties) + + +def parse_arguments(houdini_versions): + parser = argparse.ArgumentParser( + description='Build unified MSI installer for the Palladio Plugin') + for houdini_version in houdini_versions: + h_major = houdini_versions[houdini_version]['major'] + h_minor = houdini_versions[houdini_version]['minor'] + parser.add_argument('-h' + h_major + h_minor, '--' + houdini_version, default='', + help='path to binary location of Palladio build for ' + houdini_version) + + parser.add_argument('-bv', '--build_version', default='', + help='build version for current Palladio build') + + parser.add_argument('-bd', '--build_dir', default=str(DEFAULT_BUILD_DIR), + help='build directory where installer files are generated') + + parsed_args = vars(parser.parse_args()) + binary_folders = {} + for item in parsed_args: + if item.__contains__('houdini'): + binary_folders[item] = parsed_args[item] + return binary_folders, parsed_args['build_version'], Path(parsed_args['build_dir']).resolve() + + +def main(): + with open(CFG_PATH, 'r') as config_file: + installer_config = json.load(config_file) + + houdini_versions = installer_config['houdini_versions'] + + binary_folders, build_version, build_dir = parse_arguments(houdini_versions) + + copied_binaries = copy_binaries(binary_folders, build_dir) + installer_filename = gen_installer_filename(build_version) + + if len(copied_binaries) == 0: + print('Please provide at least one palladio binary folder, see "build.py --help" for help') + return + + fill_deployment_properties_templates( + installer_filename, build_dir, build_version) + fill_wix_template(houdini_versions, copied_binaries, build_dir) + + create_installer(houdini_versions, copied_binaries, + build_dir, installer_filename) + + +if __name__ == '__main__': + main() diff --git a/deploy/installer_config.json b/deploy/installer_config.json new file mode 100644 index 0000000..8f41be4 --- /dev/null +++ b/deploy/installer_config.json @@ -0,0 +1,19 @@ +{ + "houdini_versions":{ + "houdini18.5": { + "major": "18", + "minor": "5", + "patch": "759" + }, + "houdini19.0": { + "major": "19", + "minor": "0", + "patch": "720" + }, + "houdini19.5": { + "major": "19", + "minor": "5", + "patch": "303" + } + } +} \ No newline at end of file diff --git a/deploy/resources/banner.png b/deploy/resources/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..b93821f46191e17f271f3038aecfbe0cd269bab6 GIT binary patch literal 5199 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 literal 0 HcmV?d00001 diff --git a/deploy/resources/dialog.png b/deploy/resources/dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b253a0c2cecdfc56c0b3d3e4b617a938c72441 GIT binary patch literal 24344 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 P5XNQ>=AzaDV($L|5(rPs literal 0 HcmV?d00001 diff --git a/deploy/templates/deployment.properties.in b/deploy/templates/deployment.properties.in new file mode 100644 index 0000000..850436b --- /dev/null +++ b/deploy/templates/deployment.properties.in @@ -0,0 +1,5 @@ +package_name = ${PACKAGE_NAME} +package_version_base = ${PLD_VERSION_BASE} +package_version = ${PLD_VERSION} +package_file = ${PACKAGE_FILE_NAME} +package_classifier = ${PLD_PKG_OS} \ No newline at end of file diff --git a/deploy/templates/palladio.wxs.in b/deploy/templates/palladio.wxs.in new file mode 100644 index 0000000..8da97a6 --- /dev/null +++ b/deploy/templates/palladio.wxs.in @@ -0,0 +1,37 @@ + + + + + + + + + +${HOUDINI_REGISTRY_SEARCH} + + + + ProductIcon.ico + + + + + + + +${HOUDINI_DIRECTORY} + + + +${PALLADIO_FOR_HOUDINI_FEATURE} + + + + + \ No newline at end of file diff --git a/deploy/templates/palladio_directory.in b/deploy/templates/palladio_directory.in new file mode 100644 index 0000000..cd30bc0 --- /dev/null +++ b/deploy/templates/palladio_directory.in @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/deploy/templates/palladio_feature.in b/deploy/templates/palladio_feature.in new file mode 100644 index 0000000..b9773b8 --- /dev/null +++ b/deploy/templates/palladio_feature.in @@ -0,0 +1,4 @@ + + + HOUDINI${HOU_MAJOR}${HOU_MINOR}INSTALLDIR + \ No newline at end of file diff --git a/deploy/templates/palladio_registry_search.in b/deploy/templates/palladio_registry_search.in new file mode 100644 index 0000000..ab7a3cb --- /dev/null +++ b/deploy/templates/palladio_registry_search.in @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 5ce20b55087d6830f65862f2cc10c2fd0d58000e Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Mon, 14 Nov 2022 10:09:27 +0100 Subject: [PATCH 04/14] CI: add installer stage to Jenkins --- Jenkinsfile | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index c724079..b461054 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -11,6 +11,7 @@ import com.esri.zrh.jenkins.ce.CityEnginePipelineLibrary import com.esri.zrh.jenkins.ce.PrtAppPipelineLibrary import com.esri.zrh.jenkins.PslFactory import com.esri.zrh.jenkins.psl.UploadTrackingPsl +import com.esri.zrh.jenkins.ToolInfo @Field def psl = PslFactory.create(this, UploadTrackingPsl.ID) @Field def cepl = new CityEnginePipelineLibrary(this, psl) @@ -46,6 +47,8 @@ import com.esri.zrh.jenkins.psl.UploadTrackingPsl [ os: cepl.CFG_OS_WIN10, bc: cepl.CFG_BC_REL, tc: cepl.CFG_TC_VC1427, cc: cepl.CFG_CC_OPT, arch: cepl.CFG_ARCH_X86_64, houdini: '19.5' ], ] +@Field final List INSTALLER_CONFIG = [ [ os: cepl.CFG_OS_WIN10, bc: cepl.CFG_BC_REL, tc: cepl.CFG_TC_VC1427, cc: cepl.CFG_CC_OPT, arch: cepl.CFG_ARCH_X86_64 ] ] +@Field final List INSTALLER_HOUDINI_VERS = [ '18.5', '19.0', '19.5' ] // -- SETUP @@ -68,6 +71,10 @@ stage('build') { cepl.runParallel(taskGenBuild()) } +stage('installer') { + cepl.runParallel(taskGenInstaller()) +} + papl.finalizeRun('palladio', env.BRANCH_NAME) @@ -93,6 +100,12 @@ Map taskGenBuild() { return tasks; } +Map taskGenInstaller() { + Map tasks = [:] + tasks << cepl.generateTasks('pld-msi', this.&taskCreateInstaller, INSTALLER_CONFIG) + return tasks; +} + // -- TASK BUILDERS @@ -123,6 +136,17 @@ def taskBuildPalladio(cfg) { dir(path: 'build') { papl.runCMakeBuild(SOURCE, BUILD_TARGET, cfg, defs) } + final String artifactPattern = "palladio-*" + + if(cfg.os == cepl.CFG_OS_WIN10){ + dir(path: 'build'){ + stashFile = cepl.findOneFile(artifactPattern) + echo("stashFile: '${stashFile}'") + stash(includes: artifactPattern, name: "houdini${cfg.houdini.replaceAll('\\.', '_')}") + stashPath = "${stashFile.path}" + echo("file path to stash: '${stashPath}'") + } + } def versionExtractor = { p -> def vers = (p =~ /.*palladio-(.*)\.hdn.*/) @@ -132,5 +156,51 @@ def taskBuildPalladio(cfg) { def cls = (p =~ /.*palladio-.*\.(hdn.*)-(windows|linux)\..*/) return cls[0][1] + '.' + cepl.getArchiveClassifier(cfg) } - papl.publish('palladio', env.BRANCH_NAME, "palladio-*", versionExtractor, cfg, classifierExtractor) + papl.publish('palladio', env.BRANCH_NAME, artifactPattern, versionExtractor, cfg, classifierExtractor) } + +def taskCreateInstaller(cfg) { + final String appName = 'palladio-installer' + cepl.cleanCurrentDir() + unstash(name: SOURCE_STASH) + + String pyArgs = "" + + // fetch outputs from builds + dir(path: 'build'){ + dir(path: 'tmp'){ + INSTALLER_HOUDINI_VERS.each { mv -> + unstash(name: "houdini${mv.replaceAll('\\.', '_')}") + def zipFile = cepl.findOneFile("*hdn${mv.replaceAll('\\.', '-')}*.zip") + final String zipFileName = zipFile.name + unzip(zipFile:zipFileName) + pyArgs += "-h${mv.replaceAll('\\.', '')} \"build\\tmp\\${zipFileName.take(zipFileName.lastIndexOf('.'))}\" " + } + } + } + pyArgs += "-bv ${env.BUILD_NUMBER} " + pyArgs += "-bd \"build\\build_msi\" " + + // Toolchain definition for building MSI installers. + final JenkinsTools compiler = cepl.getToolchainTool(cfg) + final def toolchain = [ + new ToolInfo(JenkinsTools.WIX, cfg), + new ToolInfo(compiler, cfg) + ] + + // Setup environment according to above toolchain definition. + withTool(toolchain) { + psl.runCmd('python "palladio.git\\deploy\\build.py" ' + pyArgs) + + def buildProps = papl.jpe.readProperties(file: 'build/build_msi/deployment.properties') + + final String artifactPattern = "build_msi/${buildProps.package_file}" + final def artifactVersion = { p -> buildProps.package_version } + + def classifierExtractor = { p -> + return cepl.getArchiveClassifier(cfg) + } + + papl.publish(appName, env.BRANCH_NAME, artifactPattern, artifactVersion, cfg, classifierExtractor) + } +} \ No newline at end of file From a41f2357f2d56eb9d244088f4bb753a931d49454 Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Wed, 16 Nov 2022 09:46:02 +0100 Subject: [PATCH 05/14] Doc: added section to readme for generating msi installer --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 3a91a7b..4bcbda9 100644 --- a/README.md +++ b/README.md @@ -314,6 +314,16 @@ See [Quick Start](#quick-start) how to launch Houdini with Palladio. 1. `nmake palladio_test` 1. Run `bin\palladio_test` +### Building Windows MSI installer +1. Open a MSVC 14.27 x64 shell (Visual Studio 2019) and `cd` to the Palladio git repository +1. for each houdini version build the binary files to a local install folder: + 1. `mkdir build/installer_XXY` (i.e. `installer_195`) + 1. `cd build/installer_XXY` + 1. `cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="../../install/houdiniXX.Y" ../../src` + 1. `nmake install` (the plugin will be installed to `install/houdiniXX.Y`) +1. From a terminal run `deploy\build.py` and provide the binary folders via `-hXXY "install/houdiniXX.Y"` +1. The MSI installer should now be located in `build/build_msi/` + ## Release Notes ### v2.0.0 Beta 1 (Okt 13, 2022) From ccec608d112eefc4048ba207a50e5a36467c0723 Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Thu, 17 Nov 2022 09:15:01 +0100 Subject: [PATCH 06/14] Cleanup: remove redundant placeholder string syntax --- deploy/build.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/deploy/build.py b/deploy/build.py index 29908e5..64f1ae4 100644 --- a/deploy/build.py +++ b/deploy/build.py @@ -9,20 +9,20 @@ # Dirs and Paths SCRIPT_DIR = Path(__file__).resolve().parent -CFG_PATH = SCRIPT_DIR / f'installer_config.json' -RESOURCE_DIR = SCRIPT_DIR / f'resources' +CFG_PATH = SCRIPT_DIR / 'installer_config.json' +RESOURCE_DIR = SCRIPT_DIR / 'resources' -VERSION_PATH = SCRIPT_DIR / f'../version.txt' +VERSION_PATH = SCRIPT_DIR / '../version.txt' -DEFAULT_BUILD_DIR = SCRIPT_DIR / f'../build/build_msi' +DEFAULT_BUILD_DIR = SCRIPT_DIR / '../build/build_msi' -TEMPLATE_DIR = SCRIPT_DIR / f'templates' +TEMPLATE_DIR = SCRIPT_DIR / 'templates' DEPLOYMENT_PROPERTIES_TEMPLATE_PATH = TEMPLATE_DIR / 'deployment.properties.in' -WIX_TEMPLATE_PATH = TEMPLATE_DIR / f'palladio.wxs.in' -WIX_REG_SEARCH_TEMPLATE_PATH = TEMPLATE_DIR / f'palladio_registry_search.in' -WIX_DIRECTORY_TEMPLATE_PATH = TEMPLATE_DIR / f'palladio_directory.in' -WIX_FEATURE_TEMPLATE_PATH = TEMPLATE_DIR / f'palladio_feature.in' +WIX_TEMPLATE_PATH = TEMPLATE_DIR / 'palladio.wxs.in' +WIX_REG_SEARCH_TEMPLATE_PATH = TEMPLATE_DIR / 'palladio_registry_search.in' +WIX_DIRECTORY_TEMPLATE_PATH = TEMPLATE_DIR / 'palladio_directory.in' +WIX_FEATURE_TEMPLATE_PATH = TEMPLATE_DIR / 'palladio_feature.in' PROJECT_NAME = 'Palladio' PLATFORM = 'win64' @@ -93,7 +93,7 @@ def wix_compile(sources, vars, build_dir): def wix_link(objects, vars, build_dir, installer_filename): - light_cmd = ['light', f'-dWixUILicenseRtf={SCRIPT_DIR}\\resources\\license.rtf', f'-dInstallDir=', '-ext', 'WixUIExtension', + light_cmd = ['light', f'-dWixUILicenseRtf={SCRIPT_DIR}\\resources\\license.rtf', '-dInstallDir=', '-ext', 'WixUIExtension', '-cultures:en-us', '-ext', 'WixUtilExtension', '-o', f'{build_dir}\\' + installer_filename] light_cmd.extend(objects) light_cmd.extend(vars) @@ -130,7 +130,7 @@ def copy_binaries(binary_folders, build_dir): continue os_src_path = rel_to_os_dir(src_path) if os_src_path.exists(): - binary_path = build_dir / f'install' / Path(binary_folder) + binary_path = build_dir / 'install' / Path(binary_folder) print("copy ", os_src_path, " to ", binary_path) shutil.copytree(os_src_path, binary_path) valid_binaries[binary_folder] = binary_path @@ -182,7 +182,7 @@ def fill_wix_template(houdini_versions, copied_binaries, build_dir): 'PALLADIO_FOR_HOUDINI_FEATURE': wix_features } fill_template_to_file(WIX_TEMPLATE_PATH, build_dir / - f'palladio.wxs', wix_properties) + 'palladio.wxs', wix_properties) def fill_deployment_properties_templates(installer_filename, build_dir, build_version): @@ -194,7 +194,7 @@ def fill_deployment_properties_templates(installer_filename, build_dir, build_ve 'PLD_PKG_OS': PLATFORM } fill_template_to_file(DEPLOYMENT_PROPERTIES_TEMPLATE_PATH, build_dir / - f'deployment.properties', deployment_properties) + 'deployment.properties', deployment_properties) def parse_arguments(houdini_versions): From d2a1dadb184531288cca9b9da26b72c6469d3308 Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Thu, 17 Nov 2022 12:44:14 +0100 Subject: [PATCH 07/14] Install to programm data with msi installer Also avoid registry checking palladio versions, since we install for multiple patch/micro versions --- deploy/build.py | 8 ++++++-- deploy/palladio.json | 14 ++++++++++++++ deploy/templates/palladio.wxs.in | 25 ++++++++++++++++++++----- deploy/templates/palladio_feature.in | 3 +-- 4 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 deploy/palladio.json diff --git a/deploy/build.py b/deploy/build.py index 64f1ae4..e2233c0 100644 --- a/deploy/build.py +++ b/deploy/build.py @@ -13,6 +13,7 @@ RESOURCE_DIR = SCRIPT_DIR / 'resources' VERSION_PATH = SCRIPT_DIR / '../version.txt' +PACKAGE_JSON_PATH = SCRIPT_DIR / 'palladio.json' DEFAULT_BUILD_DIR = SCRIPT_DIR / '../build/build_msi' @@ -131,8 +132,11 @@ def copy_binaries(binary_folders, build_dir): os_src_path = rel_to_os_dir(src_path) if os_src_path.exists(): binary_path = build_dir / 'install' / Path(binary_folder) - print("copy ", os_src_path, " to ", binary_path) - shutil.copytree(os_src_path, binary_path) + print("copy files from ", os_src_path, " to ", binary_path) + shutil.copytree(os_src_path / 'packages' / 'palladio', binary_path) + shutil.copytree(os_src_path / 'dso', binary_path / 'dso') + shutil.copytree(os_src_path / 'config', binary_path / 'config') + shutil.copy(PACKAGE_JSON_PATH, build_dir) valid_binaries[binary_folder] = binary_path return valid_binaries diff --git a/deploy/palladio.json b/deploy/palladio.json new file mode 100644 index 0000000..8a7ecb4 --- /dev/null +++ b/deploy/palladio.json @@ -0,0 +1,14 @@ +{ + "enable": true, + "env": [ + { + "PLD_PATH": [ + {"houdini_version == '18.5'": "C:/ProgramData/ESRI/Palladio/houdini18.5"}, + {"houdini_version == '19.0'": "C:/ProgramData/ESRI/Palladio/houdini19.0"}, + {"houdini_version == '19.5'": "C:/ProgramData/ESRI/Palladio/houdini19.5"} + ], + "PATH": "$PLD_PATH" + } + ], + "path": "$PLD_PATH" +} \ No newline at end of file diff --git a/deploy/templates/palladio.wxs.in b/deploy/templates/palladio.wxs.in index 8da97a6..e4b1072 100644 --- a/deploy/templates/palladio.wxs.in +++ b/deploy/templates/palladio.wxs.in @@ -10,8 +10,6 @@ -${HOUDINI_REGISTRY_SEARCH} - - - -${HOUDINI_DIRECTORY} + + + + + ${HOUDINI_DIRECTORY} + + + + + + + + + + + ${PALLADIO_FOR_HOUDINI_FEATURE} + + + + diff --git a/deploy/templates/palladio_feature.in b/deploy/templates/palladio_feature.in index b9773b8..322e31a 100644 --- a/deploy/templates/palladio_feature.in +++ b/deploy/templates/palladio_feature.in @@ -1,4 +1,3 @@ - + - HOUDINI${HOU_MAJOR}${HOU_MINOR}INSTALLDIR \ No newline at end of file From 250d6eef19efeaa64b6c5fef7293b3138f50fdfc Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Thu, 17 Nov 2022 12:46:10 +0100 Subject: [PATCH 08/14] Cleanup: remove unused registry search template --- deploy/build.py | 7 +------ deploy/templates/palladio_registry_search.in | 3 --- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 deploy/templates/palladio_registry_search.in diff --git a/deploy/build.py b/deploy/build.py index e2233c0..7eae24c 100644 --- a/deploy/build.py +++ b/deploy/build.py @@ -21,7 +21,6 @@ DEPLOYMENT_PROPERTIES_TEMPLATE_PATH = TEMPLATE_DIR / 'deployment.properties.in' WIX_TEMPLATE_PATH = TEMPLATE_DIR / 'palladio.wxs.in' -WIX_REG_SEARCH_TEMPLATE_PATH = TEMPLATE_DIR / 'palladio_registry_search.in' WIX_DIRECTORY_TEMPLATE_PATH = TEMPLATE_DIR / 'palladio_directory.in' WIX_FEATURE_TEMPLATE_PATH = TEMPLATE_DIR / 'palladio_feature.in' @@ -156,7 +155,6 @@ def fill_template_to_file(src_path, dest_path, token_value_dict): def fill_wix_template(houdini_versions, copied_binaries, build_dir): - wix_reg_search = '' wix_directories = '' wix_features = '' @@ -167,10 +165,8 @@ def fill_wix_template(houdini_versions, copied_binaries, build_dir): 'HOU_PATCH': houdini_versions[version]['patch'] } newline = '' - if len(wix_reg_search) > 0: + if len(wix_directories) > 0: newline = '\n' - wix_reg_search += newline + \ - fill_template(WIX_REG_SEARCH_TEMPLATE_PATH, version_dict) wix_directories += newline + \ fill_template(WIX_DIRECTORY_TEMPLATE_PATH, version_dict) wix_features += newline + \ @@ -181,7 +177,6 @@ def fill_wix_template(houdini_versions, copied_binaries, build_dir): 'PLD_VERSION_MMP': get_palladio_version_string(), 'PACKAGE_VENDOR_ESCAPED': PACKAGE_VENDOR_ESCAPED, 'RESOURCE_FOLDER': RESOURCE_DIR, - 'HOUDINI_REGISTRY_SEARCH': wix_reg_search, 'HOUDINI_DIRECTORY': wix_directories, 'PALLADIO_FOR_HOUDINI_FEATURE': wix_features } diff --git a/deploy/templates/palladio_registry_search.in b/deploy/templates/palladio_registry_search.in deleted file mode 100644 index ab7a3cb..0000000 --- a/deploy/templates/palladio_registry_search.in +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file From c02026afee657378d28287e5326cb8fa5fbe7ad9 Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Thu, 17 Nov 2022 16:20:53 +0100 Subject: [PATCH 09/14] Use Json for setting/parsing palladio version Updated min cmake version --- deploy/build.py | 11 +++-------- src/CMakeLists.txt | 19 ++++++------------- version.json | 6 ++++++ version.txt | 4 ---- 4 files changed, 15 insertions(+), 25 deletions(-) create mode 100644 version.json delete mode 100644 version.txt diff --git a/deploy/build.py b/deploy/build.py index 7eae24c..8126ff3 100644 --- a/deploy/build.py +++ b/deploy/build.py @@ -12,7 +12,7 @@ CFG_PATH = SCRIPT_DIR / 'installer_config.json' RESOURCE_DIR = SCRIPT_DIR / 'resources' -VERSION_PATH = SCRIPT_DIR / '../version.txt' +VERSION_JSON_PATH = SCRIPT_DIR / '../version.json' PACKAGE_JSON_PATH = SCRIPT_DIR / 'palladio.json' DEFAULT_BUILD_DIR = SCRIPT_DIR / '../build/build_msi' @@ -32,13 +32,8 @@ def get_palladio_version_string(includePre=False, build_version=''): version_map = {} delimiter = '.' - with open(VERSION_PATH, 'r') as version_file: - version_text = version_file.read() - lines = version_text.splitlines() - for line in lines: - key_value = line.split(' ') - if len(key_value) == 2: - version_map[key_value[0]] = key_value[1] + with open(VERSION_JSON_PATH, 'r') as version_file: + version_map = json.load(version_file) version_string = version_map['PLD_VERSION_MAJOR'] + delimiter + \ version_map['PLD_VERSION_MINOR'] + \ delimiter + version_map['PLD_VERSION_PATCH'] diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 05c0e76..fff13dd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.13) +cmake_minimum_required(VERSION 3.19) project(palladio CXX) @@ -20,19 +20,12 @@ set(HOUDINI_RELATIVE_PALLADIO_PATH "${HOUDINI_RELATIVE_PACKAGES_PATH}/palladio") ### versioning -file(READ "${CMAKE_CURRENT_LIST_DIR}/../version.txt" VERSION_FILE) +file(READ "${CMAKE_CURRENT_LIST_DIR}/../version.json" VERSION_FILE) -string(REGEX MATCH "PLD_VERSION_MAJOR ([^\n]*)" _ ${VERSION_FILE}) -set(PLD_VERSION_MAJOR ${CMAKE_MATCH_1}) - -string(REGEX MATCH "PLD_VERSION_MINOR ([^\n]*)" _ ${VERSION_FILE}) -set(PLD_VERSION_MINOR ${CMAKE_MATCH_1}) - -string(REGEX MATCH "PLD_VERSION_PATCH ([^\n]*)" _ ${VERSION_FILE}) -set(PLD_VERSION_PATCH ${CMAKE_MATCH_1}) - -string(REGEX MATCH "PLD_VERSION_PRE ([^\n]*)" _ ${VERSION_FILE}) -set(PLD_VERSION_PRE ${CMAKE_MATCH_1}) +string(JSON PLD_VERSION_MAJOR GET ${VERSION_FILE} "PLD_VERSION_MAJOR") +string(JSON PLD_VERSION_MINOR GET ${VERSION_FILE} "PLD_VERSION_MINOR") +string(JSON PLD_VERSION_PATCH GET ${VERSION_FILE} "PLD_VERSION_PATCH") +string(JSON PLD_VERSION_PRE GET ${VERSION_FILE} "PLD_VERSION_PRE") if (NOT PLD_VERSION_BUILD) set(PLD_VERSION_BUILD DEV) diff --git a/version.json b/version.json new file mode 100644 index 0000000..ffe6128 --- /dev/null +++ b/version.json @@ -0,0 +1,6 @@ +{ + "PLD_VERSION_MAJOR": "2", + "PLD_VERSION_MINOR": "0", + "PLD_VERSION_PATCH": "0", + "PLD_VERSION_PRE": "-beta.1" +} \ No newline at end of file diff --git a/version.txt b/version.txt deleted file mode 100644 index 6a1d7c4..0000000 --- a/version.txt +++ /dev/null @@ -1,4 +0,0 @@ -PLD_VERSION_MAJOR 2 -PLD_VERSION_MINOR 0 -PLD_VERSION_PATCH 0 -PLD_VERSION_PRE -beta.1 \ No newline at end of file From 44a67f01c99b8ae367b8f4cf3b4b771bbca5ed49 Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Thu, 17 Nov 2022 16:35:53 +0100 Subject: [PATCH 10/14] Doc: update doc with installer requirements and changes --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4bcbda9..8d08ce7 100644 --- a/README.md +++ b/README.md @@ -243,10 +243,12 @@ It can be useful to put RPKs into an `rpk` sub-directory of your current Houdini * RedHat Enterprise Linux 7 or 8 and compatible (CentOS, Alma Linux, Rocky Linux, ...) ### Required Toolchain & Compiler -* [cmake 3.13 or later](https://cmake.org/download) +* [cmake 3.19 or later](https://cmake.org/download) * [conan 1.20 or later](https://www.conan.io/downloads) * Linux: GCC 9.3 * Windows: Visual Studio 2019 (MSVC 14.27) +* [WiX Toolset 3.11.1 or later](https://wixtoolset.org/docs/wix3/): Optional, required for building .msi installers +* Python 3.6 or later: Optional, required for building .msi installers ### Required Build Dependencies (Latest Release) * Installation of Houdini 18.5, 19.0 or 19.5 (see https://sidefx.com/download) @@ -338,6 +340,7 @@ Required CityEngine version: 2022.0 or older. - CGA annotations will create different UI widgets, for example a color picker or file browser - Seed parameter to change the seed value in the `pldAssign` node - Icon to Palladio nodes +- MSI windows installer #### Changed: - Updated Procedural Runtime (PRT) to 2.6.8300 (corresponds to CityEngine 2022.0) @@ -347,6 +350,7 @@ Required CityEngine version: 2022.0 or older. #### Development: - Updated compilers (now using C++ 17) +- Updated required cmake version to 3.19 - Linux version is now compiled with GCC 9.3 by default - Updated test framework and build system - Cleaned up CMake files From 7da3b48176af48d41daecacbae93db7e8582b8fe Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Thu, 17 Nov 2022 17:20:10 +0100 Subject: [PATCH 11/14] CI: run on testing and check if cmake 3.19 can be used --- Jenkinsfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b461054..dab65a8 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -52,7 +52,7 @@ import com.esri.zrh.jenkins.ToolInfo // -- SETUP -psl.runsHere('production') +psl.runsHere('testing') env.PIPELINE_ARCHIVING_ALLOWED = "true" properties([ disableConcurrentBuilds() ]) @@ -119,7 +119,7 @@ def taskRunTest(cfg) { cepl.cleanCurrentDir() unstash(name: SOURCE_STASH) dir(path: 'build') { - papl.runCMakeBuild(SOURCE, 'build_and_run_tests', cfg, []) + papl.runCMakeBuild(SOURCE, 'build_and_run_tests', cfg, [], JenkinsTools.CMAKE319) } junit('build/test/palladio_test_report.xml') } @@ -134,7 +134,7 @@ def taskBuildPalladio(cfg) { cepl.cleanCurrentDir() unstash(name: SOURCE_STASH) dir(path: 'build') { - papl.runCMakeBuild(SOURCE, BUILD_TARGET, cfg, defs) + papl.runCMakeBuild(SOURCE, BUILD_TARGET, cfg, defs, JenkinsTools.CMAKE319) } final String artifactPattern = "palladio-*" From 5b38340978f6ec396de97fb94ce9dafe09213c5f Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Fri, 18 Nov 2022 09:36:41 +0100 Subject: [PATCH 12/14] CI: switch back to production --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index dab65a8..53b0e2e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -52,7 +52,7 @@ import com.esri.zrh.jenkins.ToolInfo // -- SETUP -psl.runsHere('testing') +psl.runsHere('production') env.PIPELINE_ARCHIVING_ALLOWED = "true" properties([ disableConcurrentBuilds() ]) From 6b38351bd900e5340cc9e051a8f8c810b46f8a52 Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Fri, 18 Nov 2022 09:40:12 +0100 Subject: [PATCH 13/14] CI: use replace instead of replaceAll --- Jenkinsfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 53b0e2e..842c263 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -142,7 +142,7 @@ def taskBuildPalladio(cfg) { dir(path: 'build'){ stashFile = cepl.findOneFile(artifactPattern) echo("stashFile: '${stashFile}'") - stash(includes: artifactPattern, name: "houdini${cfg.houdini.replaceAll('\\.', '_')}") + stash(includes: artifactPattern, name: "houdini${cfg.houdini.replace('.', '_')}") stashPath = "${stashFile.path}" echo("file path to stash: '${stashPath}'") } @@ -170,11 +170,11 @@ def taskCreateInstaller(cfg) { dir(path: 'build'){ dir(path: 'tmp'){ INSTALLER_HOUDINI_VERS.each { mv -> - unstash(name: "houdini${mv.replaceAll('\\.', '_')}") - def zipFile = cepl.findOneFile("*hdn${mv.replaceAll('\\.', '-')}*.zip") + unstash(name: "houdini${mv.replace('.', '_')}") + def zipFile = cepl.findOneFile("*hdn${mv.replace('.', '-')}*.zip") final String zipFileName = zipFile.name unzip(zipFile:zipFileName) - pyArgs += "-h${mv.replaceAll('\\.', '')} \"build\\tmp\\${zipFileName.take(zipFileName.lastIndexOf('.'))}\" " + pyArgs += "-h${mv.replace('.', '')} \"build\\tmp\\${zipFileName.take(zipFileName.lastIndexOf('.'))}\" " } } } From 75ca5dfae5f36b19d8a83763f715c4050087cb2f Mon Sep 17 00:00:00 2001 From: Christian Knieling Date: Fri, 18 Nov 2022 10:36:42 +0100 Subject: [PATCH 14/14] Hide json package in featuretree of installer --- deploy/templates/palladio.wxs.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/templates/palladio.wxs.in b/deploy/templates/palladio.wxs.in index e4b1072..db7ef13 100644 --- a/deploy/templates/palladio.wxs.in +++ b/deploy/templates/palladio.wxs.in @@ -42,7 +42,7 @@ ${PALLADIO_FOR_HOUDINI_FEATURE} - +