Subversion Repositories DevTools

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1467 alewis 1
# Force failed command to exit this shell - all commands must report success
2
set -e
3
echo
4
echo
5
 
6
 
7
 
8
#------------------------------------------------------------------------------
9
# Takes $1 and removes all relative paths (. and ..) from it.  The cleaned up
10
# directory is written to stdout.
11
#------------------------------------------------------------------------------
12
function cleanup_dir
13
{
14
    DIR_PARTS=`echo $1 | sed "s|/| |g"`
15
 
16
    CLEANUP_DIR=""
17
    for PART in ${DIR_PARTS}; do
18
        if [ "${PART}" != "." ]; then
19
 
20
            if [ "${PART}" == ".." ]; then
21
                CLEANUP_DIR=`echo "${CLEANUP_DIR}" | sed "s|/[^/]*$||"`
22
            else
23
                CLEANUP_DIR="${CLEANUP_DIR}/${PART}"
24
            fi
25
        fi
26
    done
27
 
28
    echo ${CLEANUP_DIR}
29
} 
30
 
31
 
32
 
33
 
34
#------------------------------------------------------------------------------
35
# Extract arguments - order not important except that the first argument is
36
# the launch script
37
#------------------------------------------------------------------------------
38
unset CLEAN
39
unset DOWNLOAD_PKG
40
unset DOWNLOAD_PKG_AUTO
41
unset XGCC_IN_PATH
42
unset DEBIAN_PACKAGE
43
unset APPLY_PATCHES
44
unset APPLY_MODS
1469 alewis 45
unset CONFIG_VARIENT
1467 alewis 46
for arg in "$@" ; do
47
    val=${arg##*=}
48
    tag=${arg%%=*}
49
    case $tag in
50
        -clean)                 CLEAN=1;;
51
        -XGccInPath)            XGCC_IN_PATH=1;;
52
        -ShellBuild)            SHELL_BUILD="$val";;
53
        -BuildName)             BUILD_NAME=$val;;
54
        -BuildVersion)          BUILD_VERSION=$val;;
55
        -Platform)              PLATFORM=$val;;
56
        -Type)                  TYPE=$val;;
57
        -Arch)                  ARCH=$val;;
58
        -MachType)              MACHTYPE=$val;;
59
        -BuildRoot)             BUILD_ROOT=$val;;
1475 dpurdie 60
        -InterfaceDir)          INTERFACE_DIR=$val;;
61
        -LocalDir)              LOCAL_DIR=$val;;
1469 alewis 62
        -BinDir)                BIN_DIR=$val;;
63
        -LibDir)                LIB_DIR=$val;;
64
        -ObjDir)                OBJ_DIR=$val;;
1467 alewis 65
        -PackageBinDir)         PKG_BIN_DIR=$val;;
66
        -PackageIncDir)         PKG_INC_DIR=$val;;
67
        -PackageLibDir)         PKG_LIB_DIR=$val;;
68
        -PackagePkgDir)         PKG_PKG_DIR=$val;;
69
        -PackageToolDir)        PKG_TOOL_DIR=$val;;
70
        -PackageToolBin)        PKG_TOOL_BIN_DIR=$val;;
71
        -PackageToolScript)     PKG_TOOL_SCRIPT_DIR=$val;;
72
        -PackageDir)            PKG_DIR=$val;;
73
        -CompilerPath)          COMPILER_DIR="$val";;
74
        -DownloadPkg)           DOWNLOAD_PKG="$val";;
1475 dpurdie 75
        -DebianPackage)         DEBIAN_PACKAGE=$val;;
1467 alewis 76
        -ApplyPatches)          APPLY_PATCHES=1;;
77
        -ApplyMods)             APPLY_MODS=1;;
1469 alewis 78
        -ConfigVarient)         CONFIG_VARIENT=$val;;
1467 alewis 79
        *)                      echo "Unknown tag: $tag=$val"
80
    esac
81
done
82
 
83
if [ "${DOWNLOAD_PKG}" == "-DownloadPkg" ]; then
84
    DOWNLOAD_PKG_NAME=${BUILD_NAME}
85
    DOWNLOAD_PKG_VER=`echo ${BUILD_VERSION} | sed "s|\.[0-9]\+\.cots||"`
