make_dmg.sh 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. #!/bin/bash
  2. set -euo pipefail
  3. # Assembles an installation bundle from a built copy of Slic3r.
  4. # Requires PAR::Packer to be installed for the version of
  5. # perl copied.
  6. # Adapted from script written by bubnikv for Prusa3D.
  7. # Run from slic3r repo root directory.
  8. # While we might have a pp executable in our path, it might not be
  9. # using the perl binary we have in path, so make sure they belong
  10. # to the same Perl instance:
  11. if !(perl -Mlocal::lib=local-lib -MPAR::Packer -e1 2> /dev/null); then
  12. echo "The PAR::Packer module was not found; installing..."
  13. cpanm --local-lib local-lib PAR::Packer
  14. fi
  15. WD=$(dirname $0)
  16. appname=Slic3r
  17. # Determine if this is a tagged (release) commit.
  18. # Change the build id accordingly.
  19. if [ $(git describe --exact-match &>/dev/null) ]; then
  20. echo "This is a tagged build"
  21. SLIC3R_BUILD_ID=$(git describe)
  22. else
  23. # Get the current branch
  24. if [ ! -z ${GIT_BRANCH+x} ]; then
  25. echo "Setting to GIT_BRANCH"
  26. current_branch=$(echo $GIT_BRANCH | cut -d / -f 2)
  27. elif [ ! -z ${TRAVIS_BRANCH+x} ]; then
  28. echo "Setting to TRAVIS_BRANCH"
  29. current_branch=$TRAVIS_BRANCH
  30. elif [ ! -z ${APPVEYOR_REPO_BRANCH+x} ]; then
  31. echo "Setting to APPVEYOR_REPO_BRANCH"
  32. current_branch=$APPVEYOR_REPO_BRANCH
  33. else
  34. current_branch=$(git symbolic-ref HEAD | sed 's!refs\/heads\/!!')
  35. fi
  36. if [ "$current_branch" == "master" ]; then
  37. echo "This is a build of the master branch"
  38. SLIC3R_VERSION=$(grep "VERSION" xs/src/libslic3r/libslic3r.h | awk -F\" '{print $2}')
  39. SLIC3R_BUILD_ID=${SLIC3R_VERSION}-$(git rev-parse --short HEAD)
  40. else
  41. echo "This is a build of a non-master branch"
  42. appname=Slic3r-${current_branch}
  43. SLIC3R_BUILD_ID=${current_branch}-$(git rev-parse --short HEAD)
  44. fi
  45. fi
  46. dmgfile=slic3r-${SLIC3R_BUILD_ID}.dmg
  47. echo "DMG filename: ${dmgfile}"
  48. rm -rf $WD/_tmp
  49. mkdir -p $WD/_tmp
  50. # OSX Application folder shenanigans.
  51. appfolder="$WD/${appname}.app"
  52. macosfolder=$appfolder/Contents/MacOS
  53. resourcefolder=$appfolder/Contents/Resources
  54. plistfile=$appfolder/Contents/Info.plist
  55. PkgInfoContents="APPL????"
  56. source $WD/plist.sh
  57. # Our slic3r dir and location of perl
  58. eval $(perl -Mlocal::lib=local-lib)
  59. PERL_BIN=$(which perl)
  60. PP_BIN=$(which pp)
  61. SLIC3R_DIR=$(perl -MCwd=realpath -e "print realpath '${WD}/../../'")
  62. if [[ -d "${appfolder}" ]]; then
  63. echo "Deleting old working folder: ${appfolder}"
  64. rm -rf ${appfolder}
  65. fi
  66. if [[ -e "${dmgfile}" ]]; then
  67. echo "Deleting old dmg: ${dmgfile}"
  68. rm -rf ${dmgfile}
  69. fi
  70. echo "Creating new app folder: $appfolder"
  71. mkdir -p $appfolder
  72. mkdir -p $macosfolder
  73. mkdir -p $resourcefolder
  74. echo "Copying resources..."
  75. cp -rf $SLIC3R_DIR/var $resourcefolder/
  76. mv $resourcefolder/var/Slic3r.icns $resourcefolder
  77. mv $resourcefolder/var/stl.icns $resourcefolder
  78. mv $resourcefolder/var/gcode.icns $resourcefolder
  79. echo "Copying Slic3r..."
  80. cp $SLIC3R_DIR/slic3r.pl $macosfolder/slic3r.pl
  81. cp -fRP $SLIC3R_DIR/local-lib $macosfolder/local-lib
  82. cp -fRP $SLIC3R_DIR/lib/* $macosfolder/local-lib/lib/perl5/
  83. echo "Relocating Wx dylib paths..."
  84. mkdir $macosfolder/dylibs
  85. function relocate_dylibs {
  86. local bundle=$1
  87. chmod +w $bundle
  88. local dylib
  89. for dylib in $(otool -l $bundle | grep .dylib | grep -v /usr/lib | awk '{print $2}' | grep -v '^@'); do
  90. local dylib_dest="$macosfolder/dylibs/$(basename $dylib)"
  91. if [ ! -e $dylib_dest ]; then
  92. echo " relocating $dylib"
  93. cp $dylib $macosfolder/dylibs/
  94. relocate_dylibs $dylib_dest
  95. fi
  96. install_name_tool -change "$dylib" "@executable_path/dylibs/$(basename $dylib)" $bundle
  97. done
  98. }
  99. for bundle in $(find $macosfolder/local-lib/ \( -name '*.bundle' -or -name '*.dylib' \) -type f); do
  100. relocate_dylibs "$bundle"
  101. done
  102. echo "Copying startup script..."
  103. cp -f $WD/startup_script.sh $macosfolder/$appname
  104. chmod +x $macosfolder/$appname
  105. echo "Copying perl from $PERL_BIN"
  106. cp -f $PERL_BIN $macosfolder/perl-local
  107. chmod +w $macosfolder/perl-local
  108. relocate_dylibs $macosfolder/perl-local
  109. echo "Copying core modules"
  110. # Edit package/common/coreperl to add/remove core Perl modules added to this package, one per line.
  111. ${PP_BIN} \
  112. -M $(grep -v "^#" ${WD}/../common/coreperl | xargs | awk 'BEGIN { OFS=" -M "}; {$1=$1; print $0}') \
  113. -B -p -e "print 123" -o $WD/_tmp/bundle.par
  114. unzip -o $WD/_tmp/bundle.par -d $WD/_tmp/
  115. cp -rf $WD/_tmp/lib/* $macosfolder/local-lib/lib/perl5/
  116. echo "Cleaning bundle"
  117. rm -rf $macosfolder/local-lib/bin
  118. rm -rf $macosfolder/local-lib/man
  119. rm -f $macosfolder/local-lib/lib/perl5/Algorithm/*.pl
  120. rm -rf $macosfolder/local-lib/lib/perl5/unicore
  121. rm -rf $macosfolder/local-lib/lib/perl5/App
  122. rm -rf $macosfolder/local-lib/lib/perl5/Devel/CheckLib.pm
  123. rm -rf $macosfolder/local-lib/lib/perl5/ExtUtils
  124. rm -rf $macosfolder/local-lib/lib/perl5/Module/Build*
  125. rm -rf $macosfolder/local-lib/lib/perl5/TAP
  126. rm -rf $macosfolder/local-lib/lib/perl5/Test*
  127. find -d $macosfolder/local-lib -name '*.pod' -delete
  128. find -d $macosfolder/local-lib -name .packlist -delete
  129. find -d $macosfolder/local-lib -name .meta -exec rm -rf "{}" \;
  130. find -d $macosfolder/local-lib -name '*.h' -delete
  131. find -d $macosfolder/local-lib -name wxPerl.app -exec rm -rf "{}" \;
  132. find -d $macosfolder/local-lib -type d -path '*/Wx/*' \( -name WebView \
  133. -or -name DocView -or -name STC -or -name IPC \
  134. -or -name Calendar -or -name DataView \
  135. -or -name DateTime -or -name Media -or -name PerlTest \
  136. -or -name Ribbon \) -exec rm -rf "{}" \;
  137. find -d $macosfolder/local-lib -name libwx_osx_cocoau_ribbon-3.* -delete
  138. find -d $macosfolder/local-lib -name libwx_osx_cocoau_stc-3.* -delete
  139. find -d $macosfolder/local-lib -name libwx_osx_cocoau_webview-3.* -delete
  140. rm -rf $macosfolder/local-lib/lib/perl5/darwin-thread-multi-2level/Alien/wxWidgets/osx_cocoa_3_0_2_uni/include
  141. find -d $macosfolder/local-lib -type d -empty -delete
  142. make_plist
  143. echo $PkgInfoContents >$appfolder/Contents/PkgInfo
  144. KEYCHAIN_FILE_=${KEYCHAIN_FILE:-}
  145. KEYCHAIN_BASE64_=${KEYCHAIN_BASE64:-}
  146. KEYCHAIN_PASSWORD_=${KEYCHAIN_PASSWORD:-travis}
  147. KEYCHAIN_IDENTITY_=${KEYCHAIN_IDENTITY:-Developer ID Application: Alessandro Ranellucci (975MZ9YJL7)}
  148. # In case we were supplied a base64-encoded .p12 file instead of the path
  149. # to an existing keychain, create a temporary one
  150. if [[ -z "$KEYCHAIN_FILE_" && ! -z "$KEYCHAIN_BASE64_" ]]; then
  151. KEYCHAIN_FILE_=$WD/_tmp/build.keychain
  152. echo "Creating temporary keychain at ${KEYCHAIN_FILE_}"
  153. echo "$KEYCHAIN_BASE64_" | base64 --decode > "${KEYCHAIN_FILE_}.p12"
  154. security delete-keychain "$KEYCHAIN_FILE_" || true
  155. security create-keychain -p "${KEYCHAIN_PASSWORD_}" "$KEYCHAIN_FILE_"
  156. security set-keychain-settings -t 3600 -u "$KEYCHAIN_FILE_"
  157. security import "${KEYCHAIN_FILE_}.p12" -k "$KEYCHAIN_FILE_" -P "${KEYCHAIN_PASSWORD_}" -T /usr/bin/codesign
  158. security set-key-partition-list -S apple-tool:,apple: -s -k "${KEYCHAIN_PASSWORD_}" "$KEYCHAIN_FILE_"
  159. fi
  160. if [ ! -z $KEYCHAIN_FILE_ ]; then
  161. echo "Signing app..."
  162. chmod -R +w $macosfolder/*
  163. xattr -cr $appfolder
  164. security list-keychains -s "${KEYCHAIN_FILE_}"
  165. security default-keychain -s "${KEYCHAIN_FILE_}"
  166. security unlock-keychain -p "${KEYCHAIN_PASSWORD_}" "${KEYCHAIN_FILE_}"
  167. codesign --sign "${KEYCHAIN_IDENTITY_}" --deep "$appfolder"
  168. else
  169. echo "No KEYCHAIN_FILE or KEYCHAIN_BASE64 env variable; skipping codesign"
  170. fi
  171. echo "Creating dmg file...."
  172. hdiutil create -fs HFS+ -srcfolder "$appfolder" -volname "$appname" "$WD/_tmp/$dmgfile"
  173. # Compress the DMG image
  174. hdiutil convert "$WD/_tmp/$dmgfile" -format UDZO -imagekey zlib-level=9 -o "$dmgfile"
  175. if [ ! -z $KEYCHAIN_FILE_ ]; then
  176. echo "Signing app dmg..."
  177. chmod +w $dmgfile
  178. security list-keychains -s "${KEYCHAIN_FILE_}"
  179. security default-keychain -s "${KEYCHAIN_FILE_}"
  180. security unlock-keychain -p "${KEYCHAIN_PASSWORD_}" "${KEYCHAIN_FILE_}"
  181. codesign --sign "${KEYCHAIN_IDENTITY_}" "$dmgfile"
  182. fi
  183. rm -rf $WD/_tmp