summaryrefslogtreecommitdiff
path: root/Build/source/Build
blob: a197e1f21f0eecbf736035ab2f0839ec81cba3d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#!/bin/sh
# $Id$
# Public domain.  Originally written many years ago by Sebastian Rahtz.
# The basic idea is to run configure && make, but with a multitude of
# environment variables to allow overriding everything.
# 
# To build again from where it left off, try Build --no-clean.
# To build without optimization, try Build --debug.
# Any other options given are passed along to configure.

# clean up environment
unset TEXMFCNF; export TEXMFCNF
LANG=C; export LANG

# cd to our source directory.
mydir=`dirname $0`
cd $mydir || exit 1
mydir=`pwd` # make absolute

# We export the TL_* variables so that they can be dumped to buildenv.log.
: ${TL_WORKDIR=Work}; export TL_WORKDIR

# allow override of install destination.
if test -z "$TL_INSTALL_DEST"; then
  H=`pwd`
  test -d inst || mkdir -p inst/texmf  # avoid configure warnings
  TL_INSTALL_DEST=$H/inst
fi
export TL_INSTALL_DEST

# allow override of the make program.
# The idea is to use TL_MAKE if that is defined (and set MAKE),
# or MAKE if that is defined (and set TL_MAKE),
# or default to "make" if neither is set.
# We have to end up with both defined because TL_MAKE is used below
# in this script, and MAKE is used throughout (in its usual way).
if test -n "$TL_MAKE"; then
  MAKE=$TL_MAKE
elif test -n "$MAKE"; then
  TL_MAKE=$MAKE
else
  TL_MAKE=make
  MAKE=make
fi
export MAKE; export TL_MAKE

# make flags
: ${TL_MAKE_FLAGS=}; export TL_MAKE_FLAGS
: ${TL_MAKE_VERBOSE=VERBOSE=1}; export TL_MAKE_VERBOSE

# allow override of make target.
: ${TL_TARGET=world}; export TL_TARGET

if test "x$1" = x--no-clean; then
  shift
else
  test -f Makefile && $MAKE clean 
  rm -rf $TL_WORKDIR $TL_INSTALL_DEST
fi

# allow adding environment setting for build.
: ${TL_BUILD_ENV=}; export TL_BUILD_ENV
if test "x$1" = x--debug || test "x$1" = x-g; then
  shift
  # The idea is that with Build -g, you can set TL_COMPILER_GFLAGS in
  # the environment with options common to all compilers --
  # not necessarily anything to do with debugging, e.g., -mcpu=sparvc9.
  # Or you can set TL_{C,CXX,OBJCXX}FLAGS for per-language flags,
  # notably TL_CFLAGS=-Wdeclaration-after-statement.
  : ${TL_COMPILER_GFLAGS=-g}; export TL_COMPILER_CFLAGS
  c="CFLAGS='$TL_COMPILER_GFLAGS $TL_CFLAGS'"
  cxx="CXXFLAGS='$TL_COMPILER_GFLAGS $TL_CXXFLAGS'"
  objcxx="OBJCXXFLAGS='$TL_COMPILER_GFLAGS $TL_OBJCXXFLAGS'" # only for macs
  TL_BUILD_ENV="$c $cxx $objcxx $TL_BUILD_ENV"
fi

# allow for changing the banner identification, e.g.,
# --with-banner-add='/SomeDistro'; see the build doc.
: ${TL_CONF_BANNER=}; export TL_CONF_BANNER

# default to supporting large files as much as possible;
# see comments at --disable-largefile in README.config.
: ${TL_CONF_LARGEFILE=--enable-largefile}; export TL_CONF_LARGEFILE

# default to terminate if requested programs or features must be disabled.
: ${TL_CONF_MISSING=--disable-missing}; export TL_CONF_MISSING

# default to static linking.
: ${TL_CONF_SHARED=--disable-shared}; export TL_CONF_SHARED

# allow override of xdvi toolkit, default to standard xaw.
: ${TL_CONF_XDVI_TOOLKIT=--with-xdvi-x-toolkit=xaw}
export TL_CONF_XDVI_TOOLKIT

# allow override of configure location.
: ${TL_CONFIGURE=../configure}; export TL_CONFIGURE

# allow adding arbitrary other configure args, after all the others.
: ${TL_CONFIGURE_ARGS=}; export TL_CONFIGURE_ARGS

# allow for doing stuff betwen configure and make.
: ${TL_POSTCONFIGURE=true}; export TL_POSTCONFIGURE

# Kpathsea is not going to be able to find its cnf files during the
# build, so omit the warning about it.
: ${KPATHSEA_WARNING=0}; export KPATHSEA_WARNING

# make our working directory.
test -d $TL_WORKDIR || mkdir $TL_WORKDIR
cd $TL_WORKDIR || exit 1

# configure && make.  Keep the tee outside, so that we can detect
# failure at either step.
{
  echo "starting TeX Live build at `date`"
  printf 'CMDLINE\t"%s"\n' "$0 $*"
  printf 'PWD\t"%s"\n'     "`pwd`"
  printf 'UNAME\t"%s"\n'   "`uname`"
  env | sort >buildenv.log
  echo "See also buildenv.log and buildinfo.log in `pwd`"
  echo
  #
  set -vx  # show the configure and make commands in the log.

  eval $TL_BUILD_ENV $TL_CONFIGURE \
        --prefix=$TL_INSTALL_DEST \
        --datadir=$TL_INSTALL_DEST \
        $TL_CONF_BANNER \
        $TL_CONF_MISSING \
        $TL_CONF_LARGEFILE \
        $TL_CONF_SHARED \
        $TL_CONF_XDVI_TOOLKIT \
        $TL_CONFIGURE_ARGS \
        "$@" \
  && eval $TL_POSTCONFIGURE \
  && eval $TL_BUILD_ENV $TL_MAKE $TL_MAKE_FLAGS $TL_MAKE_VERBOSE $TL_TARGET
  
  # Too arcane to propagate the exit status through a pipeline.
  # Just use a temp file.
  echo $? >exitstatus.txt
} 2>&1 | tee build.log
 

# if we have a bindir, report the number of binaries built.
bindir=$TL_INSTALL_DEST/bin
if test -d "$bindir"; then
  count=`find "$bindir" \! -type d -print | wc -l`
  if test "$count" -gt 0; then
    echo
    echo "$0: $count executables in $bindir."
  else
    echo "$0: Build failed, no executables under $bindir."
    echo "$0: Full log in: `pwd`/build.log"
    exit 1
  fi | tee -a build.log
# if no bindir, perhaps they specified --prefix; don't worry.
# Any errors will have been duly reported anyway.
fi

status=`cat exitstatus.txt`
if echo "$status" | egrep '^[0-9]+$' >/dev/null; then :; else
  echo "$0: exitstatus.txt does not contain a number; disk full?" >&2
  status=1
fi
echo "done (exit status $status)" `date` | tee -a build.log

exit $status