86
    DOWNLOAD_PKG=${DOWNLOAD_PKG_NAME}-${DOWNLOAD_PKG_VER}
87
else
88
    DOWNLOAD_PKG_VER=`echo ${DOWNLOAD_PKG} | sed "s|.*-||"`    
89
    DOWNLOAD_PKG_NAME=`echo ${DOWNLOAD_PKG} | sed "s|-${DOWNLOAD_PKG_VER}||"`    
90
fi
91
 
92
 
93
#------------------------------------------------------------------------------
94
# Dump JATS information for debugging purposes
95
#------------------------------------------------------------------------------
96
echo "================================================================================"
97
echo "   JATS SUPPLIED FIELDS"
98
echo "================================================================================"
99
echo " ShellBuild     = ${SHELL_BUILD}"
100
echo " BuildName      = ${BUILD_NAME} ${BUILD_VERSION}"
101
echo " Platform       = ${PLATFORM}"
102
echo " Type           = ${TYPE}"
103
echo " Arch           = ${ARCH}"
104
echo " MachType       = ${MACHTYPE}"
105
echo " BuildRoot      = ${BUILD_ROOT}"
1475 dpurdie 106
#echo " InterfaceDir   = ${INTERFACE_DIR}"
107
#echo " LocalDir       = ${LOCAL_DIR}"
1467 alewis 108
if [ ${DOWNLOAD_PKG} ]; then
109
    echo " DownloadPkg    = ${DOWNLOAD_PKG}"
110
fi    
1469 alewis 111
echo " BinDir         = ${BIN_DIR}"
112
echo " LibDir         = ${LIB_DIR}"
113
echo " ObjDir         = ${OBJ_DIR}"
1475 dpurdie 114
echo " PkgDir         = ${PKG_DIR}"
1467 alewis 115
echo " PackageBinDir  = ${PKG_BIN_DIR}"
116
echo " PackageIncDir  = ${PKG_INC_DIR}"
117
echo " PackageLibDir  = ${PKG_LIB_DIR}"
118
echo " PackagePkgDir  = ${PKG_PKG_DIR}"
119
echo " CompilerDir    = ${COMPILER_DIR}"
120
echo "================================================================================"
121
echo
122
echo
123
 
124
 
125
#------------------------------------------------------------------------------
126
# Determine host and build environments
127
#------------------------------------------------------------------------------
128
case ${MACHTYPE} in
129
    linux_i386)  
130
        COMPILE_BUILD="i386-cross-linux-gnu"
131
        ;;
132
    *)      
133
        echo "Unknown MACHTYPE=${MACHTYPE}"
134
        exit 1
135
        ;;
136
esac
137
 
138
case ${ARCH} in
139
    *603E*|*powerpc*)  
140
        COMPILE_HOST="powerpc-603e-linux-gnu"
141
        LINUX_HOST_ARCH=powerpc
142
        ;;
143
 
1469 alewis 144
    ARMV9*)  
145
        COMPILE_HOST="arm-9tdmi-linux-gnu"
146
        ;;
147
 
1467 alewis 148
    *I386*)
1469 alewis 149
        if [ "${PLATFORM}" == "LINUX_I386" ]; then
150
            COMPILE_HOST="i386-cross-linux-gnu"
151
        else
152
            COMPILE_HOST="i586-unknown-linux-gnu"
153
        fi
1467 alewis 154
        LINUX_HOST_ARCH=x86
155
        ;;
156
 
157
    *)      
158
        echo "Unknown ARCH=${ARCH}"
159
        exit 1
160
        ;;
161
esac
162
 
163
# Setup the location of the cross compiler
1469 alewis 164
if [ "${COMPILE_HOST}" == "i386-redhat-linux" ] || [ "${COMPILER_DIR}" == "gcc" ]; then
1467 alewis 165
    XGCC_BASE_DIR=
166
    XGCC_DIR=
167
    XGCC=gcc
168
else
169
    XGCC_BASE_DIR=`echo ${COMPILER_DIR} | sed 's|/[^/]*/[^/]*$||'`
170
    XGCC_BASE_DIR=`cleanup_dir ${XGCC_BASE_DIR}`
