#!/bin/bash ############################## IMPORTANT NOTE ################################### # # This script allows to produce an executable for linux or windows # using respectively gcc or cross-compilation tools from mingw # For the latter, it should be noticed that it is only possible # to produce 32bits executable for windows. # Supposing that the host runs a 64bits debian, it implies to install: # - binutils-mingw-w64-i686 # - g++-mingw-w64-i686 # - gcc-mingw-w64-i686 # Since includes and libs are the same for windows or Linux Qt, it also # implies to get a copy of a windows 32bits Qt installation. By default, # this copy is supposed to be placed in /usr/local/qt5-win32 (for qt v5) # ################################################################################## # setting defaults for linux os_lin=lin arch_lin=64 qtver_lin=5 qtpath_lin=/usr/include/x86_64-linux-gnu/qt5 # setting defaults for win os_win=win arch_win=32 qtver_win=5 qtpath_win=/usr/local/qt5-win32 os="" arch="" qtver="" # NOTE : qtpath corresponds to the Qt includes path under Linux, # and to the path of a copy of Qt installation root directory under Windows qtpath="" # default application name : void appname="" # default application version : 0.1 appver=0.1 # default : compile with no debug informations debug="" usage() { echo "configure [-b|--debug] [-d|--defaults win|lin] [-a|--arch 32|64] [-o|--os win|lin] [-q|--qtver 4|5] [-p|--pathqt path] [-v|--appver vernum ] appname" echo " -b|--debug: generate makefile so that compilations are done with -g option" echo " -d|--defaults: using defaults for windows (win) or linux (lin)" echo " for win, equivalent to -o win -a 32 -q 5 -p /usr/local/qt5-win32" echo " for lin, equivalent to -o lin -a 64 -q 5 -p /usr/include/x86_64-linux-gnu/qt5" echo " -a|--arch: define target architecture 32 (default for windows) or 64 bits (default for linux)" echo " -o|--os: define target os, i.e. windows or linux" echo " -q|--qtver: define qt version, i.e. 4 or 5" echo " -o|--qtpath: define includes path for linux, or for windows, the path of the copy of qt windows installation" echo " -v|--appver: define application version, e.g 0.2" echo " appname: define the application name, i.e. executable name will be appname under linux or appname.exe under windows" echo echo " note that depending on where -d is placed, it may override or maybe overidden by other parameters" exit 1; } #getting parameters while [ ! .$1 = . ] ; do case "$1" in -h|--help) usage;; -b|--debug) debug="-g"; shift 1;; -d|--defaults) case "$2" in win*) os=$os_win; arch=$arch_win; qtver=$qtver_win; qtpath=$qtpath_win; shift 2;; lin*) os=$os_lin; arch=$arch_lin; qtver=$qtver_lin; qtpath=$qtpath_lin; shift 2;; esac ;; -a|--arch) case "$2" in 32) arch=32; shift 2;; 64) arch=64; shift 2;; *) arch="" ; shift 2 ;; esac ;; -o|--os) case "$2" in win*) os=win; shift 2;; *) os=lin; shift 2;; # default is linux esac ;; -q|--qtver) case "$2" in 4) qtver=4; shift 2;; *) qtver=5; shift 2;; # default is v5 esac ;; -p|--pathqt) case "$2" in /*) qtpath=$2; shift 2;; *) qtpath=""; shift 2;; esac ;; -v|--appver) appver=$2; shift 2;; --) shift ; break ;; *) if [ .$appname = . ]; then appname=$1; shift else echo "$1 is not a valid option or appname already set. Aborting !" ; exit 1 fi;; esac done if [ .$appname = . ]; then if [ ! .$1 = . ]; then appname=$1 else echo "Application name is not defined. Aborting !" ; exit 1 fi fi echo "application name : $appname" if [ "$os" = "" ]; then os=$os_lin fi if [ "$arch" = "" ]; then if [ $os = lin ]; then arch=$arch_lin elif [ $os = win ]; then arch=$arch_win fi fi if [ "$qtver" = "" ]; then if [ $os = lin ]; then qtver=$qtver_lin elif [ $os = win ]; then qtver=$qtver_win fi fi if [ "$qtpath" = "" ]; then if [ $os = lin ]; then qtpath=$qtpath_lin elif [ $os = win ]; then qtpath=$qtpath_win fi fi if [ -f Makefile ]; then echo "Removing existing makefile" rm Makefile fi if [ $os = lin ]; then echo "creating makefile for building linux ($arch bits) version $appver of $appname" else echo "creating makefile for building windows ($arch bits) version $appver of $appname" fi mkdir -p build/${os}${arch} # get the app. name in capitals appdef=$(echo $appname | tr [a-z] [A-Z]) # generate the real Makefile # 1 - search/replace cat Makefile.in | sed "s|@@APPNAME@@|${appname}|g;s|@@APPDEF@@|${appdef}|g;s|@@APPVER@@|${appver}|g;s|@@OS@@|${os}|g;s|@@ARCH@@|${arch}|g;s|@@QTVER@@|${qtver}|g;s|@@QTPATH@@|${qtpath}|g;s|@@DEBUG@@|${debug}|g" > Makefile # 2 - adding includes dependencies to Makefile for src in *.cpp; do gcc -MM $src | sed 's!^\(.*\):!$(BUILDPATH)/\1:!' | cat >> Makefile done # generate the real installation script for linux cat install.sh.in | sed "s|@@APPNAME@@|${appname}|g" > install.sh