openscad/scripts/makepkg.sh

490 lines
13 KiB
Bash

#!/usr/bin/env bash
#
# This script creates a package of OpenSCAD for easy installation and
# deinstallation.
#
# Mac .dmg
# Linux gdebi .deb
# Windows MSYS .exe/.zip
# Windows cross build MXE .exe/.zip
#
# The script will create a file called openscad-<versionstring>.<extension>
# under $DEPLOYDIR which is typically openscad/bin/host-triple
# This means you can build packages for multiple targets within one tree.
#
# Usage: make-pkg.sh [-dryrun]
# -dryrun Quickly build a dummy openscad.exe file to test this release script
check_prereq_mxe()
{
MAKENSIS=
if [ "`command -v makensis`" ]; then
MAKENSIS=makensis
elif [ "`command -v i686-pc-mingw32-makensis`" ]; then
# we cant find systems nsis so look for the MXE's 32 bit version.
MAKENSIS=i686-pc-mingw32-makensis
else
echo "makensis not found. please install nsis on your system."
echo "(for example, on debian linux, try apt-get install nsis)"
exit 1
fi
}
update_mcad()
{
if [ ! -e $OPENSCADDIR/libraries/MCAD/__init__.py ]; then
echo "Downloading MCAD"
git submodule init
git submodule update
else
echo "MCAD found:" $OPENSCADDIR/libraries/MCAD
fi
if [ -d .git ]; then
git submodule update
fi
}
verify_binary_generic()
{
run ls $DEPLOYDIR/openscad
}
verify_binary_darwin()
{
run ls $DEPLOYDIR/OpenSCAD.app/Contents/MacOS/OpenSCAD
}
verify_binary_mxe()
{
run ls $DEPLOYDIR/openscad.com
run ls $DEPLOYDIR/openscad.exe
}
verify_binary_linux()
{
if [ ! -e $BUILDDIR/$MAKE_TARGET/openscad ]; then
echo "cant find $MAKE_TARGET/openscad. build failed. stopping."
exit 1
fi
}
setup_directories_generic()
{
bprefix=$BUILDDIR/openscad-$VERSION
EXAMPLESDIR=$bprefix/examples/
LIBRARYDIR=$bprefix/libraries/
FONTDIR=$bprefix/fonts/
TRANSLATIONDIR=$bprefix/locale/
COLORSCHEMESDIR=$bprefix/color-schemes/
if [ -e $bprefix ]; then
rm -rf $bprefix
fi
mkdir $bprefix
}
setup_directories_darwin()
{
EXAMPLESDIR=OpenSCAD.app/Contents/Resources/examples
LIBRARYDIR=OpenSCAD.app/Contents/Resources/libraries
FONTDIR=OpenSCAD.app/Contents/Resources/fonts
TRANSLATIONDIR=OpenSCAD.app/Contents/Resources/locale
COLORSCHEMESDIR=OpenSCAD.app/Contents/Resources/color-schemes
}
copy_examples_generic()
{
cd $OPENSCADDIR
echo $EXAMPLESDIR
mkdir -p $EXAMPLESDIR
rm -f examples.tar
tar cf examples.tar examples
ls -l examples.tar
cd $EXAMPLESDIR/.. && tar xf $OPENSCADDIR/examples.tar && cd $OPENSCADDIR
rm -f examples.tar
chmod -R 644 $EXAMPLESDIR/*/*
}
copy_fonts()
{
mkdir -p $FONTDIR
cp -a fonts/10-liberation.conf $FONTDIR
cp -a fonts/Liberation-2.00.1 $FONTDIR
}
copy_fonts_darwin()
{
copy_fonts_generic
cp -a fonts/05-osx-fonts.conf $FONTDIR
cp -a fonts-osx/* $FONTDIR
}
copy_fonts_mxe()
{
copy_fonts_generic
cp -a $MXETARGETDIR/etc/fonts/ "$FONTDIR"
}
create_package_darwin()
{
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $VERSIONDATE" OpenSCAD.app/Contents/Info.plist
macdeployqt OpenSCAD.app -dmg -no-strip
mv OpenSCAD.dmg OpenSCAD-$VERSION.dmg
hdiutil internet-enable -yes -quiet OpenSCAD-$VERSION.dmg
echo "Binary created: OpenSCAD-$VERSION.dmg"
}
create_package_msys()
{
cd $OPENSCADDIR
cd $BUILDDIR
echo "QT5 deployment, dll and other files copying..."
windeployqt $MAKE_TARGET/openscad.exe
bits=64
if [ $OPENSCAD_BUILD_TARGET_ARCH = i686 ]; then
bits=32
fi
flprefix=/mingw$bits/bin/
echo MSYS2, dll copying...
echo from $flprefix
echo to $BUILDDIR/$MAKE_TARGET
fl=
boostlist="filesystem program_options regex system thread"
liblist="mpfr-4 gmp-10 gmpxx-4 opencsg-1 harfbuzz-0 harfbuzz-gobject-0 glib-2.0-0"
liblist="$liblist CGAL CGAL_Core fontconfig-1 expat-1 bz2-1 intl-8 iconv-2"
liblist="$liblist pcre16-0 png16-16 icudt55 freetype-6"
dlist="glew32 opengl qscintilla2 zlib1 jsiosdjfiosdjf Qt5PrintSupport"
for file in $boostlist; do fl="$fl libboost_"$file"-mt.dll"; done
for file in $liblist; do fl="$fl lib"$file".dll"; done
for file in $dlist; do fl="$fl "$file".dll"; done
for dllfile in $fl; do
copyfail $flprefix/$dllfile /$BUILDDIR/$MAKE_TARGET/
done
ARCH_INDICATOR=Msys2-x86-64
if [ $OPENSCAD_BUILD_TARGET_ARCH = i686 ]; then
ARCH_INDICATOR=Msys2-x86-32
fi
BINFILE=$BUILDDIR/OpenSCAD-$VERSION-$ARCH_INDICATOR.zip
INSTFILE=$BUILDDIR/OpenSCAD-$VERSION-$ARCH_INDICATOR-Installer.exe
echo
echo "Copying main binary .exe, .com, and dlls"
echo "from $BUILDDIR/$MAKE_TARGET"
echo "to $BUILDDIR/openscad-$VERSION"
TMPTAR=$BUILDDIR/windeployqt.tar
cd $BUILDDIR
cd $MAKE_TARGET
tar cvf $TMPTAR --exclude=winconsole.o .
cd $BUILDDIR
cd ./openscad-$VERSION
tar xvf $TMPTAR
cd $BUILDDIR
rm -f $TMPTAR
echo "Creating zipfile..."
rm -f OpenSCAD-$VERSION.x86-$ARCH.zip
"$ZIP" $ZIPARGS $BINFILE openscad-$VERSION
mv $BINFILE $OPENSCADDIR/
cd $OPENSCADDIR
echo "Binary zip package created:"
echo " $BINFILE"
echo "Not creating installable .msi/.exe package"
}
create_package_mxe_shared()
{
flprefix=$MXE_TARGET_DIR/bin
echo Copying dlls for shared library build
echo from $flprefix
echo to $DEPLOYDIR/release
flist=
# fl="$fl opengl.dll" # use Windows version?
# fl="$fl libmpfr.dll" # does not exist
fl="$fl libgmp-10.dll"
fl="$fl libgmpxx-4.dll"
fl="$fl libboost_filesystem-mt.dll"
fl="$fl libboost_program_options-mt.dll"
fl="$fl libboost_regex-mt.dll"
fl="$fl libboost_chrono-mt.dll"
fl="$fl libboost_system-mt.dll"
fl="$fl libboost_thread_win32-mt.dll"
fl="$fl libCGAL.dll"
fl="$fl libCGAL_Core.dll"
fl="$fl GLEW.dll"
fl="$fl libglib-2.0-0.dll"
fl="$fl libopencsg-1.dll"
fl="$fl libharfbuzz-0.dll"
# fl="$fl libharfbuzz-gobject-0.dll" # ????
fl="$fl libfontconfig-1.dll"
fl="$fl libexpat-1.dll"
fl="$fl libbz2.dll"
fl="$fl libintl-8.dll"
fl="$fl libiconv-2.dll"
fl="$fl libfreetype-6.dll"
fl="$fl libpcre16-0.dll"
fl="$fl zlib1.dll"
fl="$fl libpng16-16.dll"
fl="$fl icudt54.dll"
fl="$fl icudt.dll"
fl="$fl icuin.dll"
fl="$fl libstdc++-6.dll"
fl="$fl ../qt5/lib/qscintilla2.dll"
fl="$fl ../qt5/bin/Qt5PrintSupport.dll"
fl="$fl ../qt5/bin/Qt5Core.dll"
fl="$fl ../qt5/bin/Qt5Gui.dll"
fl="$fl ../qt5/bin/Qt5OpenGL.dll"
# fl="$fl ../qt5/bin/QtSvg4.dll" # why is this here?
fl="$fl ../qt5/bin/Qt5Widgets.dll"
fl="$fl ../qt5/bin/Qt5PrintSupport.dll"
fl="$fl ../qt5/bin/Qt5PrintSupport.dll"
for dllfile in $fl; do
if [ -e $flprefix/$dllfile ]; then
echo $flprefix/$dllfile
cp $flprefix/$dllfile $DEPLOYDIR/release/
else
echo cannot find $flprefix/$dllfile
echo stopping build.
exit 1
fi
done
}
create_package_mxe()
{
cd $OPENSCADDIR
cd $BUILDDIR
# try to use a package filename that is not confusing (i686-w64-mingw32 is)
ARCH_INDICATOR=MingW-x86-32-$OPENSCAD_BUILD_TARGET_ABI
if [ $OPENSCAD_BUILD_TARGET_ARCH = x86_64 ]; then
ARCH_INDICATOR=MingW-x86-64-$OPENSCAD_BUILD_TARGET_ABI
fi
BINFILE=$BUILDDIR/OpenSCAD-$VERSION-$ARCH_INDICATOR.zip
INSTFILE=$BUILDDIR/OpenSCAD-$VERSION-$ARCH_INDICATOR-Installer.exe
#package
if [ $OPENSCAD_BUILD_TARGET_ABI = "shared" ]; then
flprefix=$MXE_SYS_DIR/bin
echo Copying dlls for shared library build
echo from $flprefix
echo to $BUILDDIR/$MAKE_TARGET
flist=
fl=
qtlist="PrintSupport Core Gui OpenGL Widgets"
boostlist="filesystem program_options regex system thread_win32 chrono"
dlist="icuin icudt icudt54 zlib1 GLEW ../qt5/lib/qscintilla2"
liblist="stdc++-6 png16-16 pcre16-0 freetype-6 iconv-2 intl-8 bz2 expat-1"
liblist="$liblist fontconfig-1 harfbuzz-0 opencsg-1 glib-2.0-0"
liblist="$liblist CGAL_Core CGAL gmpxx-4 gmp-10 mpfr-4 pcre-1"
if [ $OPENSCAD_BUILD_TARGET_ARCH = i686 ]; then
liblist="$liblist gcc_s_sjlj-1"
else
liblist="$liblist gcc_s_seh-1"
fi
fl=
for file in $qtlist; do fl="$fl ../qt5/bin/Qt5"$file".dll"; done
for file in $boostlist; do fl="$fl libboost_"$file"-mt.dll"; done
for file in $liblist; do fl="$fl lib"$file".dll"; done
for file in $dlist; do fl="$fl "$file".dll"; done
for dllfile in $fl; do
copyfail $flprefix/$dllfile $BUILDDIR/$MAKE_TARGET/
done
# replicate windeployqt behavior. as of writing, theres no mxe windeployqt
dqt=$BUILDDIR/$MAKE_TARGET/
for subdir in platforms iconengines imageformats translations; do
echo mkdir $dqt/$subdir
mkdir $dqt/$subdir
done
copyfail $MXE_SYS_DIR/qt5/plugins/platforms/qwindows.dll $dqt/platforms/
copyfail $MXE_SYS_DIR/qt/plugins/iconengines/qsvgicon4.dll $dqt/iconengines/
for idll in `ls $MXE_SYS_DIR/qt/plugins/imageformats/`; do
copyfail $MXE_SYS_DIR/qt/plugins/imageformats/$idll $dqt/imageformats/
done
# dont know how windeployqt does these .qm files in 'translations'. skip it
fi # shared
echo "Copying main binary .exe, .com, and other stuff"
echo "from $BUILDDIR/$MAKE_TARGET"
echo "to $BUILDDIR/openscad-$VERSION"
TMPTAR=$BUILDDIR/tmpmingw.$OPENSCAD_BUILD_TARGET_TRIPLE.tar
cd $BUILDDIR
cd $MAKE_TARGET
tar cvf $TMPTAR --exclude=winconsole.o .
cd $BUILDDIR
cd ./openscad-$VERSION
tar xf $TMPTAR
cd $BUILDDIR
rm -f $TMPTAR
echo "Creating binary zip package `basename $BINFILE`"
rm -f $BINFILE
"$ZIP" $ZIPARGS $BINFILE openscad-$VERSION
cd $OPENSCADDIR
echo "Creating installer `basename $INSTFILE`"
echo "Copying NSIS files to $BUILDDIR/openscad-$VERSION"
cp ./scripts/installer$OPENSCAD_BUILD_TARGET_ARCH.nsi $BUILDDIR/openscad-$VERSION/installer_arch.nsi
cp ./scripts/installer.nsi $BUILDDIR/openscad-$VERSION/
cp ./scripts/mingw-file-association.nsh $BUILDDIR/openscad-$VERSION/
cp ./scripts/x64.nsh $BUILDDIR/openscad-$VERSION/
cp ./scripts/LogicLib.nsh $BUILDDIR/openscad-$VERSION/
cd $BUILDDIR/openscad-$VERSION
NSISDEBUG=-V2
# NSISDEBUG= # leave blank for full log
echo $MAKENSIS $NSISDEBUG "-DVERSION=$VERSION" installer.nsi
$MAKENSIS $NSISDEBUG "-DVERSION=$VERSION" installer.nsi
cp $BUILDDIR/openscad-$VERSION/openscad_setup.exe $INSTFILE
cd $OPENSCADDIR
mv $BINFILE $OPENSCADDIR/
mv $INSTFILE $OPENSCADDIR/
}
create_package_linux()
{
cd $OPENSCADDIR
./scripts/makepkg-deb.sh
cd $DEPLOYDIR
}
call_qmake()
{
QMAKE="`command -v qmake-qt5`"
if [ ! -x "$QMAKE" ]; then
QMAKE=qmake
fi
QPRO_FILE=$OPENSCADDIR/openscad.pro
if [ "`echo $* | grep dryrun`" ]; then
QPRO_FILE=$OPENSCADDIR/scripts/fakescad.pro
fi
qmake PREFIX=$DEPLOYDIR VERSION=$VERSION OPENSCAD_COMMIT=$OPENSCAD_COMMIT $QPRO_FILE
}
cleanup_darwin()
{
make clean
sed -i.bak s/.Volumes.Macintosh.HD//g Makefile
rm -rf OpenSCAD.app
}
cleanup_mxe()
{
make clean
rm -f ./release/*
rm -f ./debug/*
rm -rf $DEPLOYDIR/openscad-$VERSION
mkdir $DEPLOYDIR/openscad-$VERSION
#touch -t 200012121010 $OPENSCADDIR/src/parser_yacc.h
#touch -t 200012121010 $OPENSCADDIR/src/parser_yacc.cpp
#touch -t 200012121010 $OPENSCADDIR/src/parser_yacc.hpp
#touch -t 200012121010 $OPENSCADDIR/src/lexer_lex.cpp
}
call_make()
{
run make
run make install
}
call_make_mxe()
{
run call_make
# make console pipe-able openscad.com - see winconsole.pro for info
run qmake $OPENSCADDIR/winconsole/winconsole.pro
run make
}
call_make_msys()
{
call_make_mxe
}
setup_dirs()
{
RESOURCES_DIR=$DEPLOYDIR/openscad-$VERSION
}
setup_dirs_darwin()
{
RESOURCES_DIR=$DEPLOYDIR/OpenSCAD.app/Contents/Resources
}
copy_fonts()
{
find ./fonts/10-liberation.conf -print -depth | cpio -pud $RESOURCES_DIR/fonts
find ./fonts/Liberation-2.00.1 -print -depth | cpio -pud $RESOURCES_DIR/fonts
}
copy_fonts_darwin()
{
copy_fonts
cp -a ./fonts/05-osx-fonts.conf $RESOURCES_DIR/fonts
cp -a fonts-osx/* $RESOURCES_DIR/fonts
}
copy_fonts_mxe()
{
copy_fonts
mxefonts=$MXEDIR/usr/$MXE_TARGET/etc
if [ -d $mxefonts ]; then
pwds=$PWD
cd $mxefonts
find ./fonts -print -depth | cpio -pud $RESOURCES_DIR
cd $pwds
else
echo cannot find mxe fonts
exit 1
fi
}
copy_resources()
{
cd $OPENSCADDIR
find ./examples -print -depth | cpio -pud $RESOURCES_DIR
find ./color-schemes -print -depth | cpio -pud $RESOURCES_DIR
find ./libraries -print -depth | grep -v ".git" | cpio -pud $RESOURCES_DIR
find ./locale -print -depth | grep ".mo" | cpio -pud $RESOURCES_DIR
chmod -R u=rwx,go=r,+X $RESOURCES_DIR/libraries
chmod -R 644 $RESOURCES_DIR/examples
cd $DEPLOYDIR
}
if [ ! $OPENSCADDIR ]; then
echo please run scripts/setenv.sh first
fi
if [ ! $DEPLOYDIR ]; then
echo please run scripts/setenv.sh first
fi
if [ ! -d $DEPLOYDIR ]; then
mkdir -p $DEPLOYDIR
fi
OPENSCAD_COMMIT=`git log -1 --pretty=format:"%h"`
VERSION=`date "+%Y.%m.%d"`
export_and_print_vars OPENSCAD_COMMIT VERSION
run update_mcad
run check_prereq
cd $DEPLOYDIR
QT_SELECT=5
ZIP="zip"
ZIPARGS="-r -q"
run cleanup
run call_qmake
run call_make
run setup_dirs
run copy_resources
run copy_fonts
run create_package