171
    XGCC_DIR=${XGCC_BASE_DIR}/${COMPILE_HOST}
172
    XGCC=${XGCC_DIR}/bin/gcc
173
fi
174
 
175
# Determine the location of the generated files
176
CWD=`pwd`
1469 alewis 177
BIN_DIR=`cleanup_dir ${CWD}/${BIN_DIR}`
178
LIB_DIR=`cleanup_dir ${CWD}/${LIB_DIR}`
179
OBJ_DIR=`cleanup_dir ${CWD}/${OBJ_DIR}`
1475 dpurdie 180
PKG_DIR=`cleanup_dir ${CWD}/${PKG_DIR}`
1467 alewis 181
PKG_BIN_DIR=`cleanup_dir ${CWD}/${PKG_BIN_DIR}`
182
PKG_INC_DIR=`cleanup_dir ${CWD}/${PKG_INC_DIR}`
183
PKG_LIB_DIR=`cleanup_dir ${CWD}/${PKG_LIB_DIR}`
184
PKG_PKG_DIR=`cleanup_dir ${CWD}/${PKG_PKG_DIR}`
185
 
186
PKG_TOOL_DIR=`cleanup_dir ${CWD}/${PKG_TOOL_DIR}`
187
PKG_TOOL_BIN_DIR=`cleanup_dir ${CWD}/${PKG_TOOL_BIN_DIR}`
188
PKG_TOOL_SCRIPT_DIR=`cleanup_dir ${CWD}/${PKG_TOOL_SCRIPT_DIR}`
189
 
190
BASE_DIR=`cleanup_dir ${CWD}/${BUILD_ROOT}`
1475 dpurdie 191
INTERFACE_DIR=`cleanup_dir ${CWD}/${INTERFACE_DIR}`
192
LOCAL_DIR=`cleanup_dir ${CWD}/${LOCAL_DIR}`
1469 alewis 193
LCL_SRC_DIR=${BASE_DIR}/src
194
SHARE_SRC_DIR=${LCL_SRC_DIR}
195
SHARE_BASE_DIR=${BASE_DIR}
1467 alewis 196
 
1469 alewis 197
DEB_PKG_DIR=${LIB_DIR}
198
AFC_DIR=${DEB_PKG_DIR}/afc
199
AFC_BIN_DIR=${AFC_DIR}/bin
200
AFC_LIB_DIR=${AFC_DIR}/lib
201
AFC_SHARE_DIR=${AFC_DIR}/share
202
 
1475 dpurdie 203
DEB_DIR=`cleanup_dir ${CWD}/${DEBIAN_PACKAGE}`
1469 alewis 204
 
1467 alewis 205
# Find the launch script
1469 alewis 206
LAUNCH_SCRIPT=`cleanup_dir ${LCL_SRC_DIR}/${SHELL_BUILD}`
1467 alewis 207
 
208
if [ ! -f ${LAUNCH_SCRIPT} ]; then
209
    echo "Specified shell build script ${LAUNCH_SCRIPT} does not exist."
210
    exit 1
211
fi
212
 
213
if [ ${DOWNLOAD_PKG} ]; then
1469 alewis 214
 
215
    # This is the set of available download directories, consisting of downloads/
216
    # and a download directory that is offset from the location of the build
217
    # script src directory.
218
    unset TAR_DECOMP_ARG
219
    TMP=`echo ${SHELL_BUILD} | sed "s|/src/.*||"`
220
    TMP=`cleanup_dir ${CWD}/${TMP}`
221
    DOWNLOAD_DIRS="${TMP} ${BASE_DIR}"
222
    for DDIR in ${DOWNLOAD_DIRS}; do
223
        TMP=${DDIR}/downloads/${DOWNLOAD_PKG}.tar.bz2
224
        if [ -e ${TMP} ]; then
225
            TARBALL_FILE=${TMP}
226
            SHARE_SRC_DIR=${DDIR}/src
227
            SHARE_BASE_DIR=${DDIR}
228
            TAR_DECOMP_ARG=j
1467 alewis 229
        else
1469 alewis 230
            TMP=${DDIR}/downloads/${DOWNLOAD_PKG}.tar.gz
