chiark / gitweb /
Fix pyserial 3.0 compatibility issue
[cura.git] / package.sh
index 3109402f6fd59d648cb38638be7be64512b366ff..dca701b177b8800edbf95f733fe2a907544f44e4 100755 (executable)
@@ -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.
 
@@ -19,21 +22,27 @@ BUILD_TARGET=${1:-none}
 ##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.10-RC4
-TARGET_DIR=Cura-${BUILD_NAME}-${BUILD_TARGET}
 
-##Revision
-export REVISION=1.18
+
+##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/alephobjects/CuraEngine"
+if [ -z ${CURA_ENGINE_REPO:-} ] ; then
+       CURA_ENGINE_REPO="https://code.alephobjects.com/diffusion/CE/curaengine.git"
 fi
 
 #############################
@@ -73,6 +82,20 @@ 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
 #############################
@@ -84,6 +107,8 @@ if [ "$BUILD_TARGET" = "none" ]; then
        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
 
@@ -101,6 +126,7 @@ 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 $MAKE "mingw: http://www.mingw.org/"
@@ -112,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
@@ -131,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
 
@@ -151,7 +184,7 @@ if [ "$BUILD_TARGET" = "darwin" ]; then
        cd ..
 
        # Create sparse image for distribution
-       hdiutil detach /Volumes/Cura\ -\ Lulzbot/
+       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
@@ -168,18 +201,10 @@ fi
 
 if [ "$BUILD_TARGET" = "freebsd" ]; then
        export CXX="c++"
-       rm -rf Power
-       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
-       gmake -j4 -C CuraEngine VERSION=${BUILD_NAME}
+       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
@@ -193,7 +218,7 @@ if [ "$BUILD_TARGET" = "freebsd" ]; then
        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_NAME > scripts/freebsd/dist/share/cura/Cura/version
+       echo $BUILD_VERSION > scripts/freebsd/dist/share/cura/Cura/version
        #Create file list (pkg-plist)
        cd scripts/freebsd/dist
        find * -type f > ../pkg-plist
@@ -222,17 +247,10 @@ fi
 
 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
@@ -242,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 -Zgzip --build ${BUILD_TARGET} $(dirname ${TARGET_DIR})/cura_${BUILD_NAME}-${REVISION}-${GIT_HASH}_i386.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
@@ -258,17 +277,10 @@ 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_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
@@ -278,12 +290,13 @@ 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\]/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_${BUILD_NAME}-${REVISION}-${GIT_HASH}_amd64.deb
+       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
@@ -294,17 +307,10 @@ fi
 
 if [ "$BUILD_TARGET" = "debian_armhf" ]; then
     export CXX="g++"
-       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
@@ -314,16 +320,144 @@ if [ "$BUILD_TARGET" = "debian_armhf" ]; 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
 #############################
@@ -343,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
 
@@ -414,7 +547,7 @@ if [ $BUILD_TARGET = "win32" ]; then
        rm -rf ${TARGET_DIR}/python/Lib/OpenGL/DLLS/gle*
 
     #Build the C++ engine
-       $MAKE -C CuraEngine VERSION=${BUILD_NAME} OS=Windows_NT CXX=${CXX}
+       $MAKE -C CuraEngine VERSION=${BUILD_VERSION} OS=Windows_NT CXX=${CXX}
     if [ $? != 0 ]; then echo "Failed to build CuraEngine"; exit 1; fi
 fi
 
@@ -424,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
@@ -446,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}-${REVISION}-${GIT_HASH}.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"