CMake package_archive target to create a .zip/.tar.bz2 package on mac/unix,
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 21 Mar 2011 16:42:21 +0000 (16:42 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Mon, 21 Mar 2011 16:42:21 +0000 (16:42 +0000)
to be used by buildbot.

GNUmakefile
build_files/cmake/packaging.cmake
build_files/package_spec/build_archive.py [new file with mode: 0755]

index 772cec3..42d7c33 100644 (file)
@@ -90,6 +90,10 @@ package_debian:
 package_pacman:
        cd build_files/package_spec/pacman ; MAKEFLAGS="-j$(NPROCS)" makepkg --asroot
 
+package_archive:
+       cd $(BUILD_DIR) ; make -s package_archive
+       @echo archive in "$(BUILD_DIR)/release"
+
 # forward build targets
 test:
        cd $(BUILD_DIR) ; ctest . --output-on-failure
index b21c13f..ee07857 100644 (file)
@@ -51,7 +51,35 @@ if(APPLE)
 
        # Libraries are bundled directly
        set(CPACK_COMPONENT_LIBRARIES_HIDDEN TRUE)
-endif(APPLE)
+endif()
 
 set(CPACK_PACKAGE_EXECUTABLES "blender")
 include(CPack)
+
+# Target for build_archive.py script, to automatically pass along
+# version, revision, platform, build directory
+macro(add_package_archive packagename extension)
+       set(build_archive python ${CMAKE_SOURCE_DIR}/build_files/package_spec/build_archive.py)
+       set(package_output ${CMAKE_BINARY_DIR}/release/${packagename}.${extension})
+
+       add_custom_target(package_archive DEPENDS ${package_output})
+
+       add_custom_command(
+               OUTPUT ${package_output}
+               COMMAND ${build_archive} ${packagename} ${extension} bin release
+               WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
+endmacro()
+
+if(APPLE)
+       add_package_archive(
+               "blender-${BLENDER_VERSION}-r${BUILD_REV}-OSX-${CMAKE_OSX_ARCHITECTURES}"
+               "zip")
+elseif(UNIX)
+       # platform name could be tweaked, to include glibc, and ensure processor is correct (i386 vs i686)
+       string(TOLOWER ${CMAKE_SYSTEM_NAME} PACKAGE_SYSTEM_NAME)
+
+       add_package_archive(
+               "blender-${BLENDER_VERSION}-r${BUILD_REV}-${PACKAGE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}"
+               "tar.bz2")
+endif()
+
diff --git a/build_files/package_spec/build_archive.py b/build_files/package_spec/build_archive.py
new file mode 100755 (executable)
index 0000000..79e42af
--- /dev/null
@@ -0,0 +1,69 @@
+#!/usr/bin/python
+
+import os
+import shutil
+import subprocess
+import sys
+
+# todo:
+# strip executables
+
+# get parameters
+if len(sys.argv) < 5:
+       sys.stderr.write('Excepted arguments: ./build_archive.py name extension install_dir output_dir')
+       sys.exit(1)
+
+package_name = sys.argv[1]
+extension = sys.argv[2]
+install_dir = sys.argv[3]
+output_dir = sys.argv[4]
+
+package_archive = os.path.join(output_dir, package_name + '.' + extension)
+package_dir = package_name
+
+# remove existing package with the same name
+try:
+       if os.path.exists(package_archive):
+               os.remove(package_archive)
+       if os.path.exists(package_dir):
+               shutil.rmtree(package_dir)
+except:
+       sys.stderr.write('Failed to clean up old package files: ' + sys.exc_info()[0] + '\n')
+       sys.exit(1)
+
+# create temporary package dir
+try:
+       shutil.copytree(install_dir, package_dir)
+
+       for f in os.listdir(package_dir):
+               if f.startswith('makes'):
+                       os.remove(os.path.join(package_dir, f))
+except:
+       sys.stderr.write('Failed to copy install directory: ' + sys.exc_info()[0] + '\n')
+       sys.exit(1)
+
+# create archive
+try:
+       if not os.path.exists(output_dir):
+               os.mkdir(output_dir)
+
+       if extension == 'zip':
+               archive_cmd = ['zip', '-9', '-r', package_archive, package_dir]
+       elif extension == 'tar.bz2':
+               archive_cmd = ['tar', 'cjf', package_archive, package_dir]
+       else:
+               sys.stderr.write('Unknown archive extension: ' + extension)
+               sys.exit(-1)
+
+       subprocess.call(archive_cmd)
+except:
+       sys.stderr.write('Failed to create package archive: ' + sys.exc_info()[0] + '\n')
+       sys.exit(1)
+
+# empty temporary package dir
+try:
+       shutil.rmtree(package_dir)
+except:
+       sys.stderr.write('Failed to clean up package directory: ' + sys.exc_info()[0] + '\n')
+       sys.exit(1)
+