updated comments.
[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\dingle'
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\dingle'
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="$(echo $BUILD_SCRIPTS_DIR | tr '\\\\' '/' )"
95 #echo post tr 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="$BUILD_SCRIPTS_DIR/../clam"
100 # synonym to make other builds happy.
101 export BUILDER_DIR="$BUILDING_HIERARCHY"
102
103 # guess the current platform.
104 IS_UNIX=$(uname | grep -i linux)
105 if [ -z "$IS_UNIX" ]; then IS_UNIX=$(uname | grep -i unix); fi
106 if [ -z "$IS_UNIX" ]; then IS_UNIX=$(uname | grep -i darwin); fi
107 IS_DOS=$(uname | grep -i ming)
108 if [ -z "$IS_DOS" ]; then IS_DOS=$(uname | grep -i cygwin); fi
109
110 # set some clam parameters for compilation.  if the script can't guess the
111 # right configuration, then you will need to set them in the last 'else'
112 # below.
113 if [ ! -z "$IS_UNIX" ]; then export OPERATING_SYSTEM=UNIX;
114 elif [ ! -z "$IS_DOS" ]; then export OPERATING_SYSTEM=WIN32;
115 else
116   # the system is unknown, so we give up on guessing.
117   export OPERATING_SYSTEM=unknown
118 fi
119 if [ ! -z "$SHELL_DEBUG" ]; then
120   echo "[OS is \"$OPERATING_SYSTEM\"]"
121 fi
122
123 #hmmm: all this stuff is highly questionable value now.
124 # we create the variable FEISTY_MEOW_DIR, but we keep the dos form of
125 # the path, because otherwise lots of bad things happens when passing the
126 # folders around to visual studio commands that don't allow a space after them.
127 if [ -d "$BUILDING_HIERARCHY/source" ]; then
128   # old style repository is same height as building hierarchy.
129   export FEISTY_MEOW_DIR="$BUILDING_HIERARCHY"
130 else
131   # new style repository is a level above the build hierarchy.
132   export FEISTY_MEOW_DIR="$(echo "$BUILDING_HIERARCHY" | sed -e 's/\(.*\)\/[^\/]*/\1/')"
133 fi
134
135 if [ "$OPERATING_SYSTEM" = "WIN32" ]; then
136   # make sure repository dir looks right on windoze.
137   export FEISTY_MEOW_DIR="$(msys_to_dos_path "$FEISTY_MEOW_DIR")"
138 fi
139
140 if [ ! -z "$SHELL_DEBUG" ]; then
141   echo "[FEISTY_MEOW_DIR is $FEISTY_MEOW_DIR]"
142 fi
143
144 # new BUILD_TOP variable points at the utter top-most level of any files
145 # in the building hierarchy.
146 export BUILD_TOP="$FEISTY_MEOW_DIR"
147
148 # this variable points at a folder where we store most of the generated products
149 # of the build.  these tend to be the things that will be used for packaging into
150 # different types of products.
151 export PRODUCTION_DIR="$BUILD_TOP/production"
152
153 # we define a log file storage area that can be relied on by the build.
154 export LOGS_DIR="$PRODUCTION_DIR/logs"
155 if [ ! -d "$LOGS_DIR" ]; then
156   mkdir -p "$LOGS_DIR"
157 fi
158
159 # hook clam into the compilation system.
160 function make()
161 {
162   /usr/bin/make -I "$CLAM_DIR" $*
163 }
164
165 ##############
166
167 # debugging area where we say what we think we know.
168
169 #echo scripts: $BUILD_SCRIPTS_DIR
170 #echo build tools hier: $BUILDING_HIERARCHY
171 #echo this tool: $THIS_TOOL_NAME
172 #echo repository: $FEISTY_MEOW_DIR
173 #echo clam: $CLAM_DIR
174 #echo makeflags: $MAKEFLAGS
175
176 ##############
177
178 # test out our computed variables to make sure they look right.
179 pushd / &>/dev/null # jump to the root so relative paths are caught.
180
181 # first the scripts directory; do we find this script there?
182 if [ ! -f "$BUILD_SCRIPTS_DIR/$THIS_TOOL_NAME" ]; then
183   echo "This script cannot locate the proper build folders.  The crucial path"
184   echo "variable seems to be '$BUILD_SCRIPTS_DIR', which"
185   echo "does not seem to contain '$THIS_TOOL_NAME' (this"
186   echo "script's apparent name)."
187 fi
188
189 # next the clam directory; is the main variables file present there?
190 if [ ! -f "$CLAM_DIR/variables.def" ]; then
191   echo "The clam directory could not be located under our build tools hierarchy."
192   echo "Please examine the configuration and make sure that this script is in a"
193   echo "directory that resides at the same height as the 'clam' directory."
194 fi
195
196 # now compute some more paths with a bit of "heuristics" for where we can
197 # find the source code.
198 export TOOL_SOURCES="$FEISTY_MEOW_DIR/nucleus/tools"
199 if [ ! -d "$TOOL_SOURCES/dependency_tool" -o ! -d "$TOOL_SOURCES/clam_tools" ]; then
200   if [ ! -d "$TOOL_SOURCES/dependency_tool" -o ! -d "$TOOL_SOURCES/clam_tools" ]; then
201     echo "This script cannot locate the tool source code folder.  This is where the"
202     echo "dependency_tool and clam_tools folders are expected to be."
203   fi
204 fi
205
206 # where we store the binaries used for building the rest of the code base.
207 export BINARY_DIR="$PRODUCTION_DIR/clam_bin"
208   # the final destination for the new binaries which provide the hoople
209   # build with all the apps it needs to get going.
210 export TARGETS_DIR="$PRODUCTION_DIR/binaries"
211   # targets directory is meaningful to clam, which will use it for output.
212 export INTERMEDIATE_EXE_DIR="$TARGETS_DIR"
213   # where we are building the apps before they get promoted.
214
215 export WASTE_DIR="$PRODUCTION_DIR/waste"
216 if [ ! -d "$WASTE_DIR" ]; then
217   mkdir -p "$WASTE_DIR"
218 fi
219 export TEMPORARIES_DIR="$WASTE_DIR/temporaries"
220 if [ ! -d "$TEMPORARIES_DIR" ]; then
221   mkdir -p "$TEMPORARIES_DIR"
222 fi
223
224 # calculate which build ini file to use.
225 export BUILD_PARAMETER_FILE="$PRODUCTION_DIR/feisty_meow_config.ini"
226 if [ ! -f "$BUILD_PARAMETER_FILE" ]; then
227   echo "Cannot find a useful build configuration file."
228 fi
229
230 # pick the executable's file ending based on the platform.
231 if [ "$OPERATING_SYSTEM" == "UNIX" ]; then export EXE_ENDING=;
232 elif [ "$OPERATING_SYSTEM" == "WIN32" ]; then export EXE_ENDING=.exe;
233 else
234   echo "The OPERATING_SYSTEM variable is unset or unknown.  Bailing out."
235 fi
236
237 # we should have established our internal variables now, so let's try
238 # using them.
239 export PATH=$BINARY_DIR:$PATH
240
241 # load up the helper variables for visual studio on winders.
242 if [ "$OPERATING_SYSTEM" == "WIN32" ]; then
243   source "$BUILD_SCRIPTS_DIR/vis_stu_vars.sh"
244 else
245   export LD_LIBRARY_PATH="$TARGETS_DIR"
246 fi
247
248 popd &>/dev/null # checking is over, jump back to the starting point.
249
250 ############################################################################
251
252 # at this point, all the build related variables should be valid.
253
254 if [ -z "$INCLUDED_FROM_BOOTSTRAP" \
255     -a -z "$PARM_1" ]; then
256   # we are running as a stand-alone script, so we stay resident with our
257   # current set of variables.
258   bash
259 fi
260
261 ############################################################################
262