X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=package.sh;h=dca701b177b8800edbf95f733fe2a907544f44e4;hb=5896100421a2c928f71085b01124888b07abe665;hp=1bad739c00d4e63032c724c747baf8bdb189b2ba;hpb=10f17b7e1ca91ce8731a39d19dab556544afbf55;p=cura.git diff --git a/package.sh b/package.sh index 1bad739c..dca701b1 100755 --- a/package.sh +++ b/package.sh @@ -1,5 +1,8 @@ #!/usr/bin/env bash +set -e +set -u + # This script is to package the Cura package for Windows/Linux and Mac OS X # This script should run under Linux and Mac OS X, as well as Windows with Cygwin. @@ -13,20 +16,33 @@ BUILD_TARGET=${1:-none} #BUILD_TARGET=darwin #BUILD_TARGET=debian_i386 #BUILD_TARGET=debian_amd64 +#BUILD_TARGET=debian_armhf #BUILD_TARGET=freebsd ##Do we need to create the final archive ARCHIVE_FOR_DISTRIBUTION=1 ##Which version name are we appending to the final archive -export BUILD_NAME=14.06-RC5 -TARGET_DIR=Cura-${BUILD_NAME}-${BUILD_TARGET} + + +##Version +version_file="./Cura/version" +while IFS= read -r line +do + export BUILD_VERSION="$line" +done <"$version_file" +TARGET_DIR=Cura-${BUILD_VERSION}-${BUILD_TARGET} + +##Git commit +GIT_HASH=$(git rev-parse --short=4 HEAD) + +export FULL_VERSION=${BUILD_VERSION}-${GIT_HASH} ##Which versions of external programs to use WIN_PORTABLE_PY_VERSION=2.7.2.1 ##Which CuraEngine to use -if [ -z ${CURA_ENGINE_REPO} ] ; then - CURA_ENGINE_REPO="https://github.com/Ultimaker/CuraEngine" +if [ -z ${CURA_ENGINE_REPO:-} ] ; then + CURA_ENGINE_REPO="https://code.alephobjects.com/diffusion/CE/curaengine.git" fi ############################# @@ -66,30 +82,54 @@ function extract fi } +function gitClone +{ + echo "Cloning $1 into $2" + if [ -d $2 ]; then + cd $2 + git clean -dfx + git reset --hard + git pull + cd - + else + git clone $1 $2 + fi +} + ############################# # Actual build script ############################# if [ "$BUILD_TARGET" = "none" ]; then echo "You need to specify a build target with:" echo "$0 win32" - echo "$0 debian_i368" + echo "$0 debian_i386" echo "$0 debian_amd64" + echo "$0 debian_armhf" echo "$0 darwin" echo "$0 freebsd" + echo "$0 fedora # current system" + echo "$0 fedora \"mock_config_file\" ... # different system(s)" exit 0 fi +if [ -z `which make` ]; then + MAKE=mingw32-make +else + MAKE=make +fi + # Change working directory to the directory the script is in # http://stackoverflow.com/a/246128 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -cd $SCRIPT_DIR +cd "$SCRIPT_DIR" checkTool git "git: http://git-scm.com/" checkTool curl "curl: http://curl.haxx.se/" if [ $BUILD_TARGET = "win32" ]; then + checkTool avr-gcc "avr-gcc: http://winavr.sourceforge.net/ " #Check if we have 7zip, needed to extract and packup a bunch of packages for windows. checkTool 7z "7zip: http://www.7-zip.org/" - checkTool mingw32-make "mingw: http://www.mingw.org/" + checkTool $MAKE "mingw: http://www.mingw.org/" fi #For building under MacOS we need gnutar instead of tar if [ -z `which gnutar` ]; then @@ -98,13 +138,20 @@ else TAR=gnutar fi +############################# +# Build the required firmwares +############################# + +gitClone "https://github.com/Ultimaker/cura-binary-data" _cura_binary_data + +cp -v _cura_binary_data/cura/resources/firmware/* resources/firmware/ ############################# # Darwin ############################# if [ "$BUILD_TARGET" = "darwin" ]; then - TARGET_DIR=Cura-${BUILD_NAME}-MacOS + TARGET_DIR=Cura-${BUILD_VERSION}-MacOS rm -rf scripts/darwin/build rm -rf scripts/darwin/dist @@ -117,11 +164,11 @@ if [ "$BUILD_TARGET" = "darwin" ]; then fi #Add cura version file (should read the version from the bundle with pyobjc, but will figure that out later) - echo $BUILD_NAME > scripts/darwin/dist/Cura.app/Contents/Resources/version + echo $BUILD_VERSION > scripts/darwin/dist/Cura.app/Contents/Resources/version rm -rf CuraEngine - git clone ${CURA_ENGINE_REPO} + gitClone ${CURA_ENGINE_REPO} CuraEngine if [ $? != 0 ]; then echo "Failed to clone CuraEngine"; exit 1; fi - make -C CuraEngine VERSION=${BUILD_NAME} + $MAKE -C CuraEngine VERSION=${BUILD_VERSION} if [ $? != 0 ]; then echo "Failed to build CuraEngine"; exit 1; fi cp CuraEngine/build/CuraEngine scripts/darwin/dist/Cura.app/Contents/Resources/CuraEngine @@ -137,34 +184,73 @@ if [ "$BUILD_TARGET" = "darwin" ]; then cd .. # Create sparse image for distribution - hdiutil detach /Volumes/Cura\ -\ Ultimaker/ + hdiutil detach /Volumes/Cura\ -\ Lulzbot/ || true rm -rf Cura.dmg.sparseimage hdiutil convert DmgTemplateCompressed.dmg -format UDSP -o Cura.dmg hdiutil resize -size 500m Cura.dmg.sparseimage hdiutil attach Cura.dmg.sparseimage - cp -a dist/Cura.app /Volumes/Cura\ -\ Ultimaker/Cura/ - hdiutil detach /Volumes/Cura\ -\ Ultimaker + cp -a dist/Cura.app /Volumes/Cura\ -\ Lulzbot/Cura/ + hdiutil detach /Volumes/Cura\ -\ Lulzbot hdiutil convert Cura.dmg.sparseimage -format UDZO -imagekey zlib-level=9 -ov -o ../../${TARGET_DIR}.dmg exit fi +############################# +# FreeBSD part by CeDeROM +############################# + +if [ "$BUILD_TARGET" = "freebsd" ]; then + export CXX="c++" + gitClone https://github.com/GreatFruitOmsk/Power Power + gitClone ${CURA_ENGINE_REPO} CuraEngine + if [ $? != 0 ]; then echo "Failed to clone CuraEngine"; exit 1; fi + gmake -j4 -C CuraEngine VERSION=${BUILD_VERSION} + if [ $? != 0 ]; then echo "Failed to build CuraEngine"; exit 1; fi + rm -rf scripts/freebsd/dist + mkdir -p scripts/freebsd/dist/share/cura + mkdir -p scripts/freebsd/dist/share/applications + mkdir -p scripts/freebsd/dist/bin + cp -a Cura scripts/freebsd/dist/share/cura/ + cp -a resources scripts/freebsd/dist/share/cura/ + cp -a plugins scripts/freebsd/dist/share/cura/ + cp -a CuraEngine/build/CuraEngine scripts/freebsd/dist/share/cura/ + cp scripts/freebsd/cura.py scripts/freebsd/dist/share/cura/ + cp scripts/freebsd/cura.desktop scripts/freebsd/dist/share/applications/ + cp scripts/freebsd/cura scripts/freebsd/dist/bin/ + cp -a Power/power scripts/freebsd/dist/share/cura/ + echo $BUILD_VERSION > scripts/freebsd/dist/share/cura/Cura/version + #Create file list (pkg-plist) + cd scripts/freebsd/dist + find * -type f > ../pkg-plist + DIRLVL=20; while [ $DIRLVL -ge 0 ]; do + DIRS=`find share/cura -type d -depth $DIRLVL` + for DIR in $DIRS; do + echo "@dirrm $DIR" >> ../pkg-plist + done + DIRLVL=`expr $DIRLVL - 1` + done + cd .. + # Create archive or package if root + if [ `whoami` == "root" ]; then + echo "Are you root? Use the Port Luke! :-)" + else + echo "You are not root, building simple package archive..." + pwd + $TAR czf ../../${TARGET_DIR}.tar.gz dist/** + fi + exit +fi + ############################# # Debian 32bit .deb ############################# if [ "$BUILD_TARGET" = "debian_i386" ]; then export CXX="g++ -m32" - if [ ! -d "Power" ]; then - git clone https://github.com/GreatFruitOmsk/Power - else - cd Power - git pull - cd .. - fi - rm -rf CuraEngine - git clone ${CURA_ENGINE_REPO} + gitClone https://github.com/GreatFruitOmsk/Power Power + gitClone ${CURA_ENGINE_REPO} CuraEngine if [ $? != 0 ]; then echo "Failed to clone CuraEngine"; exit 1; fi - make -C CuraEngine VERSION=${BUILD_NAME} + $MAKE -C CuraEngine VERSION=${BUILD_VERSION} if [ $? != 0 ]; then echo "Failed to build CuraEngine"; exit 1; fi rm -rf scripts/linux/${BUILD_TARGET}/usr/share/cura mkdir -p scripts/linux/${BUILD_TARGET}/usr/share/cura @@ -174,12 +260,13 @@ if [ "$BUILD_TARGET" = "debian_i386" ]; then cp -a CuraEngine/build/CuraEngine scripts/linux/${BUILD_TARGET}/usr/share/cura/ cp scripts/linux/cura.py scripts/linux/${BUILD_TARGET}/usr/share/cura/ cp -a Power/power scripts/linux/${BUILD_TARGET}/usr/share/cura/ - echo $BUILD_NAME > scripts/linux/${BUILD_TARGET}/usr/share/cura/Cura/version + echo $BUILD_VERSION > scripts/linux/${BUILD_TARGET}/usr/share/cura/Cura/version + cat scripts/linux/debian_control | sed "s/\[BUILD_VERSION\]/${FULL_VERSION}/" | sed 's/\[ARCH\]/i386/' > scripts/linux/${BUILD_TARGET}/DEBIAN/control sudo chown root:root scripts/linux/${BUILD_TARGET} -R sudo chmod 755 scripts/linux/${BUILD_TARGET}/usr -R sudo chmod 755 scripts/linux/${BUILD_TARGET}/DEBIAN -R cd scripts/linux - dpkg-deb --build ${BUILD_TARGET} $(dirname ${TARGET_DIR})/cura_${BUILD_NAME}-${BUILD_TARGET}.deb + dpkg-deb -Zgzip --build ${BUILD_TARGET} $(dirname ${TARGET_DIR})/cura_${FULL_VERSION}_i386.deb sudo chown `id -un`:`id -gn` ${BUILD_TARGET} -R exit fi @@ -190,17 +277,40 @@ fi if [ "$BUILD_TARGET" = "debian_amd64" ]; then export CXX="g++ -m64" - if [ ! -d "Power" ]; then - git clone https://github.com/GreatFruitOmsk/Power - else - cd Power - git pull - cd .. - fi - rm -rf CuraEngine - git clone ${CURA_ENGINE_REPO} + gitClone https://github.com/GreatFruitOmsk/Power Power + gitClone ${CURA_ENGINE_REPO} CuraEngine + if [ $? != 0 ]; then echo "Failed to clone CuraEngine"; exit 1; fi + $MAKE -C CuraEngine VERSION=${BUILD_VERSION} + if [ $? != 0 ]; then echo "Failed to build CuraEngine"; exit 1; fi + rm -rf scripts/linux/${BUILD_TARGET}/usr/share/cura + mkdir -p scripts/linux/${BUILD_TARGET}/usr/share/cura + cp -a Cura scripts/linux/${BUILD_TARGET}/usr/share/cura/ + cp -a resources scripts/linux/${BUILD_TARGET}/usr/share/cura/ + cp -a plugins scripts/linux/${BUILD_TARGET}/usr/share/cura/ + cp -a CuraEngine/build/CuraEngine scripts/linux/${BUILD_TARGET}/usr/share/cura/ + cp scripts/linux/cura.py scripts/linux/${BUILD_TARGET}/usr/share/cura/ + cp -a Power/power scripts/linux/${BUILD_TARGET}/usr/share/cura/ + echo $BUILD_VERSION > scripts/linux/${BUILD_TARGET}/usr/share/cura/Cura/version + cat scripts/linux/debian_control | sed "s/\[BUILD_VERSION\]/${FULL_VERSION}/" | sed 's/\[ARCH\]/amd64/' > scripts/linux/${BUILD_TARGET}/DEBIAN/control + sudo chown root:root scripts/linux/${BUILD_TARGET} -R + sudo chmod 755 scripts/linux/${BUILD_TARGET}/usr -R + sudo chmod 755 scripts/linux/${BUILD_TARGET}/DEBIAN -R + cd scripts/linux + dpkg-deb -Zgzip --build ${BUILD_TARGET} $(dirname ${TARGET_DIR})/cura_${FULL_VERSION}_amd64.deb + sudo chown `id -un`:`id -gn` ${BUILD_TARGET} -R + exit +fi + +############################# +# Debian armhf .deb +############################# + +if [ "$BUILD_TARGET" = "debian_armhf" ]; then + export CXX="g++" + gitClone https://github.com/GreatFruitOmsk/Power Power + gitClone ${CURA_ENGINE_REPO} CuraEngine if [ $? != 0 ]; then echo "Failed to clone CuraEngine"; exit 1; fi - make -C CuraEngine + $MAKE -C CuraEngine VERSION=${BUILD_VERSION} if [ $? != 0 ]; then echo "Failed to build CuraEngine"; exit 1; fi rm -rf scripts/linux/${BUILD_TARGET}/usr/share/cura mkdir -p scripts/linux/${BUILD_TARGET}/usr/share/cura @@ -210,16 +320,143 @@ if [ "$BUILD_TARGET" = "debian_amd64" ]; then cp -a CuraEngine/build/CuraEngine scripts/linux/${BUILD_TARGET}/usr/share/cura/ cp scripts/linux/cura.py scripts/linux/${BUILD_TARGET}/usr/share/cura/ cp -a Power/power scripts/linux/${BUILD_TARGET}/usr/share/cura/ - echo $BUILD_NAME > scripts/linux/${BUILD_TARGET}/usr/share/cura/Cura/version + echo $BUILD_VERSION > scripts/linux/${BUILD_TARGET}/usr/share/cura/Cura/version + cat scripts/linux/debian_control | sed "s/\[BUILD_VERSION\]/${FULL_VERSION}/" | sed 's/\[ARCH\]/armhf/' > scripts/linux/${BUILD_TARGET}/DEBIAN/control sudo chown root:root scripts/linux/${BUILD_TARGET} -R sudo chmod 755 scripts/linux/${BUILD_TARGET}/usr -R sudo chmod 755 scripts/linux/${BUILD_TARGET}/DEBIAN -R cd scripts/linux - dpkg-deb --build ${BUILD_TARGET} $(dirname ${TARGET_DIR})/cura_${BUILD_NAME}-${BUILD_TARGET}.deb + dpkg-deb --build ${BUILD_TARGET} $(dirname ${TARGET_DIR})/cura_${BUILD_VERSION}-${BUILD_TARGET}.deb sudo chown `id -un`:`id -gn` ${BUILD_TARGET} -R exit fi +############################# +# Fedora Generic +############################# + +function sanitiseVersion() { + local _version="$1" + echo "${_version//-/.}" +} + +function fedoraCreateSRPM() { + local _curaName="$1" + local _version="$(sanitiseVersion "$2")" + local _srcSpecFile="$3" + local _srcSpecFileRelease="$4" + local _dstSrpmDir="$5" + + local _dstTarSources="$HOME/rpmbuild/SOURCES/$_curaName-$_version.tar.gz" + local _dstSpec="$HOME/rpmbuild/SPECS/$_curaName-$_version.spec" + + local _namePower="Power" + local _nameCuraEngine="CuraEngine" + + gitClone "https://github.com/GreatFruitOmsk/Power" "$_namePower" + gitClone "$CURA_ENGINE_REPO" "$_nameCuraEngine" + + cd "$_namePower" + local _gitPower="$(git rev-list -1 HEAD)" + cd - + + cd "$_nameCuraEngine" + local _gitCuraEngine="$(git rev-list -1 HEAD)" + cd - + + local _gitCura="$(git rev-list -1 HEAD)" + + rpmdev-setuptree + + rm -fv "$_dstTarSources" + tar \ + --exclude-vcs \ + --transform "s#^#$_curaName-$_version/#" \ + -zcvf "$_dstTarSources" \ + "$_nameCuraEngine" \ + "$_namePower" \ + Cura \ + resources \ + plugins \ + scripts/linux/cura.py \ + scripts/linux/fedora/usr + + sed \ + -e "s#__curaName__#$_curaName#" \ + -e "s#__version__#$_version#" \ + -e "s#__gitCura__#$_gitCura#" \ + -e "s#__gitCuraEngine__#$_gitCuraEngine#" \ + -e "s#__gitPower__#$_gitPower#" \ + -e "s#__basedir__#scripts/linux/fedora#" \ + "$_srcSpecFile" \ + > "$_dstSpec" + + rpmbuild -bs "$_dstSpec" + + mkdir -pv "$_dstSrpmDir" + cp -v \ + "$HOME/rpmbuild/SRPMS/$_curaName-$_version-$_srcSpecFileRelease.src.rpm" \ + "$_dstSrpmDir" +} + +function buildFedora() { + local _nameForRpm="Cura" + local _versionForRpm="$(sanitiseVersion "$BUILD_VERSION")" + + # + # SRPM + # + + local _srcSpecFile="scripts/linux/fedora/rpm.spec" + local _srcSpecFileRelease="$(rpmspec -P "$_srcSpecFile" | grep -E '^Release:'|awk '{print $NF}')" + local _dstSrpmDir="scripts/linux/fedora/SRPMS" + + fedoraCreateSRPM \ + "$_nameForRpm" \ + "$_versionForRpm" \ + "$_srcSpecFile" \ + "$_srcSpecFileRelease" \ + "$_dstSrpmDir" + + # + # RPM + # + + local _srpmFile="$_dstSrpmDir/$_nameForRpm-$_versionForRpm-$_srcSpecFileRelease.src.rpm" + local _dstRpmDir="scripts/linux/fedora/RPMS" + + while [ $# -ne 0 ]; do + local _mockRelease="$(basename "${1%\.cfg}")" + local _mockReleaseArg="" + if [ -n "$_mockRelease" ]; then + _mockReleaseArg="-r $_mockRelease" + fi + + mkdir -pv "$_dstRpmDir/$_mockRelease" + mock \ + $_mockReleaseArg \ + --resultdir="$_dstRpmDir/$_mockRelease" \ + "$_srpmFile" + + shift 1 + done +} + +############################# +# Fedora RPMs +############################# + +if [ "$BUILD_TARGET" = "fedora" ]; then + shift 1 # skip "fedora" arg + + if [ $# -eq 0 ]; then + "$0" "$BUILD_TARGET" "" + else + buildFedora "${@}" + fi + + exit +fi ############################# # Rest @@ -240,10 +477,9 @@ if [ $BUILD_TARGET = "win32" ]; then downloadURL http://sourceforge.net/projects/comtypes/files/comtypes/0.6.2/comtypes-0.6.2.win32.exe downloadURL http://www.uwe-sieber.de/files/ejectmedia.zip #Get the power module for python - rm -rf Power - git clone https://github.com/GreatFruitOmsk/Power - rm -rf CuraEngine - git clone ${CURA_ENGINE_REPO} + gitClone https://github.com/GreatFruitOmsk/Power Power + if [ $? != 0 ]; then echo "Failed to clone Power"; exit 1; fi + gitClone ${CURA_ENGINE_REPO} CuraEngine if [ $? != 0 ]; then echo "Failed to clone CuraEngine"; exit 1; fi fi @@ -255,6 +491,12 @@ mkdir -p ${TARGET_DIR} rm -f log.txt if [ $BUILD_TARGET = "win32" ]; then + if [ -z `which i686-w64-mingw32-g++` ]; then + CXX=g++ + else + CXX=i686-w64-mingw32-g++ + fi + #For windows extract portable python to include it. extract PortablePython_${WIN_PORTABLE_PY_VERSION}.exe \$_OUTDIR/App extract PortablePython_${WIN_PORTABLE_PY_VERSION}.exe \$_OUTDIR/Lib/site-packages @@ -281,6 +523,8 @@ if [ $BUILD_TARGET = "win32" ]; then #mv ffmpeg-20120927-git-13f0cd6-win32-static/bin/ffmpeg.exe ${TARGET_DIR}/Cura/ #mv ffmpeg-20120927-git-13f0cd6-win32-static/licenses ${TARGET_DIR}/Cura/ffmpeg-licenses/ mv Win32/EjectMedia.exe ${TARGET_DIR}/Cura/ + cp -a scripts/win32/nsisPlugins/libgcc_s_dw2-1.dll ${TARGET_DIR} + cp -a scripts/win32/nsisPlugins/libstdc++-6.dll ${TARGET_DIR} rm -rf Power/ rm -rf \$_OUTDIR @@ -303,7 +547,7 @@ if [ $BUILD_TARGET = "win32" ]; then rm -rf ${TARGET_DIR}/python/Lib/OpenGL/DLLS/gle* #Build the C++ engine - mingw32-make -C CuraEngine VERSION=${BUILD_NAME} + $MAKE -C CuraEngine VERSION=${BUILD_VERSION} OS=Windows_NT CXX=${CXX} if [ $? != 0 ]; then echo "Failed to build CuraEngine"; exit 1; fi fi @@ -313,14 +557,15 @@ cp -a Cura/* ${TARGET_DIR}/Cura cp -a resources/* ${TARGET_DIR}/resources cp -a plugins/* ${TARGET_DIR}/plugins #Add cura version file -echo $BUILD_NAME > ${TARGET_DIR}/Cura/version +echo $BUILD_VERSION > ${TARGET_DIR}/Cura/version #add script files if [ $BUILD_TARGET = "win32" ]; then cp -a scripts/${BUILD_TARGET}/*.bat $TARGET_DIR/ cp CuraEngine/build/CuraEngine.exe $TARGET_DIR -else - cp -a scripts/${BUILD_TARGET}/*.sh $TARGET_DIR/ + cp /usr/lib/gcc/i686-w64-mingw32/4.8/libgcc_s_sjlj-1.dll $TARGET_DIR + cp /usr/i686-w64-mingw32/lib/libwinpthread-1.dll $TARGET_DIR + cp /usr/lib/gcc/i686-w64-mingw32/4.8/libstdc++-6.dll $TARGET_DIR fi #package the result @@ -335,16 +580,16 @@ if (( ${ARCHIVE_FOR_DISTRIBUTION} )); then #if we have wine, try to run our nsis script. rm -rf scripts/win32/dist ln -sf `pwd`/${TARGET_DIR} scripts/win32/dist - wine ~/.wine/drive_c/Program\ Files/NSIS/makensis.exe /DVERSION=${BUILD_NAME} scripts/win32/installer.nsi + wine ~/.wine/drive_c/Program\ Files\ \(x86\)/NSIS/makensis.exe /DVERSION=${BUILD_VERSION} scripts/win32/installer.nsi if [ $? != 0 ]; then echo "Failed to package NSIS installer"; exit 1; fi - mv scripts/win32/Cura_${BUILD_NAME}.exe ./ + mv scripts/win32/Cura_${FULL_VERSION}.exe ./ fi if [ -f '/c/Program Files (x86)/NSIS/makensis.exe' ]; then rm -rf scripts/win32/dist - mv `pwd`/${TARGET_DIR} scripts/win32/dist - '/c/Program Files (x86)/NSIS/makensis.exe' -DVERSION=${BUILD_NAME} 'scripts/win32/installer.nsi' >> log.txt + mv "`pwd`/${TARGET_DIR}" scripts/win32/dist + '/c/Program Files (x86)/NSIS/makensis.exe' -DVERSION=${BUILD_VERSION} 'scripts/win32/installer.nsi' >> log.txt if [ $? != 0 ]; then echo "Failed to package NSIS installer"; exit 1; fi - mv scripts/win32/Cura_${BUILD_NAME}.exe ./ + mv scripts/win32/Cura_${BUILD_VERSION}.exe ./ fi else echo "Archiving to ${TARGET_DIR}.tar.gz"