Minor build optimizations
[build-cgdb.git] / build
blob77164946e3f941ba1dbeac9d9b7075685f745889
1 #!/bin/bash
3 # build cgdb script
4 # Copyright (C) 2011,2012 Kyle J. McKay. All rights reserved.
6 set -e
7 PATH="`getconf PATH`"
8 export PATH
9 myname="$0"
10 while [ -L "$myname" ]; do
11 oldname="$myname"
12 myname="$(readlink "$myname")"
13 case "$myname" in /*) :;; *)
14 myname="$(dirname "$oldname")/$myname"
15 esac
16 done
17 unset oldname
18 mydir="$(cd "$(dirname "$myname")" && pwd -P)"
19 myname="$(basename "$myname")"
21 # Version 5.2 is the last GPLv2 version of readline
22 # cgdb requires readline version 5.1 or later
23 READLINE='http://ftp.gnu.org/gnu/readline/readline-5.2.tar.gz'
24 READLINE_MD5=e39331f32ad14009b9ff49cc10c5e751
26 #CGDB='http://downloads.sourceforge.net/cgdb/cgdb-0.6.6.tar.gz'
27 CGDB='http://github.com/downloads/cgdb/cgdb/cgdb-0.6.6.tar.gz'
28 CGDB_MD5=394b542b495755ab8392b7e88dace744
30 DMG_NAME=cgdb-0.6.6.dmg
32 echo ""
34 strip1=
35 if ! (tar --strip-path=1 || : ) 2>&1 | grep -Eqi 'unrecognized option|not supported'; then
36 strip1=--strip-path=1
37 elif ! (tar --strip-components=1 || : ) 2>&1 | grep -Eqi 'unrecognized option|not supported'; then
38 strip1=--strip-components=1
40 if [ -z "$strip1" ]; then
41 echo "error: Cannot figure out tar option to strip top level path" >&2
42 exit 1
45 if xs="`type -P xcode-select`"; then
46 SDKROOT="`xcode-select -print-path`"
48 if [ -z "$SDKROOT" ]; then
49 SDKROOT=/Developer
51 SDK104="$SDKROOT/SDKs/MacOSX10.4u.sdk"
52 if [ ! -d "$SDK104" -o ! -r "$SDK104/usr/include/AvailabilityMacros.h" ]; then
53 echo "error: No Mac OS X 10.4u SDK found at $SDK104" >&2
54 exit 1
57 if ! pm="`PATH="$SDKROOT/usr/bin:$SDKROOT/Tools" type -P packagemaker`"; then
58 echo "error: Cannot locate packagemaker executable" >&2
60 if ! sf="`PATH="$SDKROOT/usr/bin:$SDKROOT/Tools" type -P SetFile`"; then
61 echo "error: Cannot locate SetFile executable" >&2
64 if ! fr="`PATH="$PATH:/usr/local/bin:/opt/local/bin:/sw/bin" type -P fakeroot`"; then
65 echo "*** ERROR: missing fakeroot"
66 echo ""
67 echo "error: unable to find fakeroot installation" >&2
68 echo "warning: build proceeding, but no installer will be created" >&2
69 echo "info: see http://mackyle.github.com/fakeroot to install fakeroot" >&2
70 echo ""
71 sleep 2
72 else
73 # try to trigger the fakeroot bug now if it's an old version
74 "$fr" find "$mydir" -print > /dev/null
77 AGENT='Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'
78 if [ ! -d "$mydir/sources" ]; then
79 mkdir "$mydir/sources"
82 if [ ! -r "$mydir/sources/readline.tar.gz" ] || [ `md5 -q "$mydir/sources/readline.tar.gz"` != $READLINE_MD5 ]; then
83 echo "*** fetching readline sources from $READLINE"
84 echo ""
85 rm -f "$mydir/sources/readline.tar.gz"
86 curl -f -H "User-Agent: $AGENT" -L -o "$mydir/sources/readline.tar.gz" "$READLINE"
87 echo ""
88 if [ `md5 -q "$mydir/sources/readline.tar.gz"` != $READLINE_MD5 ]; then
89 echo "error: readline sources md5 mismatch (expected $READLINE_MD5)" >&2
90 exit 1
94 if [ ! -r "$mydir/sources/cgdb.tar.gz" ] || [ `md5 -q "$mydir/sources/cgdb.tar.gz"` != $CGDB_MD5 ]; then
95 echo "*** fetching cgdb sources from $CGDB"
96 echo ""
97 rm -f "$mydir/sources/cgdb.tar.gz"
98 curl -f -k -H "User-Agent:" -L -o "$mydir/sources/cgdb.tar.gz" "$CGDB"
99 echo ""
100 if [ `md5 -q "$mydir/sources/cgdb.tar.gz"` != $CGDB_MD5 ]; then
101 echo "error: cgdb sources md5 mismatch (expected $CGDB_MD5)" >&2
102 exit 1
106 echo "*** expanding sources"
107 rm -rf "$mydir/sources/cgdb" "$mydir/sources/readline"
108 mkdir "$mydir/sources/cgdb" "$mydir/sources/readline"
109 tar -xzf "$mydir/sources/readline.tar.gz" $strip1 --directory="$mydir/sources/readline"
110 tar -xzf "$mydir/sources/cgdb.tar.gz" $strip1 --directory="$mydir/sources/cgdb"
111 echo ""
113 echo "*** applying patches"
114 echo "tokenizer extensions: adding .cp, .m, .M and .mm"
115 patch "$mydir/sources/cgdb/cgdb/tokenizer/src/tokenizer.c" < "$mydir/patches/tokenizer-exts.patch"
116 echo "line listings: only list 1 line (fixes clang problem)"
117 patch -p1 -d "$mydir/sources/cgdb" < "$mydir/patches/cgdb-0.6.6_clang_fix.patch"
118 echo ""
120 echo "*** preparing local install area"
121 rm -rf "$mydir/local"
122 mkdir "$mydir/local" "$mydir/local/include" "$mydir/local/lib" "$mydir/local/bin" "$mydir/local/share"
123 mkdir "$mydir/local/share/man" "$mydir/local/share/man/man1"
124 (umask 0; ln -s share/man "$mydir/local/man")
125 echo ""
127 CC=gcc-4.0
128 COPT="-Os"
129 ARCH="-arch i386 -arch ppc"
130 OSXDK="-isysroot$SDK104"
131 OSXMN="-mmacosx-version-min=10.4"
132 CFLAGS="$ARCH $OSXDK $OSXMN $COPT"
133 LDFLAGS="-Wl,-search_paths_first,-headerpad_max_install_names,-dead_strip_dylibs"
134 CPATH="$mydir/local/include"
135 LIBRARY_PATH="$mydir/local/lib"
137 export CC
138 export CFLAGS
139 export LDFLAGS
140 export CPATH
141 export LIBRARY_PATH
143 echo "*** configuring readline"
144 rm -rf "$mydir/sources/readline-build"
145 mkdir "$mydir/sources/readline-build"
146 (cd "$mydir/sources/readline-build" && ../readline/configure --enable-static --disable-shared --prefix="$mydir/local")
147 echo ""
149 echo "*** building readline"
150 make -w -C "$mydir/sources/readline-build"
151 echo ""
153 echo "*** installing readline to local area"
154 make -w -C "$mydir/sources/readline-build" install
155 echo ""
157 echo "*** configuring cgdb"
158 rm -rf "$mydir/sources/cgdb-build"
159 mkdir "$mydir/sources/cgdb-build"
160 (cd "$mydir/sources/cgdb-build" && ../cgdb/configure --disable-dependency-tracking --with-readline="$mydir/local" --prefix="$mydir/local")
161 echo ""
163 echo "*** building cgdb"
164 make -w -C "$mydir/sources/cgdb-build"
165 echo ""
167 echo "*** installing cgdb to local area"
168 make -w -C "$mydir/sources/cgdb-build" install
169 echo ""
171 if [ -z "$fr" ]; then
172 echo "*** ERROR: missing fakeroot"
173 echo ""
174 echo "error: unable to find fakeroot installation" >&2
175 echo "warning: no installer will be created" >&2
176 echo "warning: the completed build is in $mydir/local" >&2
177 echo "info: see http://mackyle.github.com/fakeroot to install fakeroot" >&2
178 exit 1
181 echo "*** creating installer image area"
182 if [ -d "$mydir/installer" ]; then
183 chmod -R u+w "$mydir/installer"
185 rm -rf "$mydir/installer"
186 mkdir "$mydir/installer" "$mydir/installer/usrlocal" "$mydir/installer/cgdb"
187 mkdir "$mydir/installer/usrlocal/bin" "$mydir/installer/usrlocal/share"
188 mkdir "$mydir/installer/usrlocal/share/man"
189 mkdir "$mydir/installer/usrlocal/share/man/man1"
190 mkdir "$mydir/installer/usrlocal/share/info"
191 mkdir "$mydir/installer/usrlocal/share/cgdb"
192 cat "$mydir/local/bin/cgdb" > "$mydir/installer/usrlocal/bin/cgdb"
193 strip "$mydir/installer/usrlocal/bin/cgdb"
194 cat "$mydir/local/share/man/man1/cgdb.1" > "$mydir/installer/usrlocal/share/man/man1/cgdb.1"
195 cat "$mydir/local/share/info/cgdb.info" > "$mydir/installer/usrlocal/share/info/cgdb.info"
196 cat "$mydir/local/share/cgdb/cgdb.txt" > "$mydir/installer/usrlocal/share/cgdb/cgdb.txt"
197 find "$mydir/installer/usrlocal" ! -type d -print0 | xargs -0 chmod 444
198 chmod 555 "$mydir/installer/usrlocal/bin/cgdb"
199 find "$mydir/installer/usrlocal" -type d -print0 | xargs -0 chmod 755
200 timenow="`date +%s`"
201 stamp="`perl -e '@x=localtime(86400*int($ARGV[0]/86400));printf("%04d%02d%02d%02d%02d.%02d",$x[5]+1900,$x[4]+1,$x[3],$x[2],$x[1],$x[0])' "$timenow"`"
202 stampsf="`perl -e '@x=localtime(86400*int($ARGV[0]/86400));printf("%02d/%02d/%04d %02d:%02d:%02d",$x[4]+1,$x[3],$x[5]+1900,$x[2],$x[1],$x[0])' "$timenow"`"
203 find "$mydir/installer/usrlocal" -print0 | xargs -0n1 "$sf" -d "$stampsf"
204 find "$mydir/installer/usrlocal" -print0 | xargs -0 touch -t "$stamp"
205 echo ""
207 echo "*** preparing installer description files"
208 cat > "$mydir/installer/Description.plist" <<DESCRIPTION
209 <?xml version="1.0" encoding="UTF-8"?>
210 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
211 <plist version="1.0">
212 <dict>
213 <key>IFPkgDescriptionDescription</key>
214 <string>cgdb: the curses debugger</string>
215 <key>IFPkgDescriptionTitle</key>
216 <string>cgdb</string>
217 </dict>
218 </plist>
219 DESCRIPTION
220 cat > "$mydir/installer/Info.plist" <<INFOPLIST
221 <?xml version="1.0" encoding="UTF-8"?>
222 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
223 <plist version="1.0">
224 <dict>
225 <key>CFBundleIdentifier</key>
226 <string>net.sourceforge.cgdb</string>
227 <key>CFBundleGetInfoString</key>
228 <string>cgdb 0.6.6_3</string>
229 <key>CFBundleShortVersionString</key>
230 <string>0.6.6_3</string>
231 <key>CFBundleVersion</key>
232 <string>06.6.3</string>
233 <key>IFMajorVersion</key>
234 <integer>6</integer>
235 <key>IFMinorVersion</key>
236 <integer>6</integer>
237 <key>IFPkgFlagAllowBackRev</key>
238 <true/>
239 <key>IFPkgFlagAuthorizationAction</key>
240 <string>RootAuthorization</string>
241 <key>IFPkgFlagDefaultLocation</key>
242 <string>/usr/local</string>
243 <key>IFPkgFlagFollowLinks</key>
244 <true/>
245 <key>IFPkgFlagInstallFat</key>
246 <true/>
247 <key>IFPkgFlagIsRequired</key>
248 <false/>
249 <key>IFPkgFlagOverwritePermissions</key>
250 <false/>
251 <key>IFPkgFlagRelocatable</key>
252 <false/>
253 <key>IFPkgFlagRestartAction</key>
254 <string>None</string>
255 <key>IFPkgFlagRootVolumeOnly</key>
256 <false/>
257 <key>IFPkgFlagUpdateInstalledLanguages</key>
258 <false/>
259 <key>IFPkgFormatVersion</key>
260 <real>0.10000000149011612</real>
261 </dict>
262 </plist>
263 INFOPLIST
264 echo ""
266 echo "*** creating installer"
267 "$fr" bash -s <<FAKEROOT
268 chown -R root:wheel "$mydir/installer/usrlocal"
269 "$pm" -build -v -u -p "$mydir/installer/cgdb/cgdb.pkg" -ds -f "$mydir/installer/usrlocal" -i "$mydir/installer/Info.plist" -d "$mydir/installer/Description.plist" -r "$mydir/resources"
270 find "$mydir/installer/cgdb/cgdb.pkg/Contents/Resources" -type d -mindepth 1 -print0 | xargs -0 rm -rf
271 cat "$mydir/installer/Description.plist" > "$mydir/installer/cgdb/cgdb.pkg/Contents/Resources/Description.plist"
272 find "$mydir/installer/cgdb" ! -type d -print0 | xargs -0 chmod 444
273 find "$mydir/installer/cgdb" -type d -print0 | xargs -0 chmod 555
274 find "$mydir/installer/cgdb" -print0 | xargs -0n1 "$sf" -d "$stampsf"
275 find "$mydir/installer/cgdb" -print0 | xargs -0 touch -t "$stamp"
276 hdiutil create -scrub -srcfolder "$mydir/installer/cgdb" "$mydir/installer/cgdb.dmg" -format UDZO -imagekey zlib-level=9 -anyowners -skipunreadable
277 rm -f "$mydir/$DMG_NAME"
278 cat "$mydir/installer/cgdb.dmg" > "$mydir/$DMG_NAME"
279 "$sf" -d "$stampsf" "$mydir/$DMG_NAME"
280 touch -t "$stamp" "$mydir/$DMG_NAME"
281 FAKEROOT
282 echo ""
284 echo "*** cleaning up"
285 rm -rf "$mydir/installer" "$mydir/local"
286 rm -rf "$mydir/sources/readline" "$mydir/sources/readline-build"
287 rm -rf "$mydir/sources/cgdb" "$mydir/sources/cgdb-build"
288 echo ""
290 echo "*** success"
291 echo "Installer located at $mydir/$DMG_NAME"
292 exit 0