231
            if [ -e ${TMP} ]; then
232
                TARBALL_FILE=${TMP}
233
                SHARE_SRC_DIR=${DDIR}/src
234
                SHARE_BASE_DIR=${DDIR}
1467 alewis 235
                TAR_DECOMP_ARG=z
236
            else
1469 alewis 237
                TMP=${DDIR}/downloads/${DOWNLOAD_PKG}.tgz
238
                if [ -e ${TMP} ]; then
239
                    TARBALL_FILE=${TMP}
240
                    SHARE_SRC_DIR=${DDIR}/src
241
                    SHARE_BASE_DIR=${DDIR}
242
                    TAR_DECOMP_ARG=z
243
                fi
1467 alewis 244
            fi
1469 alewis 245
        fi    
246
    done
247
    if [ "${TAR_DECOMP_ARG}" == "" ]; then
248
        echo "Could not find download file ${DOWNLOAD_PKG}.<tar.gz|tar.bz2|tgz> in any of { ${DOWNLOAD_DIRS} }"
249
        exit 1
250
    fi
251
    WORK_DIR=${LCL_SRC_DIR}/${DOWNLOAD_PKG}
1467 alewis 252
else
1469 alewis 253
    WORK_DIR=${LCL_SRC_DIR}/work
1467 alewis 254
fi
255
 
1475 dpurdie 256
#
257
#   Extend compiler and linker search paths to access data within
258
#   packages imported via BuildPkgArchive
259
#
260
#   Include the packageing directory - its used for builds that
261
#   build multiple packages.
262
#
263
#   Only include paths that exist
264
#
265
INCLUDE=
266
LIBPATH=
1467 alewis 267
 
1475 dpurdie 268
DJOIN=""
269
DLIST="
270
${PKG_INC_DIR}
271
${LOCAL_DIR}/inc
272
${INTERFACE_DIR}/include/${PLATFORM}
273
${INTERFACE_DIR}/include
274
"
275
for dtest in ${DLIST} ; do
276
    if [ -d $dtest ] ; then
277
        INCLUDE="${INCLUDE}${DJOIN}-I$dtest"
278
        DJOIN=" "
279
    fi
280
done
1467 alewis 281
 
1475 dpurdie 282
DJOIN=""
283
DLIST="
284
${PKG_LIB_DIR}
285
${LOCAL_DIR}/lib/${PLATFORM}
286
${INTERFACE_DIR}/lib/${PLATFORM}
287
"
288
for dtest in ${DLIST} ; do
289
    if [ -d $dtest ] ; then
290
        LIBPATH="${LIBPATH}${DJOIN}-L$dtest"
291
        DJOIN=" "
292
    fi
293
done
1467 alewis 294
 
295
# Dump configuration
296
echo "================================================================================"
297
echo "   BUILD CONFIGURATION"
298
echo "================================================================================"
299
echo " Compile Host   = ${COMPILE_HOST}"
300
echo " Compile Build  = ${COMPILE_BUILD}"
301
echo " XGCC Base Dir  = ${XGCC_BASE_DIR}"
302
echo " XGCC Dir       = ${XGCC_DIR}"
303
echo " XGCC           = ${XGCC}"
304
echo " Base Dir       = ${BASE_DIR}"
305
if [ ${DOWNLOAD_PKG} ]; then
306
    echo " Tarball File   = ${TARBALL_FILE}"
307
    echo " Working Dir    = ${WORK_DIR}"
1469 alewis 308
fi  
309
unset AFTER_FIRST
1475 dpurdie 310
for INC in ${INCLUDE}; do
1469 alewis 311
    if [ ${AFTER_FIRST} ]; then
312
        echo "                  ${INC}"
313
    else
314
        echo " Includes       = ${INC}"
315
        AFTER_FIRST=1
316
    fi
317
done
318
unset AFTER_FIRST
319
for LIB in ${LIBPATH}; do
320
    if [ ${AFTER_FIRST} ]; then
321
        echo "                  ${LIB}"
322
    else
323
        echo " Library Path   = ${LIB}"
324
        AFTER_FIRST=1
325
    fi
