trying to track down weird bootstrapping problem on jenkins.
[feisty_meow.git] / scripts / generator / bootstrap_build.sh
1 ##############
2 #  Name   : initial setup script for HOOPLE
3 #  Author : Chris Koeritz
4 #  Purpose:
5 #    This script can bootstrap the HOOPLE libraries from a state where none   #
6 #  of the required binaries are built yet.  It will build the tools that the  #
7 #  CLAM system and HOOPLE need to get a build done.  Then the script builds   #
8 #  the whole source tree as a test of the code's overall health.              #
9 ##############
10 # Copyright (c) 2004-$now By Author.  This program is free software; you can  #
11 # redistribute it and/or modify it under the terms of the GNU General Public  #
12 # License as published by the Free Software Foundation; either version 2 of   #
13 # the License or (at your option) any later version.  This is online at:      #
14 #     http://www.fsf.org/copyleft/gpl.html                                    #
15 # Please send any updates to: fred@gruntose.com                               #
16 ##############
17
18 # prerequisites for this script:
19 #
20 # (1) the script should be run with a full path, so that it can decide where
21 #     it lives with minimal fuss.
22 # (2) on windows, the msys bin directory should already be in the path so that
23 #     tools like dirname are already available.
24
25 # make sure we know how to find our bash bins.
26 export PATH=/bin:$PATH
27 # signals that we're doing a fresh build to the variables script.
28 export INCLUDED_FROM_BOOTSTRAP=true
29 # pull in our build variables using the path to this script.
30 export BUILD_SCRIPTS_DIR="$( \cd "$(\dirname "$0")" && \pwd )"
31 echo build script initial from bootstrap: $BUILD_SCRIPTS_DIR
32 BUILD_SCRIPTS_DIR="$(echo $BUILD_SCRIPTS_DIR | tr '\\\\' '/' )"
33 echo build script after: $BUILD_SCRIPTS_DIR
34 # load in feisty meow basic scripts, if not already loaded.
35 source "$BUILD_SCRIPTS_DIR/../core/profile.sh"
36 # drop any previous version of the repository variable.
37 unset REPOSITORY_DIR
38 source "$BUILD_SCRIPTS_DIR/build_variables.sh" "$BUILD_SCRIPTS_DIR/build_variables.sh"
39
40 ##############
41
42 # creates the directory for our binaries and gives it a reasonable paths configuration.
43 function prepare_binaries_dir()
44 {
45   # we'll store binaries here from the bootstrap process.
46   if [ ! -d "$BINARY_DIR" ]; then
47     echo "creating binary dir now in $BINARY_DIR"
48     mkdir "$BINARY_DIR"
49   fi
50   if [ ! -f "$BINARY_DIR/paths.ini" ]; then
51     echo "copied paths.ini to binary dir."
52     cp "$PRODUCTION_DIR/paths.ini" "$BINARY_DIR"
53   fi
54 }
55
56 ##############
57
58 # turn off sounds to avoid running the sound player that's not been built yet.
59 unset CLAM_ERROR_SOUND
60 unset CLAM_FINISH_SOUND
61
62 ##############
63
64 echo "Build bootstrap process has started."
65
66 # preconditions for the build process...
67
68 # clean out the logs directory so we are all fresh.
69 echo "Removing logs directory '$LOGS_DIR'..."
70 \rm -rf "$LOGS_DIR" "$BUILD_TOP/generatedJUnitFiles"
71 mkdir -p "$LOGS_DIR"  # make this again so no one gets cranky.
72 echo "after removing and making dir again, it's here '$LOGS_DIR'..."
73 ls -al $LOGS_DIR
74
75 # set up our output directories etc.
76 prepare_binaries_dir
77
78 # set a flag for this process so we can omit certain compilations as necessary.
79 export BOOT_STRAPPING=true
80
81 # enable this macro to get a much noisier build.
82 #export BE_NOISY=NOISY=t
83
84 ##############
85
86 # these default flags turn off unnecessary support when we're rebuilding the
87 # minimal toolset needed for a successful build of hoople.
88 declare -a BUILD_DEFAULTS=( "BOOT_STRAPPING=t" "OPTIMIZE=t" "REBUILD=t" "DEBUG=" )
89   # bootstrapping is always turned on for this particular script.
90   # we also always optimize these builds and turn off the debug flag.
91   # rebuild ensures that the new apps are made fresh: "REBUILD=t"
92   #   it can be turned off when the build bootstrapper is being tested.
93   # noisy can be added to spew lots of text: "NOISY=t"
94   #   this can help with compilation issues by showing all the flags.
95
96 function make_code {
97   make $* $BE_NOISY ${BUILD_DEFAULTS[@]}
98   if [ $? != 0 ]; then
99     echo "Failed to make on: $*"
100     exit 2323
101   fi
102 }
103
104 # removes pcdos eol from any scripts.  that assumes that the bootstrap script
105 # itself isn't polluted with them.
106 function strip_cr {
107   ctrl_m=$'\015'
108   for i in $*; do
109     tempgrep="$(mktemp "$TEMPORARIES_DIR/tempgrep.XXXXXX")"
110     grep -l "$ctrl_m" "$i" >$tempgrep
111     if [ ! -z "$(cat $tempgrep)" ]; then
112       temp="$(mktemp "$TEMPORARIES_DIR/tempsed.XXXXXX")"
113       sed -e "s/$ctrl_m$//" <$i >$temp
114       mv -f $temp $i
115     fi
116     rm "$tempgrep"
117   done
118 }
119
120 # the promote function moves a file from the exe directory into the build's
121 # bin directory.  it performs the copy step and makes the file executable.
122 # the original name should just be the root of the filename without any
123 # extension.
124 # NOTE: this depends on the operating system having been chosen above!
125 if [ "$OPERATING_SYSTEM" = "UNIX" ]; then
126   function promote {
127     prepare_binaries_dir
128
129     if [ ! -f "$INTERMEDIATE_EXE_DIR/$1" ]; then
130       echo "Failed to build the application $1--quitting now."
131       exit 1892
132     fi
133     cp "$INTERMEDIATE_EXE_DIR/$1" "$BINARY_DIR/$1"
134     strip "$BINARY_DIR/$1"
135     chmod 755 "$BINARY_DIR/$1"
136   }
137 elif [ "$OPERATING_SYSTEM" = "WIN32" ]; then
138   function promote {
139     prepare_binaries_dir
140
141     if [ ! -f "$INTERMEDIATE_EXE_DIR/$1.exe" ]; then
142       echo "Failed to build the application $1.exe--quitting now."
143       exit 1892
144     fi
145     cp "$INTERMEDIATE_EXE_DIR/$1.exe" "$BINARY_DIR"
146     chmod 755 "$BINARY_DIR/$1.exe"
147   }
148 else
149   echo "The OPERATING_SYSTEM variable is unset or unknown.  Bailing out."
150   exit 1822
151 fi
152
153 ##############
154
155 # start the actual build process now...
156
157 # clean out any current contents.
158 bash "$BUILD_SCRIPTS_DIR/whack_build.sh" clean
159
160 # recreate our useful waste directories and other things...
161 source "$BUILD_SCRIPTS_DIR/build_variables.sh" "$BUILD_SCRIPTS_DIR/build_variables.sh"
162
163 toolset_names=(makedep value_tagger version_stamper vsts_version_fixer write_build_config short_path sleep_ms zap_process playsound create_guid)
164
165 if [ -z "$SAVE_BINARIES" ]; then
166   for i in ${toolset_names[*]}; do
167     whack_name="$BINARY_DIR/$i$EXE_ENDING"
168 #echo removing "$whack_name"
169     rm -f "$whack_name"
170   done
171 fi
172
173 # make the clam shell scripts executable.
174 chmod 755 "$CLAM_DIR"/*.sh
175 chmod 755 "$CLAM_DIR"/cpp/*.sh
176 #chmod 755 "$CLAM_DIR"/csharp/*.sh
177
178 # rebuild the dependency tool.  needed by everything, pretty much, but
179 # since it's from the xfree project, it doesn't need any of our libraries.
180 if [ ! -f "$BINARY_DIR/makedep$EXE_ENDING" ]; then
181   pushd "$TOOL_SOURCES/dependency_tool" &>/dev/null
182   make_code pre_compilation NO_DEPS=t OMIT_VERSIONS=t
183   make_code NO_DEPS=t OMIT_VERSIONS=t
184   if [ ! -f "$INTERMEDIATE_EXE_DIR/makedep$EXE_ENDING" ]; then
185     echo ""
186     echo ""
187     echo "The build of the makedep tool has failed.  Unknown causes...  Argh."
188     echo ""
189     exit 1820
190   fi
191   # make the tool available for the rest of the build.
192   promote makedep
193   popd &>/dev/null
194 fi
195
196 # rebuild the version tools and other support apps.
197 if [ ! -f "$BINARY_DIR/value_tagger$EXE_ENDING" \
198     -o ! -f "$BINARY_DIR/version_stamper$EXE_ENDING" \
199     -o ! -f "$BINARY_DIR/vsts_version_fixer$EXE_ENDING" \
200     -o ! -f "$BINARY_DIR/write_build_config$EXE_ENDING" ]; then
201   pushd "$TOOL_SOURCES/clam_tools" &>/dev/null
202   make_code pre_compilation OMIT_VERSIONS=t
203   make_code OMIT_VERSIONS=t
204
205 #hmmm: really this should check all the expected apps.
206 #      nice to just have an array of the things built by this guy.
207   if [ ! -f "$INTERMEDIATE_EXE_DIR/version_stamper$EXE_ENDING" ]; then
208     echo ""
209     echo ""
210     echo "The build of the version_stamper tool has failed.  Unknown causes...  Argh."
211     echo ""
212     exit 1821
213   fi
214
215   promote value_tagger # tool scrambles through headers to standardize outcomes.
216   promote version_stamper  # used for version stamping.
217   promote vsts_version_fixer  # used for version stamping.
218   promote write_build_config # creates a header of build-specific config info.
219
220   popd &>/dev/null
221 fi
222
223 # build a few other utilities.
224 if [ ! -f "$BINARY_DIR/short_path$EXE_ENDING" \
225     -o ! -f "$BINARY_DIR/sleep_ms$EXE_ENDING" \
226     -o ! -f "$BINARY_DIR/create_guid$EXE_ENDING" \
227     -o ! -f "$BINARY_DIR/zap_process$EXE_ENDING" \
228     -o ! -f "$BINARY_DIR/playsound$EXE_ENDING" ]; then
229   pushd "$TOOL_SOURCES/simple_utilities" &>/dev/null
230   make_code pre_compilation OMIT_VERSIONS=t
231   make_code OMIT_VERSIONS=t
232
233   promote create_guid  # globally unique ID creator.
234   promote playsound  # sound playback tool.
235   promote short_path  # provides short path names for exes on windows.
236   promote sleep_ms  # sleep tool is used in some scripts.
237   promote zap_process  # kills a process in the task list.
238
239   popd &>/dev/null
240 fi
241
242 echo "The build binaries have been re-created (or were already present)."
243
244 # we won't do the full build if they told us to just do the bootstrap.
245 if [ -z "$JUST_BOOTSTRAP_APPS" ]; then
246   echo Cleaning up the temporary files that were built.
247   bash "$BUILD_SCRIPTS_DIR/whack_build.sh" clean
248
249   # recreate our useful junk directories...
250   mkdir -p "$WASTE_DIR"
251   mkdir -p "$TEMPORARIES_DIR"
252
253   echo Now starting a normal build of the repository source code.
254   pushd "$REPOSITORY_DIR" &>/dev/null
255   unset BUILD_DEFAULTS
256   declare -a BUILD_DEFAULTS=( "BOOT_STRAPPING=" "OPTIMIZE=t" "DEBUG=t" "REBUILD=t" )
257   export NOT_SLIMLINE=true
258   make_code
259   popd &>/dev/null
260 fi
261