updated to fix issues with building outside of bootstrap.
[feisty_meow.git] / scripts / generator / build_variables.sh
1 ##############
2 #
3 #  Name   : build variable calculator
4 #  Author : Chris Koeritz
5 #
6 #  Purpose:
7 #
8 #    This script sets up all the variables needed by the HOOPLE system for
9 #  building the source code.  It can either be run as a bash script directly
10 #  like so:
11 #
12 #      bash ~/feisty_meow/scripts/generator/build_variables.sh
13 #
14 #  which will establish a new shell containing all the variables, or you can
15 #  'source' the script like so:
16 #
17 #      build_vars=~/feisty_meow/scripts/generator/build_variables.sh
18 #      source $build_vars $build_vars
19 #
20 #  to set all of the variables in your current shell.  The full path is
21 #  necessary in these commands to allow the script to easily find itself.
22 #  The 'source' version needs to be fed the actual path to the script
23 #  because bash 'source' commands cause the first parameter (called $0) to
24 #  be set to just the path to bash itself.
25 #
26 ##############
27 # Copyright (c) 2004-$now By Author.  This program is free software; you can
28 # redistribute it and/or modify it under the terms of the GNU General Public
29 # License as published by the Free Software Foundation; either version 2 of
30 # the License or (at your option) any later version.  This is online at:
31 #     http://www.fsf.org/copyleft/gpl.html
32 # Please send any updates to: fred@gruntose.com
33 ##############
34
35 # prerequisites for this script:
36 #
37 # (1) the script should be run with a full path, so that it can decide where
38 #     it lives with minimal fuss.
39 # (2) on windows, the msys bin directory should already be in the path so that
40 #     tools like dirname are already available.
41
42 # here is where we compute the locations for the build's pieces, based on
43 # where this script is located.  we currently assume that the build scripts
44 # like this one are at the same height in the hierarchy as the clam scripts
45 # that are used in the bootstrapping process.
46
47 # get the most important bits first; the directory this script lives in and
48 # the script's name.
49 PARM_0="$0"
50 PARM_1="$1"
51
52 ##############
53
54 # helpful build function zone.
55
56 # switches from a /X/path form to an X:/ form.
57 function msys_to_dos_path() {
58   # we always remove dos slashes in favor of forward slashes.
59   echo "$1" | sed -e 's/\\/\//g' | sed -e 's/\/\([a-zA-Z]\)\/\(.*\)/\1:\/\2/'
60 }
61
62 # switches from an X:/ form to an /X/path form.
63 function dos_to_msys_path() {
64   # we always remove dos slashes in favor of forward slashes.
65   echo "$1" | sed -e 's/\\/\//g' | sed -e 's/\([a-zA-Z]\):\/\(.*\)/\/\1\/\2/'
66 }
67
68 ###hmmm: move test suite out to the functions file in yeti, where the definitive versions
69 #        of dos to msys etc live.
70 # test suite for above functions.
71 #echo this should go from msys to dos:
72 #  prior='/c/bogart\dongle'
73 #  latter=$(msys_to_dos_path "$prior")
74 #  echo went from $prior to $latter
75 #echo this should go from dos to msys:
76 #  prior='D:\bogart\dongle'
77 #  latter=$(dos_to_msys_path "$prior")
78 #  echo went from $prior to $latter
79
80 ##############
81
82 # perform some calculations to get the right paths from our parameters.
83 if [ ! -z "$PARM_1" ]; then
84   # use the first real parameter since this is probably the 'source' version.
85   export BUILD_SCRIPTS_DIR="$(dirname "$PARM_1")"
86   THIS_TOOL_NAME="$(basename "$PARM_1")"
87 #echo sourced version buildscriptsdir is $BUILD_SCRIPTS_DIR
88 else
89   # use the zeroth parameter, since we know nothing more about our name.
90   export BUILD_SCRIPTS_DIR="$(dirname "$PARM_0")"
91   THIS_TOOL_NAME="$(basename "$PARM_0")"
92 #echo bashed version buildscriptsdir is $BUILD_SCRIPTS_DIR
93 fi
94 BUILD_SCRIPTS_DIR="$(cd $(echo $BUILD_SCRIPTS_DIR | tr '\\\\' '/' ); \pwd)"
95 #echo ">> buildscriptsdir is $BUILD_SCRIPTS_DIR"
96
97 # figure out the other paths based on where we found this script.
98 export BUILDING_HIERARCHY="$(echo "$BUILD_SCRIPTS_DIR" | sed -e 's/\(.*\)\/[^\/]*/\1/')"
99 export CLAM_DIR="$(cd $BUILD_SCRIPTS_DIR/../clam ; \pwd)"
100 #echo ">> clamdir is $CLAM_DIR"
101 # synonym to make other builds happy.
102 export BUILDER_DIR="$BUILDING_HIERARCHY"
103
104 # guess the current platform.
105 IS_UNIX=$(uname | grep -i linux)
106 if [ -z "$IS_UNIX" ]; then IS_UNIX=$(uname | grep -i unix); fi
107 if [ -z "$IS_UNIX" ]; then IS_UNIX=$(uname | grep -i darwin); fi
108 IS_DOS=$(uname | grep -i ming)
109 if [ -z "$IS_DOS" ]; then IS_DOS=$(uname | grep -i cygwin); fi
110
111 # set some clam parameters for compilation.  if the script can't guess the
112 # right configuration, then you will need to set them in the last 'else'
113 # below.
114 if [ ! -z "$IS_UNIX" ]; then export OPERATING_SYSTEM=UNIX;
115 elif [ ! -z "$IS_DOS" ]; then export OPERATING_SYSTEM=WIN32;
116 else
117   # the system is unknown, so we give up on guessing.
118   export OPERATING_SYSTEM=unknown
119 fi
120 if [ ! -z "$SHELL_DEBUG" ]; then
121   echo "[OS is \"$OPERATING_SYSTEM\"]"
122 fi
123
124 #hmmm: all this stuff is highly questionable value now.
125 # we create the variable FEISTY_MEOW_DIR, but we keep the dos form of
126 # the path, because otherwise lots of bad things happens when passing the
127 # folders around to visual studio commands that don't allow a space after them.
128 if [ -d "$BUILDING_HIERARCHY/source" ]; then
129   # old style repository is same height as building hierarchy.
130   export FEISTY_MEOW_DIR="$BUILDING_HIERARCHY"
131 else
132   # new style repository is a level above the build hierarchy.
133   export FEISTY_MEOW_DIR="$(echo "$BUILDING_HIERARCHY" | sed -e 's/\(.*\)\/[^\/]*/\1/')"
134 fi
135
136 if [ "$OPERATING_SYSTEM" = "WIN32" ]; then
137   # make sure repository dir looks right on windoze.
138   export FEISTY_MEOW_DIR="$(msys_to_dos_path "$FEISTY_MEOW_DIR")"
139 fi
140
141 if [ ! -z "$SHELL_DEBUG" ]; then
142   echo "[FEISTY_MEOW_DIR is $FEISTY_MEOW_DIR]"
143 fi
144
145 # new BUILD_TOP variable points at the utter top-most level of any files
146 # in the building hierarchy.
147 export BUILD_TOP="$FEISTY_MEOW_DIR"
148
149 # this variable points at a folder where we store most of the generated products
150 # of the build.  these tend to be the things that will be used for packaging into
151 # different types of products.
152 export PRODUCTION_DIR="$BUILD_TOP/production"
153
154 # we define a log file storage area that can be relied on by the build.
155 export LOGS_DIR="$PRODUCTION_DIR/logs"
156 if [ ! -d "$LOGS_DIR" ]; then
157   mkdir -p "$LOGS_DIR"
158 fi
159
160 # hook clam into the compilation system.
161 function make()
162 {
163   /usr/bin/make -I "$CLAM_DIR" $*
164 }
165
166 ##############
167
168 # debugging area where we say what we think we know.
169
170 #echo scripts: $BUILD_SCRIPTS_DIR
171 #echo build tools hier: $BUILDING_HIERARCHY
172 #echo this tool: $THIS_TOOL_NAME
173 #echo repository: $FEISTY_MEOW_DIR
174 #echo clam: $CLAM_DIR
175 #echo makeflags: $MAKEFLAGS
176
177 ##############
178
179 # test out our computed variables to make sure they look right.
180 pushd / &>/dev/null # jump to the root so relative paths are caught.
181
182 # first the scripts directory; do we find this script there?
183 if [ ! -f "$BUILD_SCRIPTS_DIR/$THIS_TOOL_NAME" ]; then
184   echo "This script cannot locate the proper build folders.  The crucial path"
185   echo "variable seems to be '$BUILD_SCRIPTS_DIR', which"
186   echo "does not seem to contain '$THIS_TOOL_NAME' (this"
187   echo "script's apparent name)."
188 fi
189
190 # next the clam directory; is the main variables file present there?
191 if [ ! -f "$CLAM_DIR/variables.def" ]; then
192   echo "The clam directory could not be located under our build tools hierarchy."
193   echo "Please examine the configuration and make sure that this script is in a"
194   echo "directory that resides at the same height as the 'clam' directory."
195 fi
196
197 # now compute some more paths with a bit of "heuristics" for where we can
198 # find the source code.
199 export TOOL_SOURCES="$FEISTY_MEOW_DIR/nucleus/tools"
200 if [ ! -d "$TOOL_SOURCES/dependency_tool" -o ! -d "$TOOL_SOURCES/clam_tools" ]; then
201   if [ ! -d "$TOOL_SOURCES/dependency_tool" -o ! -d "$TOOL_SOURCES/clam_tools" ]; then
202     echo "This script cannot locate the tool source code folder.  This is where the"
203     echo "dependency_tool and clam_tools folders are expected to be."
204   fi
205 fi
206
207 # where we store the binaries used for building the rest of the code base.
208 export BINARY_DIR="$PRODUCTION_DIR/clam_bin"
209   # the final destination for the new binaries which provide the hoople
210   # build with all the apps it needs to get going.
211 export TARGETS_DIR="$PRODUCTION_DIR/binaries"
212   # targets directory is meaningful to clam, which will use it for output.
213 export INTERMEDIATE_EXE_DIR="$TARGETS_DIR"
214   # where we are building the apps before they get promoted.
215
216 export WASTE_DIR="$PRODUCTION_DIR/waste"
217 if [ ! -d "$WASTE_DIR" ]; then
218   mkdir -p "$WASTE_DIR"
219 fi
220 export TEMPORARIES_DIR="$WASTE_DIR/temporaries"
221 if [ ! -d "$TEMPORARIES_DIR" ]; then
222   mkdir -p "$TEMPORARIES_DIR"
223 fi
224
225 # calculate which build ini file to use.
226 export BUILD_PARAMETER_FILE="$PRODUCTION_DIR/feisty_meow_config.ini"
227 if [ ! -f "$BUILD_PARAMETER_FILE" ]; then
228   echo "Cannot find a useful build configuration file."
229 fi
230
231 # pick the executable's file ending based on the platform.
232 if [ "$OPERATING_SYSTEM" == "UNIX" ]; then export EXE_ENDING=;
233 elif [ "$OPERATING_SYSTEM" == "WIN32" ]; then export EXE_ENDING=.exe;
234 else
235   echo "The OPERATING_SYSTEM variable is unset or unknown.  Bailing out."
236 fi
237
238 # we should have established our internal variables now, so let's try
239 # using them.
240 export PATH=$BINARY_DIR:$PATH
241
242 # load up the helper variables for visual studio on winders.
243 if [ "$OPERATING_SYSTEM" == "WIN32" ]; then
244   source "$BUILD_SCRIPTS_DIR/vis_stu_vars.sh"
245 else
246   export LD_LIBRARY_PATH="$TARGETS_DIR"
247 fi
248
249 popd &>/dev/null # checking is over, jump back to the starting point.
250
251 ############################################################################
252
253 # at this point, all the build related variables should be valid.
254
255 if [ -z "$INCLUDED_FROM_BOOTSTRAP" \
256     -a -z "$PARM_1" ]; then
257   # we are running as a stand-alone script, so we stay resident with our
258   # current set of variables.
259   bash
260 fi
261
262 ############################################################################
263