326
done
327
echo " Debian Package = ${DEB_PKG_DIR}"
1467 alewis 328
echo " Launch Script  = ${LAUNCH_SCRIPT}"
329
echo "================================================================================"
330
echo
331
echo
332
 
333
# Prepare the environment
334
echo " --> Preparing environment"
335
 
336
 
337
LIBTOOL=libtool
338
export LIBTOOL
339
 
1473 dpurdie 340
unset CC
341
unset CXX
342
unset CPP
343
unset CPPFLAGS
344
unset LD_LIBRARY_PATH
345
export CC CXX CPP CPPFLAGS LD_LIBRARY_PATH
346
 
1467 alewis 347
unset MAKE
348
unset MAKEFLAGS
349
unset MAKEOVERRIDES
350
unset MAKELEVEL
1473 dpurdie 351
export CFLAGS="${CFLAGS} ${INCLUDE}"
1475 dpurdie 352
export CXXFLAGS="${CXXFLAGS} ${INCLUDE}"
1473 dpurdie 353
export CCFLAGS="${CCFLAGS} ${INCLUDE}"
1467 alewis 354
export LDFLAGS="${LDFLAGS} ${LIBPATH}"
355
 
356
if [ ${XGCC_IN_PATH} ]; then
357
    export PATH="${XGCC_DIR}/bin:${PATH}"
1469 alewis 358
else
359
    export PATH="${XGCC_BASE_DIR}/bin:${PATH}"
1467 alewis 360
fi
361
 
1475 dpurdie 362
 
363
#
364
#   Clean up request
365
#   No building - just a clean of previous builds
366
#
1467 alewis 367
if [ ${CLEAN} ]; then
368
    if [ ${DOWNLOAD_PKG} ]; then
369
        echo " --> Cleaning generated files"
370
        cd ${BASE_DIR}
371
        rm -fr ${WORK_DIR}
372
    fi        
1469 alewis 373
 
374
    echo " --> Deleting binary, object, and library directories"
375
    rm -fr ${BIN_DIR}
376
    rm -fr ${LIB_DIR}
377
    rm -fr ${OBJ_DIR}
1475 dpurdie 378
 
379
    if [ ${DEBIAN_PACKAGE} ]; then
380
        echo " --> Deleting Debian Build Files "
381
        rm -fr ${DEB_DIR}
382
    fi
1469 alewis 383
 
1467 alewis 384
    exit 0
385
fi
386
 
387
 
388
if [ ${DOWNLOAD_PKG} ]; then
389
    echo " --> Deleting existing build objects directory"
390
    rm -fr ${WORK_DIR}
391
fi    
392
 
393
 
394
echo " --> Creating package directories"
395
mkdir -p ${PKG_BIN_DIR}
396
mkdir -p ${PKG_INC_DIR}
397
mkdir -p ${PKG_LIB_DIR}
398
mkdir -p ${PKG_PKG_DIR}
399
mkdir -p ${AFC_DIR}
400
mkdir -p ${AFC_BIN_DIR}
401
mkdir -p ${AFC_LIB_DIR}
402
mkdir -p ${AFC_SHARE_DIR}
403
mkdir -p ${PKG_TOOL_DIR}
404
mkdir -p ${PKG_TOOL_BIN_DIR}
405
mkdir -p ${PKG_TOOL_SCRIPT_DIR}
406
 
407
 
408
if [ ${DOWNLOAD_PKG} ]; then
409
    echo " --> Extracting ${DOWNLOAD_PKG}"
1469 alewis 410
    cd ${LCL_SRC_DIR}
1467 alewis 411
    tar -x${TAR_DECOMP_ARG}pf ${TARBALL_FILE}
412
 
413
    cd ${WORK_DIR}
1469 alewis 414
    PATCHES_DIR=${SHARE_BASE_DIR}/patches
1467 alewis 415
    if [ -d ${PATCHES_DIR} ]; then
1471 alewis 416
        PATCHES=`cd ${PATCHES_DIR} && find . -name "*.patch" | sort`
1467 alewis 417
        if [ "${PATCHES}" != "" ]; then
418
            echo " --> Apply external patches"
419
            for PATCH in ${PATCHES}; do
