490 lines
13 KiB
Bash
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
|