Skip to content

Instantly share code, notes, and snippets.

@mantognini
Last active May 9, 2018 05:49
Show Gist options
  • Save mantognini/2aea13cd03971d8eec17 to your computer and use it in GitHub Desktop.
Save mantognini/2aea13cd03971d8eec17 to your computer and use it in GitHub Desktop.
Packaging script for SFML 2.x & CSFML 2.x
#!/bin/sh
VERSION="2.5.0"
VERSION_C="2.5"
BUILD_CSFML=FALSE
# BUILD_CSFML=TRUE
###
### Create packages for SFML $VERSION on OS X
###
### Author: Marco Antognini <[email protected]>
### Date: 15/11/2014
###
##
## SETTINGS
##
## Edit $VERSION & $VERSION_C above
##
sfml_giturl='https://github.com/SFML/SFML.git'
csfml_giturl='https://github.com/SFML/CSFML.git'
gittag="$VERSION"
gittag_c="$VERSION_C"
topdir=$(pwd)
tmpdir="$topdir/tmp/"
codedir="$tmpdir/code/"
cmakedir="$tmpdir/cmake/"
builddir="$tmpdir/build/"
installdir="$tmpdir/install/"
sfml_package_source_zip="$topdir/SFML-$gittag-sources.zip"
sfml_source_archive_url="https://github.com/SFML/SFML/archive/$gittag.zip"
sfml_package1070name="SFML-$gittag-macos-clang"
sfml_package1070="$topdir/$sfml_package1070name/"
sfml_archive1070="$sfml_package1070name.tar.gz"
csfml_package1070name="CSFML-$gittag_c-macos-clang"
csfml_package1070="$topdir/$csfml_package1070name/"
csfml_archive1070="$csfml_package1070name.tar.gz"
SDK1070="/Developer/SDKs/MacOSX10.7.sdk"
##
## HELPER FUNCTIONS
##
## Echoes to stderr, and die
error () # $* message to display
{
echo "$@" 1>&2
exit 2
}
## Check that the number of parameters is correct, or die
param_check () # $1 should be $# on call site,
# $2 the number of required params,
# $3 an id for the error message
{
if [ $# -ne 3 ]
then
error "Internal error in param_error: the number of parameters is incorrect"
fi
if [ $1 -ne $2 ]
then
error "Internal error in $3: the number of parameters is incorrect"
fi
}
## Check that the number of parameters is enough, or die
param_check_ge () # $1 should be $# on call site,
# $2 the minimal number of params,
# $3 an id for the error message
{
param_check $# 3 "param_check_ge"
if [ $1 -lt $2 ]
then
error "Internal error in $3: the number of parameters is not enough"
fi
}
## Assert $1 is true, or die
assert () # $1: boolean, $2: an error message
{
param_check $# 2 "assert"
if [ $1 -ne 0 ]
then
error "$2"
fi
}
## Create directory, or die
# === mkdir -p $1
create_dir () # $1: path
{
param_check $# 1 "create_dir"
mkdir -p "$1"
assert $? "Couldn't create $1"
}
## Destroy and create directory, or die
re_create_dir () # $1: path
{
param_check $# 1 "re_create_dir"
destroy "$1"
create_dir "$1"
}
## Destroy directory, or die
# === rm -fr $1
destroy () # $1: path
{
param_check $# 1 "destroy"
rm -fr "$1"
assert $? "Couldn't destroy $1"
}
## [with root access] Destroy directory, or die
# === rm -fr $1
sudo_destroy () # $1: path
{
param_check $# 1 "sudo_destroy"
echo "sudo_destroy need root password for deleting $1"
sudo rm -fr "$1"
assert $? "Couldn't destroy $1"
}
## Destroy all paths, or die
destroy_all () # $1...N: paths
{
param_check_ge $# 1 "destroy_all"
for path in "$@"
do
destroy "$path"
done
}
## [with root access] Destroy all paths, or die
sudo_destroy_all () # $1...N: paths
{
param_check_ge $# 1 "sudo_destroy_all"
for path in "$@"
do
sudo_destroy "$path"
done
}
## Copy files/directories, recursively, or die
copy () # $1...N: src, $N+1: dest
{
param_check_ge $# 2 "copy"
cp -R "$@"
assert $? "Couldn't copy $1 to $2"
}
## Go to dir with pushd, or die
push_pwd () # $1: path
{
param_check $# 1 "push_pwd"
pushd "$1"
assert $? "Couldn't go to $1"
}
## Go back, or die
pop_pwd ()
{
param_check $# 0 "pop_pwd"
popd
assert $? "Couldn't go back"
}
## Create a .tar.gz archive, or die
archive () # $1: src dir, $2: archive name
{
param_check $# 2 "archive"
push_pwd "$1/.."
src=$(basename "$1")
tar -zcvf "$2" "$src"
assert $? "Zip failed for $2"
pop_pwd
}
## Build SFML with CMake and Make, or die
build_sfml () # $1: 'clang' => clang & libc++
# $2: 'frameworks'/'dylibs'
# $3: 'doc'/'no doc'
# $4: 'examples'/'no examples'
# $5: 'templates'/'no templates'
# $6: '10.7 SDK'
{
param_check $# 6 "build_sfml"
case "$1" in
'clang')
cxx="clang++"
cc="clang"
cxx_flags="-stdlib=libc++"
cc_flags="-stdlib=libc++"
;;
*)
error "Unknown compiler for $1 in create_makefile"
;;
esac
case "$2" in
'frameworks')
frameworks="TRUE"
installdir_adapted="$installdir/Library/Frameworks"
;;
'dylibs')
frameworks="FALSE"
installdir_adapted="$installdir/usr/local"
;;
*)
error "Unknown option for $2 in create_makefile"
;;
esac
case "$3" in
'doc')
doc="TRUE"
;;
'no doc')
doc="FALSE"
;;
*)
error "Unknown option for $3 in create_makefile"
;;
esac
case "$4" in
'examples')
examples="TRUE"
makeopts=""
# NB: cannot use -j8 here because it bugs with cocoa example...
;;
'no examples')
examples="FALSE"
makeopts="-j8"
;;
*)
error "Unknown option for $4 in create_makefile"
;;
esac
case "$5" in
'templates')
templates="TRUE"
;;
'no templates')
templates="FALSE"
;;
*)
error "Unknown option for $5 in create_makefile"
;;
esac
case "$6" in
'10.7 SDK')
target="10.7"
sdk="$SDK1070"
;;
*)
error "Unknown option for $6 in create_makefile"
;;
esac
re_create_dir "$cmakedir"
push_pwd "$cmakedir"
cmake -G "Unix Makefiles" \
-D "BUILD_SHARED_LIBS:BOOL=TRUE" \
-D "CMAKE_BUILD_TYPE:STRING=Release" \
-D "CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/$cxx" \
-D "CMAKE_CXX_FLAGS:STRING=$cxx_flags" \
-D "CMAKE_C_COMPILER:FILEPATH=/usr/bin/$cc" \
-D "CMAKE_C_FLAGS:STRING=$cc_flags" \
-D "CMAKE_INSTALL_PREFIX:PATH=$installdir_adapted" \
-D "SFML_DEPENDENCIES_INSTALL_PREFIX:STRING=$installdir/Library/Frameworks" \
-D "SFML_MISC_INSTALL_PREFIX:STRING=$installdir/usr/local/share/SFML" \
-D "CMAKE_OSX_ARCHITECTURES:STRING=x86_64" \
-D "CMAKE_OSX_DEPLOYMENT_TARGET:STRING=$target" \
-D "CMAKE_OSX_SYSROOT:STRING=$sdk" \
-D "SFML_BUILD_DOC:BOOL=$doc" \
-D "SFML_BUILD_EXAMPLES:BOOL=$examples" \
-D "SFML_BUILD_FRAMEWORKS:BOOL=$frameworks" \
-D "SFML_INSTALL_XCODE_TEMPLATES:BOOL=$templates" \
"$codedir"
assert $? "CMake failed"
destroy "$installdir"
make clean && make $makeopts && make install
assert $? "Make failed"
pop_pwd
}
## Build SFML with CMake and Make, or die
build_csfml () # $1: 'clang' => clang & libc++
# $2: 'doc'/'no doc'
# $3: '10.7 SDK'
{
param_check $# 3 "build_csfml"
case "$1" in
'clang')
cxx="clang++"
cc="clang"
cxx_flags="-stdlib=libc++"
cc_flags="-stdlib=libc++"
;;
*)
error "Unknown compiler for $1 in create_makefile"
;;
esac
case "$2" in
'doc')
doc="TRUE"
;;
'no doc')
doc="FALSE"
;;
*)
error "Unknown option for $2 in create_makefile"
;;
esac
case "$3" in
'10.7 SDK')
target="10.7"
sdk="$SDK1070"
;;
*)
error "Unknown option for $3 in create_makefile"
;;
esac
makeopts="-j8"
re_create_dir "$cmakedir"
push_pwd "$cmakedir"
cmake -G "Unix Makefiles" \
-D "BUILD_SHARED_LIBS:BOOL=TRUE" \
-D "CMAKE_BUILD_TYPE:STRING=Release" \
-D "CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/$cxx" \
-D "CMAKE_CXX_FLAGS:STRING=$cxx_flags" \
-D "CMAKE_C_COMPILER:FILEPATH=/usr/bin/$cc" \
-D "CMAKE_C_FLAGS:STRING=$cc_flags" \
-D "CMAKE_INSTALL_PREFIX:PATH=$installdir/usr/local" \
-D "CMAKE_OSX_ARCHITECTURES:STRING=x86_64" \
-D "CMAKE_OSX_DEPLOYMENT_TARGET:STRING=$target" \
-D "CMAKE_OSX_SYSROOT:STRING=$sdk" \
-D "BUILD_DOC:BOOL=$doc" \
"$codedir"
assert $? "CMake failed"
destroy "$installdir"
make clean && make $makeopts && make install
assert $? "Make failed"
pop_pwd
}
## Install a package (dylibs only) to compile CSFML later on, or die
minimal_install_package () # $1: path to package
{
param_check $# 1 "install_package"
push_pwd "$1"
create_dir "/usr/local/share/SFML/cmake"
copy "cmake/Modules/FindSFML.cmake" "/usr/local/share/cmake/Modules/"
copy "lib/" "/usr/local/lib/"
copy "include/" "/usr/local/include/"
pop_pwd
}
## Git clone, or die
clone () # $1: url, $2: dest, $3: branch or tag
{
param_check $# 3 "clone"
git clone "$1" --branch "$3" "$2" --depth 1
assert $? "Cannot download the source code from $1"
}
## Remove anything related to SFML
wipe_sfml ()
{
# Remove SFML from /usr/local
destroy_all "/usr/local/include/SFML" \
"/usr/local/lib/"libsfml-* \
"/usr/local/share/SFML"
# Remove SFML from /Library
sudo_destroy_all "/Library/Frameworks/"sfml-* \
"/Library/Frameworks/SFML.framework"
destroy_all "/Library/Developer/Xcode/Templates/SFML"
}
## Remove anything related to CSFML
wipe_csfml ()
{
# Remove CSFML from /usr/local (that's it)
destroy_all "/usr/local/include/CSFML" \
"/usr/local/lib/"libcsfml-* \
"/usr/local/share/CSFML"
}
##
## INITIALIZE
##
## Clean up before doing anything
wipe_sfml
wipe_csfml
destroy "$sfml_package_source_zip"
destroy_all "$sfml_archive1070" "$sfml_package1070"
destroy_all "$csfml_archive1070" "$csfml_package1070"
destroy "$tmpdir"
##
## CREATE SOURCE ARCHIVE
##
# we need to do it on a Unix compatible system to keep symlinks valid in frameworks extlibs
wget -O "$sfml_package_source_zip" "$sfml_source_archive_url"
assert $? "Couldn't download the source archive"
zip -d "$sfml_package_source_zip" "SFML-$gittag/.gitattributes"
assert $? "Couldn't remove extra files from source archive"
##
## DOWNLOAD SFML
##
## First, download the code from github
destroy "$codedir"
clone "$sfml_giturl" "$codedir" "$gittag"
##
## BUILD SFML FOR 1070
##
# Now configure CMake for 10.7, 64bits, clang & libc++, doc, example, templates, FRAMEWORKS
# and build SFML !
build_sfml 'clang' 'frameworks' 'doc' 'examples' 'templates' '10.7 SDK'
## Copy the results to the package dir
re_create_dir "$sfml_package1070"
copy "$installdir/usr/local/share/SFML/" \
"$sfml_package1070/"
create_dir "$sfml_package1070/extlibs/"
copy "$installdir/Library/Frameworks/FLAC.framework" \
"$installdir/Library/Frameworks/freetype.framework" \
"$installdir/Library/Frameworks/ogg.framework" \
"$installdir/Library/Frameworks/OpenAL.framework" \
"$installdir/Library/Frameworks/vorbis.framework" \
"$installdir/Library/Frameworks/vorbisenc.framework" \
"$installdir/Library/Frameworks/vorbisfile.framework" \
"$sfml_package1070/extlibs/"
create_dir "$sfml_package1070/Frameworks/"
copy "$installdir/Library/Frameworks/"sfml-* \
"$installdir/Library/Frameworks/SFML.framework" \
"$sfml_package1070/Frameworks/"
create_dir "$sfml_package1070/templates/"
copy "/Library/Developer/Xcode/Templates/SFML" \
"$sfml_package1070/templates/"
## Now configure CMake for 10.7, 64bits, clang & libc++, DYLIBS
build_sfml 'clang' 'dylibs' 'no doc' 'no examples' 'no templates' '10.7 SDK'
## Copy the results to the package dir
create_dir "$sfml_package1070/include/"
copy "$installdir/usr/local/include/SFML" \
"$sfml_package1070/include/"
create_dir "$sfml_package1070/lib/"
copy "$installdir/usr/local/lib/"libsfml-* \
"$sfml_package1070/lib/"
copy "$codedir/changelog.md" \
"$sfml_package1070/"
## Clean up some files
find "$sfml_package1070" -regex '.*/\.DS_Store' -delete
assert $? "Find failed while removing extra files"
find "$sfml_package1070" -regex '.*/*\.swp' -delete
assert $? "Find failed while removing extra files"
find "$sfml_package1070" -regex '.*/*~' -delete
assert $? "Find failed while removing extra files"
## Apply patch for templates to fix paths
curl -fsSl "https://gist.githubusercontent.com/mantognini/307d63352c136e47b34d/raw/3a65f9bab38bd259f74c9aebefac2ee74908bc0f/template.2.5.0.patch" | patch "$sfml_package1070/templates/SFML/SFML App.xctemplate/TemplateInfo.plist" --no-backup-if-mismatch
assert $? "Couldn't apply patch on templates"
## And create archives
destroy "$tmpdir"
archive "$sfml_package1070" "$sfml_archive1070"
if [ $BUILD_CSFML != "TRUE" ]
then
echo "I'M NOT BUILDING CSFML!"
exit 0
fi
##
## DOWNLOAD CSFML
##
destroy "$codedir"
clone "$csfml_giturl" "$codedir" "$gittag_c"
##
## BUILD CSFML FOR 1070
##
wipe_sfml
minimal_install_package "$sfml_package1070"
build_csfml 'clang' 'doc' '10.7 SDK'
create_dir "$csfml_package1070/include/"
copy "$installdir/usr/local/include/SFML" \
"$csfml_package1070/include/"
create_dir "$csfml_package1070/lib/"
copy "$installdir/usr/local/lib/"libcsfml-* \
"$csfml_package1070/lib/"
copy "$installdir/usr/local/share/CSFML/" \
"$csfml_package1070/"
##
## CLEAN UP & ARCHIVE
##
find "$csfml_package1070" -regex '.*/\.DS_Store' -delete
assert $? "Find failed while removing extra files"
find "$csfml_package1070" -regex '.*/*\.swp' -delete
assert $? "Find failed while removing extra files"
find "$csfml_package1070" -regex '.*/*~' -delete
assert $? "Find failed while removing extra files"
## Clean up temporary directories
## And create archives
destroy "$tmpdir"
archive "$csfml_package1070" "$csfml_archive1070"
### End Of Script
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment