From 66bbf336c6af7353ef0aeed58002c46543b30635 Mon Sep 17 00:00:00 2001 From: rubidium Date: Tue, 2 Jan 2007 19:19:48 +0000 Subject: (svn r7759) -Merge: makefile rewrite. This merge features: - A proper ./configure, so everything needs to be configured only once, not for every make. - Usage of makedepend when available. This greatly reduces the time needed for generating the dependencies. - A generator for all project files. There is a single file with sources, which is used to generate Makefiles and the project files for MSVC. - Proper support for OSX universal binaries. - Object files for non-MSVC compiles are also placed in separate directories, making is faster to switch between debug and release compiles and it does not touch the directory with the source files. - Functionality to make a bundle of all needed files for for example a nightly or distribution of a binary with all needed GRFs and language files. Note: as this merge moves almost all files, it is recommended to make a backup of your working copy before updating your working copy. --- configure | 400 ++++++++++++++++---------------------------------------------- 1 file changed, 99 insertions(+), 301 deletions(-) (limited to 'configure') diff --git a/configure b/configure index 2fd293954..49f26b682 100755 --- a/configure +++ b/configure @@ -1,323 +1,121 @@ #!/bin/sh -# This 'configure' script is a very easy wrapper around 'make updateconf' -# It allows cross-compilers to do their job much more easy. +# Find out where configure is (in what dir) +ROOT_DIR="`dirname $0`" +ROOT_DIR="`cd $ROOT_DIR && pwd`" -function showhelp() { - echo "Configure for OpenTTD" - echo "" - echo "Usage:" - echo " $0 --your_options" - echo "" - echo "Params:" - echo " --debug Create debug-release [no]" - echo " --profile Create profile-release [no]" - echo " --dedicated Make a dedicated build [no]" - echo " --revision Set the revision of the compilation [detected]" - echo " --target-cc Sets the target-compiler [\$CC]" - echo " --target-cxx Sets the C++ target-compiler []" - echo " --host-cc Sets the host-compiler [\$CC]" - echo " --host-cxx Sets the C++ host-compiler []" - echo " --os Sets the OS. Listens to: [detected]" - echo " UNIX, OSX, FREEBSD, MORPHOS" - echo " BEOS, SUNOS, CYGWIN, MINGW, OS2" - echo " --windres Sets the windres (Windows) [windres]" - echo " --force-le Force LE platform [no]" - echo " --force-be Force BE platform [no]" - echo "" - echo "Params that can be used with --with or --without" - echo " (e.g.: --without-static disables static (default))" - echo " static Do you want a static build? [no]" - echo " directmusic Do you want direct-music? [no]" - echo " zlib Do you want zlib-support? [yes]" - echo " sdl Do you want SDL-support? [yes]" - echo " png Do you want PNG-support? [yes]" - echo " iconv Do you want iconv-support? [no]" - echo " network Do you want network-support? [yes]" - echo " cocoa Do you want cocoa-support? (MacOSX) [no]" - echo " freetype Do you want freetype-support? [yes]" - echo " fontconfig Do you want fontconfig-support? [yes]" - echo "" - echo "Params used to configure external libs:" - echo " --static-zlib-path Set the path to your static zlib []" - echo " --sdl-config Where is your sdl-config [sdl-config]" - echo " --libpng-config Where is your libpng-config [libpng-config]" - echo " --freetype-config Where is your freetype-config [freetype-config]" - echo " --fontconfig-config Where is your fontconfig-config [pkg-config fontconfig]" - echo " --with-iconv Set the path to your iconv headers []" - echo " " -} +PWD="`pwd`" +PREFIX="`pwd`/bin" -function handle() { - PARAM="$PARAM \"$1=`awk 'BEGIN { FS="="; $0="'"$2"'"; print $2;}'`\"" -} +. $ROOT_DIR/config.lib -# The things you can use inside this case: -# handle NAME VALUE - Sets the value to give the 'make upgradeconf' -# Value is in form: tag=REAL_VALUE -# ITEM="NAME" - Will set the value as above, only with the next param -# SITEM="NAME" - Will set the var $NAME to the next param -for n in "$@" -do - case "$n" in - --help | -h) - showhelp - exit 0 - ;; +# Set default dirs +OBJS_DIR="$PWD/objs" +BASE_SRC_OBJS_DIR="$OBJS_DIR" +LANG_OBJS_DIR="$OBJS_DIR/lang" +BIN_DIR="$PREFIX" +SRC_DIR="$ROOT_DIR/src" +LANG_DIR="$SRC_DIR/lang" +MEDIA_DIR="$ROOT_DIR/media" +SOURCE_LIST="$ROOT_DIR/source.list" - --debug) - DEBUG_SET=1 - ITEM="DEBUG" - ;; - --debug=*) - handle "DEBUG" "$n" - ;; - --profile) - PARAM="$PARAM PROFILE=1" - ;; - --dedicated) - PARAM="$PARAM DEDICATED=1" - ;; - --revision=*) - RELEASE=`awk 'BEGIN { FS="="; $0="'"$n"'"; print $2;}'` - ;; - --revision) - SITEM="RELEASE" - ;; - --target-cc=*) - handle "CC_TARGET" "$n" - ;; - --target-cc) - ITEM="CC_TARGET" - ;; - --target-cxx=*) - handle "CXX_TARGET" "$n" - ;; - --target-cxx) - SITEM="CXX_TARGET" - ;; - --host-cc=*) - handle "CC_HOST" "$n" - ;; - --host-cc) - ITEM="CC_HOST" - ;; - --host-cxx=*) - handle "CXX_HOST" "$n" - ;; - --host-cxx) - ITEM="CXX_HOST" - ;; - --host-cflags=*) - handle CFLAGS_HOST "$n" - ;; - --host-cflags) - ITEM="CFLAGS_HOST" - ;; - --os=*) - TARGET_OS=`awk 'BEGIN { FS="="; $0="'"$n"'"; print $2;}'` - ;; - --os) - SITEM="TARGET_OS" - ;; - --windres=*) - handle WINDRES "$n" - ;; - --windres) - ITEM="WINDRES" - ;; - --force-le) - PARAM="$PARAM ENDIAN_FORCE=LE" - ;; - --force-be) - PARAM="$PARAM ENDIAN_FORCE=BE" - ;; +if [ "$1" = "--reconfig" ] +then + if ! [ -f "config.cache" ] + then + echo "can't reconfigure, because never configured before" + exit 1 + fi + # Make sure we don't lock config.cache + configure=`cat config.cache` + $configure + exit $? +fi - --with-static) - PARAM="$PARAM STATIC=1" - ;; - --without-static) - PARAM="$PARAM STATIC=" - ;; - --with-directmusic) - PARAM="$PARAM WITH_DIRECTMUSIC=1" - ;; - --without-directmusic) - PARAM="$PARAM WITH_DIRECTMUSIC=" - ;; - --with-zlib) - PARAM="$PARAM WITH_ZLIB=1" - ;; - --without-zlib) - PARAM="$PARAM WITH_ZLIB=" - ;; - --with-sdl) - PARAM="$PARAM WITH_SDL=1" - ;; - --without-sdl) - PARAM="$PARAM WITH_SDL=" - ;; - --with-png) - PARAM="$PARAM WITH_PNG=1" - ;; - --without-png) - PARAM="$PARAM WITH_PNG=" - ;; - --with-iconv) - PARAM="$PARAM WITH_ICONV=1" - ;; - --with-iconv=*) - PARAM="$PARAM WITH_ICONV=1" - handle WITH_ICONV_PATH "$n" - ;; - --without-iconv) - PARAM="$PARAM WITH_ICONV=" - ;; - --with-cocoa) - PARAM="$PARAM WITH_COCOA=1" - ;; - --with-network) - PARAM="$PARAM WITH_NETWORK=1" - ;; - --without-network) - PARAM="$PARAM WITH_NETWORK=" - ;; - --without-cocoa) - PARAM="$PARAM WITH_COCOA=" - ;; - --with-freetype) - PARAM="$PARAM WITH_FREETYPE=1" - ;; - --without-freetype) - PARAM="$PARAM WITH_FREETYPE=" - ;; - --with-fontconfig) - PARAM="$PARAM WITH_FONTCONFIG=1" - ;; - --without-fontconfig) - PARAM="$PARAM WITH_FONTCONFIG=" - ;; - --static-zlib-path=*) - handle STATIC_ZLIB_PATH "$n" - ;; - --static-zlib-path) - ITEM="STATIC_ZLIB_PATH" - ;; - --sdl-config=*) - handle SDL_CONFIG "$n" - ;; - --sdl-config) - ITEM="SDL_CONFIG" - ;; - --libpng-config=*) - handle LIBPNG_CONFIG "$n" - ;; - --libpng-config) - ITEM="LIBPNG_CONFIG" - ;; - --freetype-config=*) - handle FREETYPE_CONFIG "$n" - ;; - --freetype-config) - ITEM="FREETYPE_CONFIG" - ;; - --fontconfig-config=*) - handle FONTCONFIG_CONFIG "$n" - ;; - --fontconfig-config) - ITEM="FONTCONFIG_CONFIG" - ;; +set_default +detect_params $@ +save_params +check_params +make_cflags_and_ldflags - --*=*) - echo -n "Unknown switch " - echo `awk 'BEGIN { FS="="; $0="'"$n"'"; print $1;}'` - exit 1 - ;; - -*) - echo "Unknown switch $n" - exit 1 - ;; +EXE="" +if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "OS2" ] +then + EXE=".exe" +fi - *) - if ! test -z "$ITEM" - then - PARAM="$PARAM $ITEM=\"$n\"" - ITEM=""; - elif ! test -z "$SITEM" - then - export $SITEM="$n" - SITEM="" - else - echo "Unknown switch $n" - exit 1 - fi - ;; - esac -done +TTD="openttd$EXE" +STRGEN="strgen$EXE" +ENDIAN_CHECK="endian_check$EXE" -if ! test -z "$TARGET_OS" +if [ -z "$sort" ] then - TARGET_OS=`echo $TARGET_OS | tr '[:lower:]' '[:upper:]'` - case "$TARGET_OS" in - WIN32) - PARAM="$PARAM WIN32=1" - ;; - UNIX) - PARAM="$PARAM UNIX=1" - ;; - OSX) - PARAM="$PARAM OSX=1 UNIX=1" - ;; - FREEBSD) - PARAM="$PARAM FREEBSD=1" - ;; - MORPHOS) - PARAM="$PARAM MORPHOS=1 UNIX=1" - ;; - BEOS) - PARAM="$PARAM BEOS=1 UNIX=1" - ;; - OS2) - PARAM="$PARAM OS2=1 UNIX=1" - ;; - SUNOS) - PARAM="$PARAM SUNOS=1 UNIX=1" - ;; - CYGWIN) - PARAM="$PARAM CYGWIN=1 WIN32=1" - ;; - MINGW) - PARAM="$PARAM MINGW=1 WIN32=1" - ;; - *) - echo "Unknown OS: $TARGET_OS" - exit 1 - ;; - esac - PARAM="$PARAM BYPASS_OS_DETECT=1" + PIPE_SORT="sed s/a/a/" +else + PIPE_SORT="$sort" fi -if ! test -z "$DEBUG_SET" +if ! [ -f "$LANG_DIR/english.txt" ] then - if test -z "`echo $PARAM | grep "DEBUG="`" - then - # Someone did --debug, without assigning a value, assume 1 - PARAM="$PARAM DEBUG=1" - fi + echo "Languages not found in $LANG_DIR. Can't continue without it." + echo "Please make sure the dir exists and contains at least english.txt" fi -# First remove the Makefile.config, else you can have double entries -rm -f Makefile.config +# Read the source.list and process it +SRCS="`cat $ROOT_DIR/source.list | tr '\r' '\n' | awk ' + { } + /^( *)#end/ { if (deep == skip) { skip -= 1; } deep -= 1; next; } + /^( *)#else/ { if (deep == skip) { skip -= 1; } else if (deep - 1 == skip) { skip += 1; } next; } + /^( *)#if/ { + gsub(" ", "", $0); + gsub("^#if ", "", $0); + + if (deep != skip) { deep += 1; next; } + + deep += 1; -echo "make upgradeconf $PARAM" > Makefile.run -. Makefile.run -rm -f Makefile.run + if ($0 == "SDL" && "'$sdl_config'" == "") { next; } + if ($0 == "OSX" && "'$os'" != "OSX") { next; } + if ($0 == "DEDICATED" && "'$enable_dedicated'" != "1") { next; } + if ($0 == "COCOA" && "'$with_cocoa'" == "0") { next; } + if ($0 == "BEOS" && "'$os'" != "BEOS") { next; } + if ($0 == "WIN32" && "'$os'" != "MINGW" && + "'$os'" != "CYGWIN" && "'$os'" != "MSVC" ) { next; } + if ($0 == "MSVC" && "'$os'" != "MSVC") { next; } + if ($0 == "DIRECTMUSIC" && "'$with_direct_music'" != "1") { next; } -# Makefile.config currently doesn't support custom RELEASE (revision), so, we add the line -# yourself! + skip += 1; -if ! test -z "$RELEASE" + next; + } + /^( *)#/ { next } + /^$/ { next } + /\.h$/ { next } + /\.hpp$/ { next } + { + if (deep == skip) { + gsub(" ", "", $0); + print $0; + } + } +' | $PIPE_SORT`" + +OBJS_C="` echo \"$SRCS\" | awk ' { ORS = " " } /\.c$/ { gsub(".c$", ".o", $0); print $0; }'`" +OBJS_CPP="`echo \"$SRCS\" | awk ' { ORS = " " } /\.cpp$/ { gsub(".cpp$", ".o", $0); print $0; }'`" +OBJS_M="` echo \"$SRCS\" | awk ' { ORS = " " } /\.m$/ { gsub(".m$", ".o", $0); print $0; }'`" +OBJS_RC="` echo \"$SRCS\" | awk ' { ORS = " " } /\.rc$/ { gsub(".rc$", ".o", $0); print $0; }'`" +SRCS="` echo \"$SRCS\" | awk ' { ORS = " " } { print $0; }'`" + +# In makefiles, we always use -u for sort +if [ -z "$sort" ] then - echo "RELEASE=$RELEASE" >> Makefile.config + sort="sed s/a/a/" +else + sort="$sort -u" fi +CONFIGURE_FILES="$ROOT_DIR/configure $ROOT_DIR/config.lib $ROOT_DIR/Makefile.in $ROOT_DIR/Makefile.lang.in $ROOT_DIR/Makefile.src.in" + +generate_main +generate_lang +generate_src -- cgit v1.2.3-70-g09d2