1471 alewis 420
                if patch -p1 < ${PATCHES_DIR}/${PATCH}; then
1467 alewis 421
                    echo "Applied patch ${PATCH}"
422
                    echo ""
423
                else
424
                    echo "Patch ${PATCH} failed"
425
                    exit 1
426
                fi
427
            done    
428
        fi
429
    fi
430
 
431
    cd ${WORK_DIR}
1469 alewis 432
    MODS_DIR=${SHARE_BASE_DIR}/${DOWNLOAD_PKG_NAME}_${DOWNLOAD_PKG_VER}_mods
1467 alewis 433
    if [ -d ${MODS_DIR} ]; then
434
        echo " --> Applying modifications"
435
        cp -fr ${MODS_DIR}/* .
436
        ERG_CONFIG=${MODS_DIR}/ERG.config
437
        if [ -f ${ERG_CONFIG} ]; then
438
            cp -fr ${ERG_CONFIG} .config
439
        fi
440
    fi
441
 
442
    cd ${WORK_DIR}
1475 dpurdie 443
fi
1467 alewis 444
 
1475 dpurdie 445
#
446
#   Source the users script
447
#   This is processed in the context of this script
448
#
1467 alewis 449
source ${LAUNCH_SCRIPT}
450
 
451
 
452
if [ ${DEBIAN_PACKAGE} ]; then 
453
    echo " --> Creating Debian packaging scripts"
454
    unset TOOL_DIR
455
    for DIR in `echo ${PATH} | sed "s|\:| |g"`; do
456
        if [ -f ${DIR}/debbuild.pl ]; then
457
            TOOL_DIR=`cleanup_dir ${DIR}`
458
        fi
459
    done
460
    if [ ${TOOL_DIR} ]; then
461
        DEBBUILD_PL=${TOOL_DIR}/debbuild.pl
1469 alewis 462
        echo "      - Found ${DEBBUILD_PL}"
1467 alewis 463
 
464
        rm -fr ${DEB_DIR}
465
        mkdir -p ${DEB_DIR}
1475 dpurdie 466
 
467
        # Replace TAGS in the debbuild.pl file
1467 alewis 468
        DEB_DESC="${BUILD_NAME} ${BUILD_VERSION} for ${PLATFORM}"
1475 dpurdie 469
        cat ${DEBBUILD_PL} | sed "-es|TAG_DESCRIPTION|${DEB_DESC}|" "-es|TAG_POSTINSTALL|${DEB_DIR}/postinstall|" > ${DEB_DIR}/debbuild.pl
1467 alewis 470
        cp ${TOOL_DIR}/postinstall ${DEB_DIR}/postinstall
471
    else
472
        echo "ERROR: Cannot find debbuild.pl in the PATH"
473
        exit 1
474
    fi
475
fi    
476
 
477
 
1469 alewis 478
echo " --> Removing unnecesary files resulting from the make install"
479
DEL_FILES=`find ${PKG_LIB_DIR} -type f -name '*.la'`
480
for FILE in ${DEL_FILES}; do
481
        echo "      - Deleting ${FILE}"
482
        rm -f ${FILE}
483
done
484
 
485
echo " --> Cleaning up empty directories"
486
# Deletes directory $1 if it does not contain any other files or directories
487
function rmdir_empty()
488
{
489
    # -A = do not list . and ..
490
    # -Q = enclose entry names in double quotes
491
    # -l = list one file per line
492
    # -F = appends each directory with a '/' 
493
    DIRS=`ls -A -Q -l -F "$1" | grep "\".*\"\/" | sed "s|.* \"||" | sed "s|\"\/||"`
494
    for DIR in ${DIRS}; do
495
        rmdir_empty $1/${DIR}
496
    done
497
 
498
    LS=`ls -A -Q -l -F "$1" | grep "\"" | sed "s|^.* \"||" | sed "s|\".*||"`
499
    if [ "${LS}" == "" ]; then
500
        rmdir $1
501
    fi
502
 
503
}
504
rmdir_empty ${DEB_PKG_DIR}
505
rmdir_empty ${BASE_DIR}/pkg
506
 
1473 dpurdie 507
echo " --> End of ShellBuild"
1469 alewis 508