43f386c600d4e2e579d93fa5f6e5a5977cece136
[feisty_meow.git] / scripts / generator / build_variables.sh
1 #!/bin/bash
2
3 ##############
4 #
5 #  Name   : build variable calculator
6 #  Author : Chris Koeritz
7 #
8 #  Purpose:
9 #
10 #    This script sets up all the variables needed by the HOOPLE system for
11 #  building the source code.  It can either be run as a bash script directly
12 #  like so:
13 #
14 #      bash $FEISTY_MEOW_APEX/scripts/generator/build_variables.sh
15 #
16 #  which will establish a new shell containing all the variables, or you can
17 #  'source' the script like so:
18 #
19 #      build_vars=$FEISTY_MEOW_APEX/scripts/generator/build_variables.sh
20 #      source $build_vars $build_vars
21 #
22 #  to set all of the variables in your current shell.  The full path is
23 #  necessary in these commands to allow the script to easily find itself.
24 #  The 'source' version needs to be fed the actual path to the script
25 #  because bash 'source' commands cause the first parameter (called $0) to
26 #  be set to just the path to bash itself.
27 #
28 ##############
29 # Copyright (c) 2004-$now By Author.  This program is free software; you can
30 # redistribute it and/or modify it under the terms of the GNU General Public
31 # License as published by the Free Software Foundation; either version 2 of
32 # the License or (at your option) any later version.  This is online at:
33 #     http://www.fsf.org/copyleft/gpl.html
34 # Please send any updates to: fred@gruntose.com
35 ##############
36
37 # here is where we compute the locations for the build's pieces, based on
38 # where this script is located.  we currently assume that the build scripts
39 # like this one are at the same height in the hierarchy as the clam scripts
40 # that are used in the bootstrapping process.
41
42 # get the most important bits first; the directory this script lives in and
43 # the script's name.
44 PARM_0="$0"
45 PARM_1="$1"
46
47 ##############
48
49 # helpful build function zone.
50
51 source "$FEISTY_MEOW_SCRIPTS/core/functions.sh"
52
53 ##############
54
55 # outer check on whether this already was run or not.
56 if [ -z "$BUILD_VARS_LOADED" ]; then
57
58 # perform some calculations to get the right paths from our parameters.
59 if [ ! -z "$PARM_1" ]; then
60   # use the first real parameter since this is probably the 'source' version.
61   export BUILD_SCRIPTS_PATH="$(dirname "$PARM_1")"
62   THIS_TOOL_NAME="$(basename "$PARM_1")"
63 else
64   # use the zeroth parameter, since we know nothing more about our name.
65   export BUILD_SCRIPTS_PATH="$(dirname "$PARM_0")"
66   THIS_TOOL_NAME="$(basename "$PARM_0")"
67 fi
68 BUILD_SCRIPTS_PATH="$(cd $(echo $BUILD_SCRIPTS_PATH | tr '\\\\' '/' ); \pwd)"
69
70 # figure out the other paths based on where we found this script.
71 export BUILDING_HIERARCHY="$(echo "$BUILD_SCRIPTS_PATH" | sed -e 's/\(.*\)\/[^\/]*/\1/')"
72 export CLAM_SCRIPTS="$(cd $BUILD_SCRIPTS_PATH/../clam ; \pwd)"
73 # synonym to make other builds happy.
74 export BUILDER_PATH="$BUILDING_HIERARCHY"
75
76 # set some clam parameters for compilation.  if the script can't guess the
77 # right configuration, then you will need to set them in the last 'else'
78 # below.
79 if [ ! -z "$IS_UNIX" ]; then export OPERATING_SYSTEM=UNIX;
80 elif [ ! -z "$IS_DOS" ]; then export OPERATING_SYSTEM=WIN32;
81 else
82   # the system is unknown, so we give up on guessing.
83   export OPERATING_SYSTEM=unknown
84 fi
85 if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then
86   echo "[OS is \"$OPERATING_SYSTEM\"]"
87 fi
88
89 if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then
90   echo "[FEISTY_MEOW_APEX is $FEISTY_MEOW_APEX]"
91 fi
92
93 # set some extra variables that clam uses.
94
95 # CLAM_ON_UNIX or CLAM_ON_DOS might get defined here.
96 # we also can set OS_SUBCLASS if we detect darwin.
97 if [ $OPERATING_SYSTEM == UNIX ]; then
98   export CLAM_ON_UNIX=$(uname)
99   if [[ $CLAM_ON_UNIX =~ .*[Dd]arwin.* ]]; then
100     # pick the subclass now that we know this is darwin.
101     export CLAM_OS_SUBCLASS=darwin
102   fi
103 elif [ $OPERATING_SYSTEM == WIN32 ]; then
104   export CLAM_ON_DOS=$(uname)
105 else
106   echo "Unknown operating system--clam will not build well here."
107 fi
108
109 # CLAM_BASE_CPU is a flag that distinguishes the type of processor, if necessary.
110 export CLAM_BASE_CPU="$(machine 2>/dev/null || arch 2>/dev/null || uname -m 2>/dev/null || echo i686)"
111
112 # "FEISTY_MEOW_CPP_HEADERS" are folders where our C and C++ header files can be found.
113 # we'll compute the set of folders as best we can below.
114 if [ -d "$FEISTY_MEOW_APEX/nucleus" ]; then
115   # just assumes we're at home and know our header locations under the feisty meow hierarchy.
116   export LOCUS_LIBRARY_HEADERS="$FEISTY_MEOW_APEX/nucleus $FEISTY_MEOW_APEX/octopi $FEISTY_MEOW_APEX/graphiq"
117 else
118   export LOCUS_LIBRARY_HEADERS=
119 fi 
120    ####blech!  maybe not needed now?  was involved above.  | tr "\\\\" / | sed -e "s/\([a-zA-Z]\):\/\([^ ]*\)/\/cygdrive\/\1\/\2/g" ')
121 export FEISTY_MEOW_CPP_HEADERS=$(find $LOCUS_LIBRARY_HEADERS -mindepth 1 -maxdepth 1 -type d | grep -v "\.settings" )
122
123 # the root name of the version file.  This is currently irrelevant on
124 # non-windoze platforms.
125 export CLAM_VERSION_RC_ROOT=$(bash $CLAM_SCRIPTS/cpp/rc_name.sh)
126
127 # CLAM_COMPILER is the C/C++ compiler application that builds our code.
128 # The variable is mainly used within CLAM itself for determining the proper
129 # compiler flags.
130 export CLAM_COMPILER
131 if [ "$OPERATING_SYSTEM" == UNIX ]; then
132   if [ "$CLAM_OS_SUBCLASS" == darwin ]; then
133     CLAM_COMPILER=GNU_DARWIN
134   else
135     CLAM_COMPILER=GNU_LINUX
136   fi
137 elif [ "$OPERATING_SYSTEM" == WIN32 ]; then
138   CLAM_COMPILER=GNU_WINDOWS
139 fi
140 if [ -z "$CLAM_COMPILER" ]; then
141   # if we get into this case, we have no idea how to set the default compiler.
142   # so... pick a fun default.
143   CLAM_COMPILER=GNU_LINUX
144 fi
145
146 # "CLAM_COMPILER_ROOT_DIR" is the top-level for the C++ compiler location.
147 # it is generally the top of the OS, although some variants may need this
148 # modified (e.g., gnu arm linux, but we haven't built on that in a bit).
149 export CLAM_COMPILER_ROOT_DIR="/"
150
151 # CLAM_COMPILER_VERSION specifies the version of the particular compiler we're using.
152 # this is sometimes needed to distinguish how the code is built or where headers/libraries are found.
153 export CLAM_COMPILER_VERSION=$(bash $CLAM_SCRIPTS/cpp/get_version.sh $CLAM_COMPILER $CLAM_COMPILER_ROOT_DIR )
154
155 # new BUILD_TOP variable points at the utter top-most level of any files
156 # in the building hierarchy.
157 export BUILD_TOP="$FEISTY_MEOW_APEX"
158
159 # the production directory is the location for all the scripts and setup
160 # code needed to produce the executables for feisty meow.
161 export PRODUCTION_STORE="$BUILD_TOP/production"
162
163 ## set up the top-level for all build creations and logs and such.
164 #export FEISTY_MEOW_GENERATED_STORE="$TMP/generated-feisty_meow"
165 #if [ ! -d "$FEISTY_MEOW_GENERATED_STORE" ]; then
166 #  mkdir -p "$FEISTY_MEOW_GENERATED_STORE"
167 #fi
168 ## set up our effluent outsourcing valves.
169 #export TEMPORARIES_PILE="$FEISTY_MEOW_GENERATED_STORE/temporaries"
170 #if [ ! -d "$TEMPORARIES_PILE" ]; then
171 #  mkdir -p "$TEMPORARIES_PILE"
172 #fi
173
174 # this variable points at a folder where we store the generated products of
175 # the build, such as the binaries and installer packages.
176 export RUNTIME_PATH="$FEISTY_MEOW_GENERATED_STORE/runtime"
177 if [ ! -d "$RUNTIME_PATH" ]; then
178   mkdir -p "$RUNTIME_PATH"
179 fi
180
181 # we define a log file storage area that can be relied on by the build.
182 export FEISTY_MEOW_LOGS="$FEISTY_MEOW_GENERATED_STORE/logs"
183 if [ ! -d "$FEISTY_MEOW_LOGS" ]; then
184   mkdir -p "$FEISTY_MEOW_LOGS"
185 fi
186
187 ##############
188
189 # debugging area where we say what we think we know.
190
191 if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then
192   echo scripts: $BUILD_SCRIPTS_PATH
193   echo build tools hier: $BUILDING_HIERARCHY
194   echo this tool: $THIS_TOOL_NAME
195   echo repository: $FEISTY_MEOW_APEX
196   echo clam: $CLAM_SCRIPTS
197 fi
198
199 ##############
200
201 # test out our computed variables to make sure they look right.
202 pushd / &>/dev/null # jump to the root so relative paths are caught.
203
204 # flag for whether any checks have failed.
205 got_bad=
206
207 # first the scripts directory; do we find this script there?
208 if [ ! -f "$BUILD_SCRIPTS_PATH/$THIS_TOOL_NAME" ]; then
209   echo "This script cannot locate the proper build folders.  The crucial path"
210   echo "variable seems to be '$BUILD_SCRIPTS_PATH', which"
211   echo "does not seem to contain '$THIS_TOOL_NAME' (this"
212   echo "script's apparent name)."
213   got_bad=1
214 fi
215
216 # next the clam directory; is the main variables file present there?
217 if [ -z "$got_bad" -a ! -f "$CLAM_SCRIPTS/variables.def" ]; then
218   echo "The clam directory could not be located under our build tools hierarchy."
219   echo "Please examine the configuration and make sure that this script is in a"
220   echo "directory that resides at the same height as the 'clam' directory."
221   got_bad=1
222 fi
223
224 # now compute some more paths with a bit of "heuristics" for where we can
225 # find the source code.
226 export TOOL_SOURCES="$FEISTY_MEOW_APEX/nucleus/tools"
227 if [ -z "$got_bad" -a ! -d "$TOOL_SOURCES/dependency_tool" -o ! -d "$TOOL_SOURCES/clam_tools" ]; then
228   echo "This script cannot locate the tool source code folder.  This is where the"
229   echo "dependency_tool and clam_tools folders are expected to be."
230   got_bad=1
231 fi
232
233 ############################
234   
235 # we only run the rest of the script if we know we didn't have some kind of
236 # bad thing happen earlier.
237 if [ -z "$got_bad" ]; then
238
239   # where we store the binaries used for building the rest of the code base.
240   export CLAM_BINARIES="$RUNTIME_PATH/clam_bin"
241     # the final destination for the new binaries which provide the
242     # build with all the applications it needs to get going.
243   export TARGETS_STORE="$RUNTIME_PATH/binaries"
244     # targets directory is meaningful to clam, which will use it for output.
245   export INTERMEDIATE_STORE="$TARGETS_STORE"
246     # where we are building the applications before they get promoted.
247
248 #hmmm: could allow override on this if already set.
249   # calculate which build ini file to use.
250   export BUILD_PARAMETER_FILE="$PRODUCTION_STORE/feisty_meow_config.ini"
251   if [ ! -f "$BUILD_PARAMETER_FILE" ]; then
252     echo "Cannot find a useful build configuration file."
253   fi
254   
255   # pick the executable's file ending based on the platform.
256   if [ "$OPERATING_SYSTEM" == "UNIX" ]; then export EXE_ENDING=;
257   elif [ "$OPERATING_SYSTEM" == "WIN32" ]; then export EXE_ENDING=.exe;
258   else
259     echo "The OPERATING_SYSTEM variable is unset or unknown.  Bailing out."
260   fi
261   
262   # we should have established our internal variables now, so let's try
263   # using them.
264   export PATH=$(dos_to_unix_path $CLAM_BINARIES):$PATH
265   
266   # load up the helper variables for visual studio on winders.
267   if [ "$OPERATING_SYSTEM" == "WIN32" ]; then
268     # moved back to the good path of using gcc, not visual studio.
269 #what vars needed?
270 #trying just unixy ones, since we're doing cygwin on doze.
271 export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$TARGETS_STORE"
272   else
273     export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$TARGETS_STORE"
274   fi
275   
276   popd &>/dev/null # checking is over, jump back to the starting point.
277   
278   ############################
279   
280   # at this point, all the build related variables should be valid.
281   
282   if [ -z "$INCLUDED_FROM_BOOTSTRAP" \
283       -a -z "$PARM_1" ]; then
284     # we are running as a stand-alone script, so we stay resident with our
285     # current set of variables.
286     bash
287   fi
288
289   # sentinel that tells us this script was pulled in.
290   export BUILD_VARS_LOADED=true
291
292 fi
293
294 fi  # outer wrapper for already ran build vars check.
295
296 ##############
297
298 # hook clam into the compilation system.
299 # this always needs to be defined since functions aren't exported.
300 function make()
301 {
302   /usr/bin/make -I "$CLAM_SCRIPTS" $*
303 }
304
305