diff --git a/love-release.sh b/love-release.sh index 509916f..52958b0 100755 --- a/love-release.sh +++ b/love-release.sh @@ -1,299 +1,39 @@ #!/usr/bin/env bash -## Edit this if you want to use another Löve version. + +# Edit this if you want to use another Love version by default LOVE_VERSION=0.9.1 -## Short help ## -short_help () -{ -echo "Usage: love-release.sh [options...] [files...] -Options: - -h, --help Prints short or long help - -a Create an Android package - -d Create a deb package - -l Create a plain Love file - -m Create a MacOS application - -w, Create a Windows application - -w32 Create a Windows x86 application - -w64 Create a Windows x64 application - -n Set the projects name - -r Set the release directory - -u Set the company name - -v Set the Love version -" -} +# Platform-specific scripts registration -## Long help ## -long_help () -{ -echo " -.TH LOVE-RELEASE.SH 1 -.SH NAME -love-release.sh \- Bash script to generate Love 2D game releases -.SH SYNOPSIS -.B love\-release.sh -[\fB\-dlmw\fR] [\fB\-n\fR \fIproject_name\fR] [\fB\-r\fR \fIrelease_dir\fR] -[\fB\-u\fR \fIcompany_name\fR] [\fB\-v\fR \fIlove_version\fR] [\fIFILES...\fR] -.SH DESCRIPTION -.B love-release.sh -can be used to generate Love 2D game applications -and get over the fastidious zipping commands you had to do. -.PP -The script fully supports Windows, MacOS either on x86 or x64, -Debian and Android packages. -It needs an Internet connection to download Love files, -and relies on \fBcurl\fR, \fBzip\fR and \fBunzip\fR commands. -To set the default Love version to use, -you can edit the very beginning of the script. -If \fBlua\fR and a \fIconf.lua\fR file are found, -it will automatically detect which version your project uses. -If a \fIProjectName.icns\fR file is provided, -the script will use it to set the game icon on MacOS. -If a \fIProjectName.ico\fR file is provided, and that \fBWine\fR -and \fBResource Hacker\fR are installed, the script will use them -to set the game icon on Windows. -.SH OPTIONS -.TP -.B \-h -Print a short help -.TP -.B \-\-help -Print this longer help -.SH OPERATING SYSTEMS -.TP -.B \-a -Create an Android package. -In order to create an Android package, you must have installed the Android SDK, -but there is no need to install the LÖVE port to Android, -as the script will handle this by itself. -You also might want to provide more informations about it. -See the ANDROID section below. -.TP -.B \-d -Create a deb package. Aimed at Debian and Ubuntu derivatives. -In order to create a Debian package, you must provide more informations about it. -See the DEBIAN section below. -.TP -.B \-l -Create a plain Love file. It is just a zip of your sources, renamed in \fI*.love\fR. -Mostly aimed at Linux players or developers and the most common distribution process. -.TP -.B \-m -Create MacOS application. -Starting with Love 0.9.0, Love no longer supports old x86 Macintosh. -If you are targeting one of these, your project must be developed with Love 0.8.0 or lower. -Depending on the Love version used, the script will choose which one, -between x64 only or Universal Build to create. -.TP -.BR \-w \", \" \-w32 \", \" \-w64 -Create Windows application. -Starting with Love 0.8.0, a release is specially available for Windows x64. -If you are targeting one of these, your project must be developed with Love 0.8.0 or newer. -Remember that x86 is always backwards compatible with x64. -Depending on the Love version used, the script will choose which one, -between x64 and x86 or x86 only to create. -.br -.B \-w32 -Create Windows x86 executable only. -.br -.B \-w64 -Create Windows x64 executable only. -.SH PROJECT OPTIONS -.TP -.B \-n \fIproject-name\fR -Set the projects name. By default, the name of the current directory is used. -.TP -.B \-r \fIrelease-dir\fR -Set the release directory. By default, a subdirectory called releases is created. -.TP -.B \-u \fIcompany\fR -Set the company name. Provide it for MacOS CFBundleIdentifier. -.TP -.B \-v \fIversion\fR -Love version. Default is 0.9.1. -Starting with Love 0.8.0, a release is specially available for Windows x64. -Starting with Love 0.9.0, Love no longer supports old x86 Macintosh. -.SH DEBIAN -.TP -.B \-\-description \fIdescription\fR -Set the description of your project. -.TP -.B \-\-homepage \fIpage\fR -Set the homepage of your project. -.TP -.B \-\-maintainer-email \fIemail\fR -Set the maintainer's email. -.TP -.B \-\-maintainer\-name \fIname\fR -Set the maintainer's name. The company name is used by default. -.TP -.B \-\-package-name \fIname\fR -Set the name of the package and the command that will be use to launch your game. -By default, it is the name of your project converted to lowercase, -with eventual spaces replaced by dashes. -.TP -.B \-\-version \fIversion\fR -Set the version of your package. -.SH ANDROID -Note that every argument passed to the options should be alphanumerical, -with eventual underscores (i.e. [a-zA-Z0-9_]), otherwise you'll get errors. -.TP -.B \-\-activity \fIactivity\fR -The name of the class that extends GameActivity. -By default it is the name of the project with 'Activity' appended, -eventual spaces and dashes replaced by underscores. -.TP -.B \-\-maintainer\-name \fIname\fR -Set the maintainer’s name. The company name is used by default. -It must be only alphanumerical characters, with eventual underscores. -.TP -.B \-\-package\-name \fIname\fR -Set the name of the package. -By default, it is the name of your project, with eventual spaces replaced by underscores. -.TP -.B \-\-update\-repo -Update the love-android-sdl2.git repository used in the cache. -.TP -.B \-\-version \fIversion\fR -Set the version of your package. -.SH OTHERS -.TP -.B \-\-refresh -Refresh the cache located in \fI~/.cache/love-release\fR. -One can replace the Love files there. -.TP -.B \-\-debug -Dump the scripts variables without making releases. -.SH ICONS -The script doesn’t yet handle the process of creating icons, -but if provided it can use them. -.br -If you want to create MacOS icons (\fI.icns\fR), and you are -running MacOS, then check \fIiconutil\fR. If you are running GNU/Linux, -then check \fIlibicns\fR. -.br -If you want to create Windows icons (\fI.ico\fR), -you can use \fIicoutils\fR to create the icon, -then Wine and Resource Hacker to set the icon. -This last step can be automatically done, -assuming Wine and Resource Hacker are installed. -.br -If you want to add icons in the debian package, -open it and put the icons in \fI/usr/share/icons/hicolor/YYxYY/apps/\fR, -where YY is the width of the icon. -You also have to edit the line \"Icon=love\" in -\fI/usr/share/applications/yourgame.desktop\fR to match the icon's name. -See \fIhttps://developer.gnome.org/integration-guide/stable/basic-integration.html.en\fR -for more informations. -.SH SEE ALSO -.I https://www.love2d.org -.br -.I https://www.love2d.org/wiki/Game_Distribution -.br -.I https://www.github.org/MisterDA/love-release -" | man /dev/stdin -} +## To register your platforms scripts, you have to choose a command name that will trigger your script. +## It must be followed by: +## - a semicolon ";" if it doesn't require an argument +## - a dot "." if it has an optional argument +## - a colon ":" if it requires an argument + +## SCRIPT_ARGS="a; osname:" +SCRIPT_ARGS="" + +## Add a short summary of your platform script here +## SHORT_HELP=" -a Create an executable for a +## --osname Create an executable for osname" +SHORT_HELP="" + +## Don't forget to source the corresponding file at the bottom of the script ! -## Test if requirements are installed ## + +# Test if requirements are installed command -v curl >/dev/null 2>&1 || { echo "curl is not installed. Aborting." >&2; exit 1; } command -v zip >/dev/null 2>&1 || { echo "zip is not installed. Aborting." >&2; exit 1; } command -v unzip >/dev/null 2>&1 || { echo "unzip is not installed. Aborting." >&2; exit 1; } - FOUND_LUA=true command -v lua >/dev/null 2>&1 || { FOUND_LUA=false; } -## Parsing function ## -getoptex () -{ - let $# || return 1 - local optlist="${1#;}" - let OPTIND || OPTIND=1 - [ $OPTIND -lt $# ] || return 1 - shift $OPTIND - if [ "$1" != "-" ] && [ "$1" != "${1#-}" ] - then OPTIND=$[OPTIND+1]; if [ "$1" != "--" ] - then - local o - o="-${1#-$OPTOFS}" - for opt in ${optlist#;} - do - OPTOPT="${opt%[;.:]}" - unset OPTARG - local opttype="${opt##*[^;:.]}" - [ -z "$opttype" ] && opttype=";" - if [ ${#OPTOPT} -gt 1 ] - then # long-named option - case $o in - "--$OPTOPT") - if [ "$opttype" != ":" ]; then return 0; fi - OPTARG="$2" - if [ -z "$OPTARG" ]; - then # error: must have an argument - let OPTERR && echo "$0: error: $OPTOPT must have an argument" >&2 - exit - # OPTARG="$OPTOPT"; - # OPTOPT="?" - return 1; - fi - OPTIND=$[OPTIND+1] # skip option's argument - return 0 - ;; - "--$OPTOPT="*) - if [ "$opttype" = ";" ]; - then # error: must not have arguments - let OPTERR && echo "$0: error: $OPTOPT must not have arguments" >&2 - exit - # OPTARG="$OPTOPT" - # OPTOPT="?" - return 1 - fi - OPTARG=${o#"--$OPTOPT="} - return 0 - ;; - esac - else # short-named option - case "$o" in - "-$OPTOPT") - unset OPTOFS - [ "$opttype" != ":" ] && return 0 - OPTARG="$2" - if [ -z "$OPTARG" ] - then - echo "$0: error: -$OPTOPT must have an argument" >&2 - exit - # OPTARG="$OPTOPT" - # OPTOPT="?" - return 1 - fi - OPTIND=$[OPTIND+1] # skip option's argument - return 0 - ;; - "-$OPTOPT"*) - if [ "$opttype" = ";" ] - then # an option with no argument is in a chain of options - OPTOFS="$OPTOFS?" # move to the next option in the chain - OPTIND=$[OPTIND-1] # the chain still has other options - return 0 - else - unset OPTOFS - OPTARG="${o#-$OPTOPT}" - return 0 - fi - ;; - esac - fi - done - echo "$0: error: invalid option: $o" - exit - fi; fi - OPTOPT="?" - unset OPTARG - return 1 -} - +# Tests on float numbers float_test () { a=$(echo | awk 'END { exit ( !( '"$1"')); }' && echo "true") if [ "$a" != "true" ]; then @@ -303,561 +43,137 @@ float_test () { } -## Set defaults ## -RELEASE_LOVE=false -RELEASE_DEB=false -RELEASE_OSX=false -RELEASE_WIN_32=false -RELEASE_WIN_64=false -RELEASE_APK=false - +# Love version detection if [ "$FOUND_LUA" = true ] && [ -f "conf.lua" ]; then LOVE_VERSION_AUTO=$(lua -e 'f = loadfile("conf.lua"); t, love = {window = {}, modules = {}}, {}; f(); love.conf(t); t.version = t.version or ""; print(t.version)') else LOVE_VERSION_AUTO=$(grep -Eo -m 1 "t.version = \"[0-9]+.[0-9]+.[0-9]+\"" conf.lua 2> /dev/null | grep -Eo "[0-9]+.[0-9]+.[0-9]+") fi if [ -n "$LOVE_VERSION_AUTO" ]; then - LOVE_VERSION=$LOVE_VERSION_AUTO + LOVE_VERSION=$LOVE_VERSION_AUTO fi LOVE_VERSION_MAJOR=$(echo "$LOVE_VERSION" | grep -Eo '^[0-9]+\.?[0-9]*') LOVE_GT_080=$(float_test "$LOVE_VERSION_MAJOR >= 0.8") LOVE_GT_090=$(float_test "$LOVE_VERSION_MAJOR >= 0.9") -PROJECT_FILES= -PROJECT_NAME=${PWD##/*/} -PACKAGE_NAME=${PROJECT_NAME,,}; PACKAGE_NAME=${PACKAGE_NAME// /-} -PROJECT_VERSION= -PROJECT_HOMEPAGE= -PROJECT_DESCRIPTION= -COMPANY_NAME=love2d -MAINTAINER_NAME=$COMPANY_NAME -MAINTAINER_EMAIL= -RELEASE_DIR="$PWD"/releases -ACTIVITY=${PROJECT_NAME// /_}; ACTIVITY=${ACTIVITY//-/_}Activity -UPDATE_ANDROID_REPO=false -DEBUG=false -CACHE_DIR=~/.cache/love-release +# Global variables +ARGS=( "$@" ) +SCRIPT_ARGS="$SCRIPT_ARGS h; v: refresh help" + +PROJECT_FILES= EXCLUDE_FILES=$(/bin/ls -A | grep "^[.]" | tr '\n' ' ') +PROJECT_NAME="${PWD##/*/}" +PROJECT_DIR="$PWD" -## Debug function ## -function debug() -{ -echo "DEBUG=$DEBUG -RELEASE_LOVE=$RELEASE_LOVE -RELEASE_DEB=$RELEASE_DEB -RELEASE_OSX=$RELEASE_OSX -RELEASE_WIN_32=$RELEASE_WIN_32 -RELEASE_WIN_64=$RELEASE_WIN_64 -RELEASE_APK=$RELEASE_APK -LOVE_VERSION=$LOVE_VERSION -LOVE_VERSION_MAJOR=$LOVE_VERSION_MAJOR -LOVE_VERSION_AUTO=$LOVE_VERSION_AUTO -LOVE_GT_080=$LOVE_GT_080 -LOVE_GT_090=$LOVE_GT_090 -PROJECT_FILES=$PROJECT_FILES -PROJECT_NAME=$PROJECT_NAME -PACKAGE_NAME=$PACKAGE_NAME -PROJECT_VERSION=$PROJECT_VERSION -PROJECT_HOMEPAGE=$PROJECT_HOMEPAGE -PROJECT_DESCRIPTION=$PROJECT_DESCRIPTION -COMPANY_NAME=$COMPANY_NAME -MAINTAINER_NAME=$MAINTAINER_NAME -MAINTAINER_EMAIL=$MAINTAINER_EMAIL -ACTIVITY=$ACTIVITY -RELEASE_DIR=$RELEASE_DIR -CACHE_DIR=$CACHE_DIR -PROJECT_ICO=$PROJECT_ICO -PROJECT_ICNS=$PROJECT_ICNS -EXCLUDE_FILES=$EXCLUDE_FILES +RELEASE_DIR="$PWD"/releases +MAIN_CACHE_DIR=~/.cache/love-release +INSTALL_DIR= +PLATFORMS_DIR="$INSTALL_DIR"/scripts +INCLUDE_DIR="$INSTALL_DIR"/include + +if [ -n "$SHORT_HELP" ] && [ "${SHORT_HELP:$((${#SHORT_HELP}-1)):1}" != $'\n' ]; then + SHORT_HELP="$SHORT_HELP " +fi +SHORT_HELP="Usage: love-release.sh [options...] [files...] +Options: + -h, --help Prints short or long help + -n Set the projects name + -r Set the release directory + -v Set the Love version +$SHORT_HELP" + +# Parsing options +source "$INCLUDE_DIR"/getopt.sh +while getoptex "$SCRIPT_ARGS" "$@" +do + if [ "$OPTOPT" = "h" ]; then + echo "$SHORT_HELP" + elif [ "$OPTOPT" = "help" ]; then + : + elif [ "$OPTOPT" = "n" ]; then + PROJECT_NAME=$OPTARG + elif [ "$OPTOPT" = "r" ]; then + RELEASE_DIR=$OPTARG + elif [ "$OPTOPT" = "v" ]; then + LOVE_VERSION=$OPTARG + LOVE_VERSION_MAJOR=$(echo "$LOVE_VERSION" | grep -Eo '^[0-9]+\.?[0-9]*') + LOVE_GT_080=$(float_test "$LOVE_VERSION_MAJOR >= 0.8") + LOVE_GT_090=$(float_test "$LOVE_VERSION_MAJOR >= 0.9") + elif [ "$OPTOPT" = "refresh" ]; then + rm -rf "$MAIN_CACHE_DIR" + fi +done +shift $((OPTIND-1)) +for file in "$@" +do + PROJECT_FILES="$PROJECT_FILES $file" +done + +set -- ${ARGS[@]} +unset OPTIND +unset OPTOFS + + +# Modules functions +init_module () +{ + unset OPTIND + unset OPTOFS + MAIN_RELEASE_DIR="${RELEASE_DIR##/*/}" + RELEASE_DIR="$RELEASE_DIR"/$LOVE_VERSION + CACHE_DIR="$MAIN_CACHE_DIR"/$LOVE_VERSION + mkdir -p "$RELEASE_DIR" "$CACHE_DIR" + rm -rf "$RELEASE_DIR"/"$PROJECT_NAME".love 2> /dev/null + echo "Generating $PROJECT_NAME with Love $LOVE_VERSION for $1..." +} + +create_love_file () +{ + cd "$PROJECT_DIR" + rm -rf "$RELEASE_DIR"/"$PROJECT_NAME".love + if [ -z "$PROJECT_FILES" ]; then + zip -9 -r "$RELEASE_DIR"/"$PROJECT_NAME".love -x "$0" "$MAIN_RELEASE_DIR"/\* "$EXCLUDE_FILES" @ * + else + zip -9 -r "$RELEASE_DIR"/"$PROJECT_NAME".love -x "$0" "$MAIN_RELEASE_DIR"/\* "$EXCLUDE_FILES" @ "$PROJECT_FILES" + fi + cd "$RELEASE_DIR" + LOVE_FILE="$PROJECT_NAME".love +} + +remove_love_file () +{ + rm -rf "$LOVE_FILE" +} + +exit_module () +{ + if [ -z $2 ]; then + echo "Done !" + else + echo $2 + fi + exit $1 } -## Parsing options ## -activity_defined_by_user=false -package_name_defined_by_user=false -while getoptex "a; h; d; l; m; w. n: r: u: v: activity: version: maintainer-name: maintainer-email: homepage: description: package-name: update-repo debug help refresh" "$@" + +# Platform-specific scripts registration +## To register your platforms scripts, test for the option you've specified +## at the beginning of the script and source the corresponding file. +## $OPTOPT holds the option and $OPTARG holds the eventual argument passed to it. + +## while getoptex "a; osname:" "$@" +while getoptex "$SCRIPT_ARGS" "$@" do - if [ "$OPTOPT" = "h" ]; then - short_help - exit - elif [ "$OPTOPT" = "a" ]; then - RELEASE_APK=true - elif [ "$OPTOPT" = "d" ]; then - RELEASE_DEB=true - elif [ "$OPTOPT" = "l" ]; then - RELEASE_LOVE=true - elif [ "$OPTOPT" = "m" ]; then - RELEASE_OSX=true - elif [ "$OPTOPT" = "w" ]; then - if [ "$OPTARG" = "32" ]; then - RELEASE_WIN_32=true - elif [ "$OPTARG" = "64" ]; then - RELEASE_WIN_64=true - else - RELEASE_WIN_32=true - RELEASE_WIN_64=true - fi - elif [ "$OPTOPT" = "n" ]; then - PROJECT_NAME=$OPTARG - if [ "$activity_defined_by_user" = false ]; then - ACTIVITY=${PROJECT_NAME// /_}; ACTIVITY=${ACTIVITY//-/_}Activity - fi - if [ "$package_name_defined_by_user" = false ]; then - PACKAGE_NAME=${PROJECT_NAME,,}; PACKAGE_NAME=${PACKAGE_NAME// /-} - fi - elif [ "$OPTOPT" = "r" ]; then - RELEASE_DIR=$OPTARG - elif [ "$OPTOPT" = "u" ]; then - COMPANY_NAME=$OPTARG - elif [ "$OPTOPT" = "v" ]; then - LOVE_VERSION=$OPTARG - LOVE_VERSION_MAJOR=$(echo "$LOVE_VERSION" | grep -Eo '^[0-9]+\.?[0-9]*') - LOVE_GT_080=$(float_test "$LOVE_VERSION_MAJOR >= 0.8") - LOVE_GT_090=$(float_test "$LOVE_VERSION_MAJOR >= 0.9") - elif [ "$OPTOPT" = "activity" ]; then - ACTIVITY=$OPTARG - activity_defined_by_user=true - elif [ "$OPTOPT" = "version" ]; then - PROJECT_VERSION=$OPTARG - elif [ "$OPTOPT" = "homepage" ]; then - PROJECT_HOMEPAGE=$OPTARG - elif [ "$OPTOPT" = "description" ]; then - PROJECT_DESCRIPTION=$OPTARG - elif [ "$OPTOPT" = "maintainer-name" ]; then - MAINTAINER_NAME=$OPTARG - elif [ "$OPTOPT" = "maintainer-email" ]; then - MAINTAINER_EMAIL=$OPTARG - elif [ "$OPTOPT" = "package-name" ]; then - PACKAGE_NAME=$OPTARG - package_name_defined_by_user=true - elif [ "$OPTOPT" = "update-repo" ]; then - UPDATE_ANDROID_REPO=true - elif [ "$OPTOPT" = "debug" ]; then - DEBUG=true - elif [ "$OPTOPT" = "help" ]; then - long_help - exit - elif [ "$OPTOPT" = "refresh" ]; then - rm -rf $CACHE_DIR - fi + : +## if [ "$OPTOPT" = "a" ]; then +## source "$PLATFORMS_DIR/a-system.sh" +## elif [ "$OPTOPT" = "osname" ]; then +## OSNAME=$OPTARG +## source "$PLATFORMS_DIR/os.sh" +## fi done -shift $[OPTIND-1] -for file in "$@" -do - PROJECT_FILES="$PROJECT_FILES $file" -done -if [ "$RELEASE_LOVE" = false ] && [ "$RELEASE_DEB" = false ] && [ "$RELEASE_OSX" = false ] && [ "$RELEASE_WIN_32" = false ] && [ "$RELEASE_WIN_64" = false ] && [ "$RELEASE_APK" = false ]; then - RELEASE_LOVE=true - RELEASE_DEB=true - RELEASE_OSX=true - RELEASE_WIN_32=true - RELEASE_WIN_64=true -fi -if [ "$RELEASE_APK" = true ]; then - RELEASE_LOVE=false - RELEASE_DEB=false - RELEASE_OSX=false - RELEASE_WIN_32=false - RELEASE_WIN_64=false -fi -MAIN_RELEASE_DIR=${RELEASE_DIR##/*/} -RELEASE_DIR="$RELEASE_DIR"/$LOVE_VERSION -CACHE_DIR=$CACHE_DIR/$LOVE_VERSION -if [ -f "$PWD"/"$PROJECT_NAME".icns ]; then - PROJECT_ICNS="$PWD"/"$PROJECT_NAME".icns -else - PROJECT_ICNS= -fi -if [ -f "$PWD"/"$PROJECT_NAME".ico ]; then - PROJECT_ICO="$PWD"/"$PROJECT_NAME".ico -else - PROJECT_ICO= -fi -if [ -z "$PROJECT_VERSION" ]; then - PROJECT_VERSION=1 -fi - -## Debug log ## -if [ "$DEBUG" = true ]; then - debug - exit -fi - - -echo "Generating "$PROJECT_NAME" with Love $LOVE_VERSION..." - - -## Zipping ## -mkdir -p "$RELEASE_DIR" $CACHE_DIR -rm -rf "$RELEASE_DIR"/"$PROJECT_NAME".love 2> /dev/null -if [ -z "$PROJECT_FILES" ]; then - zip -9 -r "$RELEASE_DIR"/"$PROJECT_NAME".love -x $0 "$MAIN_RELEASE_DIR"/\* ${PROJECT_ICNS##/*/} ${PROJECT_ICO##/*/} $EXCLUDE_FILES @ * -else - zip -9 -r "$RELEASE_DIR"/"$PROJECT_NAME".love -x $0 "$MAIN_RELEASE_DIR"/\* ${PROJECT_ICNS##/*/} ${PROJECT_ICO##/*/} $EXCLUDE_FILES @ $PROJECT_FILES -fi -cd "$RELEASE_DIR" - - -## Windows 32-bits ## -if [ "$RELEASE_WIN_32" = true ]; then - if [ "$LOVE_GT_090" = true ]; then - if [ -f "$CACHE_DIR/love-$LOVE_VERSION-win32.zip" ]; then - cp $CACHE_DIR/love-$LOVE_VERSION-win32.zip ./ - else - curl -L -C - -o $CACHE_DIR/love-$LOVE_VERSION-win32.zip https://bitbucket.org/rude/love/downloads/love-$LOVE_VERSION-win32.zip - cp $CACHE_DIR/love-$LOVE_VERSION-win32.zip ./ - fi - else - if [ -f "$CACHE_DIR/love-$LOVE_VERSION-win-x86.zip" ]; then - cp $CACHE_DIR/love-$LOVE_VERSION-win-x86.zip ./love-$LOVE_VERSION-win32.zip - else - curl -L -C - -o $CACHE_DIR/love-$LOVE_VERSION-win-x86.zip https://bitbucket.org/rude/love/downloads/love-$LOVE_VERSION-win-x86.zip - cp $CACHE_DIR/love-$LOVE_VERSION-win-x86.zip ./love-$LOVE_VERSION-win32.zip - fi - fi - unzip -qq love-$LOVE_VERSION-win32.zip - rm -rf "$PROJECT_NAME"-win32.zip 2> /dev/null - wine ~/.wine/drive_c/Program\ Files\ \(x86\)/Resource\ Hacker/ResHacker.exe -addoverwrite "love-$LOVE_VERSION-win32/love.exe,love-$LOVE_VERSION-win32/love.exe,"$PROJECT_ICO",ICONGROUP,MAINICON,0" - cat love-$LOVE_VERSION-win32/love.exe "$PROJECT_NAME".love > love-$LOVE_VERSION-win32/"$PROJECT_NAME".exe - rm love-$LOVE_VERSION-win32/love.exe - zip -9 -qr "$PROJECT_NAME"-win32.zip love-$LOVE_VERSION-win32 - rm -rf love-$LOVE_VERSION-win32.zip love-$LOVE_VERSION-win32 -fi - -## Windows 64-bits ## -if [ "$RELEASE_WIN_64" = true ] && [ "$LOVE_GT_080" = true ]; then - if [ "$LOVE_GT_090" = true ]; then - if [ -f "$CACHE_DIR/love-$LOVE_VERSION-win64.zip" ]; then - cp $CACHE_DIR/love-$LOVE_VERSION-win64.zip ./ - else - curl -L -C - -o $CACHE_DIR/love-$LOVE_VERSION-win64.zip https://bitbucket.org/rude/love/downloads/love-$LOVE_VERSION-win64.zip - cp $CACHE_DIR/love-$LOVE_VERSION-win64.zip ./ - fi - else - if [ -f "$CACHE_DIR/love-$LOVE_VERSION-win-x64.zip" ]; then - cp $CACHE_DIR/love-$LOVE_VERSION-win-x64.zip ./love-$LOVE_VERSION-win64.zip - else - curl -L -C - -o $CACHE_DIR/love-$LOVE_VERSION-win-x64.zip https://bitbucket.org/rude/love/downloads/love-$LOVE_VERSION-win-x64.zip - cp $CACHE_DIR/love-$LOVE_VERSION-win-x64.zip ./love-$LOVE_VERSION-win64.zip - fi - fi - unzip -qq love-$LOVE_VERSION-win64.zip - rm -rf "$PROJECT_NAME"-win64.zip 2> /dev/null - wine ~/.wine/drive_c/Program\ Files\ \(x86\)/Resource\ Hacker/ResHacker.exe -addoverwrite "love-$LOVE_VERSION-win64/love.exe,love-$LOVE_VERSION-win64/love.exe,"$PROJECT_ICO",ICONGROUP,MAINICON,0" - cat love-$LOVE_VERSION-win64/love.exe "$PROJECT_NAME".love > love-$LOVE_VERSION-win64/"$PROJECT_NAME".exe - rm love-$LOVE_VERSION-win64/love.exe - zip -9 -qr "$PROJECT_NAME"-win64.zip love-$LOVE_VERSION-win64 - rm -rf love-$LOVE_VERSION-win64.zip love-$LOVE_VERSION-win64 -fi - -## MacOS ## -if [ "$RELEASE_OSX" = true ]; then - - ## MacOS 64-bits ## - if [ "$LOVE_GT_090" = true ]; then - if [ -f "$CACHE_DIR/love-$LOVE_VERSION-macosx-x64.zip" ]; then - cp $CACHE_DIR/love-$LOVE_VERSION-macosx-x64.zip ./ - else - curl -L -C - -o $CACHE_DIR/love-$LOVE_VERSION-macosx-x64.zip https://bitbucket.org/rude/love/downloads/love-$LOVE_VERSION-macosx-x64.zip - cp $CACHE_DIR/love-$LOVE_VERSION-macosx-x64.zip ./ - fi - unzip -qq love-$LOVE_VERSION-macosx-x64.zip - rm -rf "$PROJECT_NAME"-macosx-x64.zip 2> /dev/null - mv love.app "$PROJECT_NAME".app - cp "$PROJECT_NAME".love "$PROJECT_NAME".app/Contents/Resources - cp "$PROJECT_ICNS" "$PROJECT_NAME".app/Contents/Resources 2> /dev/null -echo " - - - - BuildMachineOSBuild - 13A603 - CFBundleDevelopmentRegion - English - CFBundleDocumentTypes - - - CFBundleTypeIconFile - LoveDocument.icns - CFBundleTypeName - LÖVE Project - CFBundleTypeRole - Viewer - LSHandlerRank - Owner - LSItemContentTypes - - org.love2d.love-game - - - - CFBundleTypeName - Folder - CFBundleTypeOSTypes - - fold - - CFBundleTypeRole - Viewer - LSHandlerRank - None - - - CFBundleExecutable - love - CFBundleIconFile - ${PROJECT_ICNS##/*/} - CFBundleIdentifier - org.$COMPANY_NAME."$PROJECT_NAME" - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - "$PROJECT_NAME" - CFBundlePackageType - APPL - CFBundleShortVersionString - $LOVE_VERSION - CFBundleSignature - LoVe - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 5A3005 - DTPlatformVersion - GM - DTSDKBuild - 13A595 - DTSDKName - macosx10.9 - DTXcode - 0502 - DTXcodeBuild - 5A3005 - LSApplicationCategoryType - public.app-category.games - NSHumanReadableCopyright - © 2006-2013 LÖVE Development Team - NSPrincipalClass - NSApplication - -" > "$PROJECT_NAME".app/Contents/Info.plist - zip -9 -qr "$PROJECT_NAME"-macosx-x64.zip "$PROJECT_NAME".app - rm -rf love-$LOVE_VERSION-macosx-x64.zip "$PROJECT_NAME".app __MACOSX - - ## MacOS 32-bits ## - else - if [ -f "$CACHE_DIR/love-$LOVE_VERSION-macosx-ub.zip" ]; then - cp $CACHE_DIR/love-$LOVE_VERSION-macosx-ub.zip ./ - else - curl -L -C - -o $CACHE_DIR/love-$LOVE_VERSION-macosx-ub.zip https://bitbucket.org/rude/love/downloads/love-$LOVE_VERSION-macosx-ub.zip - cp $CACHE_DIR/love-$LOVE_VERSION-macosx-ub.zip ./ - fi - unzip -qq love-$LOVE_VERSION-macosx-ub.zip - rm -rf "$PROJECT_NAME"-macosx-ub.zip 2> /dev/null - mv love.app "$PROJECT_NAME".app - cp "$PROJECT_NAME".love "$PROJECT_NAME".app/Contents/Resources - cp "$PROJECT_ICNS" "$PROJECT_NAME".app/Contents/Resources 2> /dev/null -echo " - - - - BuildMachineOSBuild - 11D50b - CFBundleDevelopmentRegion - English - CFBundleDocumentTypes - - - CFBundleTypeIconFile - LoveDocument.icns - CFBundleTypeName - LÖVE Project - CFBundleTypeRole - Viewer - LSHandlerRank - Owner - LSItemContentTypes - - org.love2d.love-game - - - - CFBundleTypeName - Folder - CFBundleTypeOSTypes - - fold - - CFBundleTypeRole - Viewer - LSHandlerRank - None - - - CFBundleExecutable - love - CFBundleIconFile - ${PROJECT_ICNS##/*/} - CFBundleIdentifier - com.$COMPANY_NAME."$PROJECT_NAME" - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - "$PROJECT_NAME" - CFBundlePackageType - APPL - CFBundleShortVersionString - $LOVE_VERSION - CFBundleSignature - LoVe - DTCompiler - - DTPlatformBuildx - 4E2002 - DTPlatformVersion - GM - DTSDKBuild - 11D50a - DTSDKName - macosx10.7 - DTXcode - 0432 - DTXcodeBuild - 4E2002 - NSHumanReadableCopyright - © 2006-2012 LÖVE Development Team - NSMainNibFile - SDLMain - NSPrincipalClass - NSApplication - -" > "$PROJECT_NAME".app/Contents/Info.plist - zip -9 -qr "$PROJECT_NAME"-macosx-ub.zip "$PROJECT_NAME".app - rm -rf love-$LOVE_VERSION-macosx-ub.zip "$PROJECT_NAME".app __MACOSX - fi -fi - -## Debian package ## -if [ "$RELEASE_DEB" = true ]; then - if [ -z "$PROJECT_VERSION" ] || [ -z "$PROJECT_HOMEPAGE" ] || [ -z "$PROJECT_DESCRIPTION" ] || [ -z "$MAINTAINER_NAME" ] || [ -z "$MAINTAINER_EMAIL" ]; then - echo "Could not build a Debian package. Missing informations." - else - TEMP=`mktemp -d` - mkdir -p $TEMP/DEBIAN - - echo "Package: $PACKAGE_NAME" > $TEMP/DEBIAN/control - echo "Version: $PROJECT_VERSION" >> $TEMP/DEBIAN/control - echo "Architecture: all" >> $TEMP/DEBIAN/control - echo "Maintainer: $MAINTAINER_NAME <$MAINTAINER_EMAIL>" >> $TEMP/DEBIAN/control - echo "Installed-Size: $(echo "$(stat -c %s "$PROJECT_NAME".love) / 1024" | bc)" >> $TEMP/DEBIAN/control - echo "Depends: love (>= $LOVE_VERSION)" >> $TEMP/DEBIAN/control - echo "Priority: extra" >> $TEMP/DEBIAN/control - echo "Homepage: $PROJECT_HOMEPAGE" >> $TEMP/DEBIAN/control - echo "Description: $PROJECT_DESCRIPTION" >> $TEMP/DEBIAN/control - chmod 0644 $TEMP/DEBIAN/control - - DESKTOP=$TEMP/usr/share/applications/"$PACKAGE_NAME".desktop - mkdir -p $TEMP/usr/share/applications - echo "[Desktop Entry]" > $DESKTOP - echo "Name=$PROJECT_NAME" >> $DESKTOP - echo "Comment=$PROJECT_DESCRIPTION" >> $DESKTOP - echo "Exec=$PACKAGE_NAME" >> $DESKTOP - echo "Type=Application" >> $DESKTOP - echo "Categories=Game;" >> $DESKTOP - echo "Icon=love" >> $DESKTOP - chmod 0644 $DESKTOP - - PACKAGE_DIR=/usr/share/games/"$PACKAGE_NAME"/ - PACKAGE_LOC=$PACKAGE_NAME-$PROJECT_VERSION.love - - mkdir -p $TEMP"$PACKAGE_DIR" - cp "$PROJECT_NAME".love $TEMP"$PACKAGE_DIR""$PACKAGE_LOC" - chmod 0644 $TEMP"$PACKAGE_DIR""$PACKAGE_LOC" - - BIN_LOC=/usr/bin/ - mkdir -p $TEMP$BIN_LOC - echo "#!/usr/bin/env bash" > $TEMP$BIN_LOC"$PACKAGE_NAME" - echo "set -e" >> $TEMP$BIN_LOC"$PACKAGE_NAME" - echo "love $PACKAGE_DIR$PACKAGE_LOC" >> $TEMP$BIN_LOC"$PACKAGE_NAME" - chmod 0755 $TEMP$BIN_LOC"$PACKAGE_NAME" - - cd $TEMP - for line in $(find usr/ -type f); do - md5sum $line >> $TEMP/DEBIAN/md5sums - done - chmod 0644 $TEMP/DEBIAN/md5sums - - for line in $(find usr/ -type d); do - chmod 0755 $line - done - - fakeroot dpkg-deb -b $TEMP "$RELEASE_DIR"/"$PACKAGE_NAME"-"$PROJECT_VERSION"_all.deb - cd "$RELEASE_DIR" - rm -rf $TEMP - fi -fi - -## Android apk ## -if [ "$RELEASE_APK" = true ]; then - LOVE_ANDROID_DIR="$CACHE_DIR"/love-android-sdl2 - if [ -d "$LOVE_ANDROID_DIR" ]; then - cd "$LOVE_ANDROID_DIR" - git checkout -- . - rm -rf src/com bin gen - if [ "$UPDATE_ANDROID_REPO" = true ]; then - LOCAL=$(git rev-parse @) - REMOTE=$(git rev-parse @{u}) - BASE=$(git merge-base @ @{u}) - if [ $LOCAL = $REMOTE ]; then - echo "Already up-to-date." - elif [ $LOCAL = $BASE ]; then - git pull - ndk-build --jobs $(( $(nproc) + 1)) - fi - fi - cd "$RELEASE_DIR" - else - cd "$CACHE_DIR" - git clone https://bitbucket.org/MartinFelis/love-android-sdl2.git - cd "$LOVE_ANDROID_DIR" - ndk-build --jobs $(( $(nproc) + 1)) - cd "$RELEASE_DIR" - fi - - ANDROID_VERSION=$(grep -Eo -m 1 "[0-9]+.[0-9]+.[0-9]+[a-z]*" "$LOVE_ANDROID_DIR"/AndroidManifest.xml) - ANDROID_LOVE_VERSION=$(echo "$ANDROID_VERSION" | grep -Eo "[0-9]+.[0-9]+.[0-9]+") - if [ "$LOVE_VERSION" != "$ANDROID_LOVE_VERSION" ]; then - echo "Love version ($LOVE_VERSION) differs from love-android-sdl2 version ($ANDROID_LOVE_VERSION). Could not create package." - else - mkdir -p "$LOVE_ANDROID_DIR"/assets - cp "$PROJECT_NAME".love "$LOVE_ANDROID_DIR"/assets/game.love - cd "$LOVE_ANDROID_DIR" - sed -i "s/org.love2d.android/com.${MAINTAINER_NAME}.${PACKAGE_NAME}/" AndroidManifest.xml - sed -i "s/$ANDROID_VERSION/${ANDROID_VERSION}-${PACKAGE_NAME}-v${PROJECT_VERSION}/" AndroidManifest.xml - sed -i "0,/LÖVE for Android/s//$PROJECT_NAME $PROJECT_VERSION/" AndroidManifest.xml - sed -i "s/LÖVE for Android/$PROJECT_NAME/" AndroidManifest.xml - sed -i "s/GameActivity/$ACTIVITY/" AndroidManifest.xml - - mkdir -p src/com/$MAINTAINER_NAME/$PACKAGE_NAME -echo "package com.${MAINTAINER_NAME}.${PACKAGE_NAME}; -import org.love2d.android.GameActivity; - -public class $ACTIVITY extends GameActivity {} -" > src/com/$MAINTAINER_NAME/$PACKAGE_NAME/${ACTIVITY}.java - - ant debug - cp bin/love_android_sdl2-debug.apk "$RELEASE_DIR" - cd "$RELEASE_DIR" - fi -fi - -## Love file ## -if [ "$RELEASE_LOVE" = false ]; then - rm "$PROJECT_NAME".love -fi - -echo "Done !"