diff options
Diffstat (limited to 'otp_build')
-rwxr-xr-x | otp_build | 1277 |
1 files changed, 1277 insertions, 0 deletions
diff --git a/otp_build b/otp_build new file mode 100755 index 0000000000..e478256314 --- /dev/null +++ b/otp_build @@ -0,0 +1,1277 @@ +#! /bin/sh + +# Expected autoconf version +EXPECTED_AUTOCONF_VERSION=2.59 + +# clearmake command to use +clearmake=false + +# Global configuration variables +# +# NOTE: lazy_configure depends on '.' allways being last directory +if [ -z "$ONLY_ERTS" ]; then + AUTOCONF_SUBDIRS="lib lib/*" +fi +AUTOCONF_SUBDIRS="$AUTOCONF_SUBDIRS erts ." + +# Utility functions +usage () +{ + echo "Available options:" + echo " setup [-a] [<configure parameters>] - does autoconf, configure and boot." + echo " all [-a] <dir> - does autoconf, configure, boot, release" + echo " autoconf - (re)build the configure scripts" + echo " configure [<configure parameters>] - does the actual configuration" + echo " smp [-a] - build a small Erlang system, smp flavor" + echo " hybrid [-a] - build a small Erlang system, hybrid flavor" + echo " nofrag [-a] - build a small Erlang system, nofrag flavor" + echo " boot [-a] - bootstraps and build system (after configure)" + echo " release <target_dir> - creates a small release to <target_dir>" + echo " release [-a] <target_dir> - creates full release to <target_dir>" + echo " tests <dir> - Build testsuites to <dir>" + echo "" + echo "These are for cleaning up an open source distribution" + echo "with prebuilt files, so that it resembles the clean developers" + echo "codebase:" + echo " remove_prebuilt_files - create a minimal source tree" + echo " save_bootstrap - recreate primary bootstrap" + echo "" + echo "Special targets for Windows(tm) build:" + echo " debuginfo_win32 <dir> - adds debug emulator and pdb files to <dir>" + echo " installer_win32 <dir> - creates a windows installer from <dir>" + echo "" + echo "Before trying to build on windows, consider the following option" + echo " env_win32 - echo environment settings for win32 with visual C++, use with eval" + echo " env_mingw32 - echo environment settings for win32 with MinGW, use with eval" + echo "" + echo "Before trying to build for vxworks, consider the following option" + echo " env_vxworks <cpu> - echo environment settings for vxworks, use with eval" + echo "" + echo "Before trying to cross compile, set environment via the following option" + echo "Please note that the path to the configuration file should be absolute." + echo " env_cross <absolute path to cross conf file> - echo environment settings for cross compilation, use with eval" + echo "" + echo "The following options concern the primary bootstrap." + echo "{prepare,update,commit,cancel}_primary is for actually updating" + echo "the checked in derivates of the main code base, they are not for" + echo "managing a downloaded spource-tree." + echo " prepare_primary - prepares for building primary bootstrap (only in Clearcase)" + echo " update_primary - creates the primary bootstrap, the one shipped" + echo " commit_primary - commits a primary bootstrap (only in Clearcase)" + echo " cancel_primary - uncheckout a primary bootstrap (only in Clearcase)" + echo "" + echo "The following options concern preloaded code." + echo "They are, like the primary bootstrap, mainly the concern of the" + echo "main developers." + echo " prepare_preloaded - prepares for building preloaded code (only in Clearcase)" + echo " update_preloaded - creates the preloaded beam code, the one shipped" + echo " commit_preloaded - commits the preloaded code (only in Clearcase)" + echo " cancel_preloaded - uncheckout preloaded code (only in Clearcase)" +} + +xcomp_fail () +{ + echo "The mandatory cross compilation variable" $1 "is not set in" $2 ",aborting" >&2 + exit 1 +} + +check_xcomp_file () +{ + if test "x$erl_xcomp_os" = "x"; then + xcomp_fail erl_xcomp_os $1 + fi + if test "x$erl_xcomp_hw" = "x"; then + xcomp_fail erl_xcomp_hw $1 + fi + if test "x$erl_xcomp_man" = "x"; then + xcomp_fail erl_xcomp_man $1 + fi + if test "x$erl_xcomp_target_xtra" = "x"; then + xcomp_fail erl_xcomp_target_extra $1 + fi + if test "x$erl_xcomp_void_p" = "x"; then + xcomp_fail erl_xcomp_void_p $1 + fi + if test "x$erl_xcomp_short" = "x"; then + xcomp_fail erl_xcomp_short $1 + fi + if test "x$erl_xcomp_int" = "x"; then + xcomp_fail erl_xcomp_int $1 + fi + if test "x$erl_xcomp_long" = "x"; then + xcomp_fail erl_xcomp_long $1 + fi + if test "x$erl_xcomp_long_long" = "x"; then + xcomp_fail erl_xcomp_long_long $1 + fi + if test "x$erl_xcomp_sizeof_size_t" = "x"; then + xcomp_fail erl_xcomp_sizeof_size_t $1 + fi + if test "x$erl_xcomp_sizeof_off_t" = "x"; then + xcomp_fail erl_xcomp_sizeof_off_t $1 + fi + if test "x$erl_xcomp_os" = "xlinux"; then + if test "x$erl_xcomp_linux_kernel" = "x"; then + xcomp_fail erl_xcomp_linux_kernel $1 + fi + fi + return 0 +} + + +check_erltop () +{ + ERLTOP_FORCED=false + if [ "X$ERL_TOP" = "X" ]; then + if [ -f ./otp_build -a -f ./erts/autoconf/config.guess ]; then + ERLTOP_FORCED=true + ERL_TOP=`/bin/pwd` + else + echo "The environment variable ERL_TOP must be set." >&2 + exit 1 + fi + fi +} + +target_contains () +{ + Y=`echo $TARGET | sed "s,$1,,g"` + [ X"$Y" != X"$TARGET" ] + return $? +} + + + +# Execution of the different options + +# Special static config flags for certain platforms are set here +set_config_flags () +{ + if target_contains linux; then + XX=`echo $* | grep -v able-hipe` + if [ "$*" = "$XX" ]; then + CONFIG_FLAGS="--disable-hipe" + fi + fi + if target_contains "univel-sysv4"; then + CONFIG_FLAGS="--x-libraries=/usr/lib/X11" + fi + + if target_contains free_source; then + CONFIG_FLAGS="$CONFIG_FLAGS --host=$TARGET" + fi + if target_contains win32; then + CONFIG_FLAGS="--build=$BUILDSYS build_alias=win32 --host=win32 --target=win32" + else + # Link SSL static for all binary distributions if not overridden + XX=`echo $* | grep -v dynamic-ssl-lib` + if [ "$*" = "$XX" ]; then + CONFIG_FLAGS="--disable-dynamic-ssl-lib $CONFIG_FLAGS" + fi + fi + if [ "x$OVERRIDE_CONFIG_CACHE" = "x" ]; then + CONFIG_FLAGS="$CONFIG_FLAGS --cache-file=/dev/null" + else + CONFIG_FLAGS="$CONFIG_FLAGS --cache-file=$OVERRIDE_CONFIG_CACHE" + fi + + CONFIG_FLAGS="$CONFIG_FLAGS $*" + export CONFIG_FLAGS; +} + +do_autoconf () +{ + if target_contains win32; then + # Select the correct autoconf on cygwin + save_want_autoconf_ver=$WANT_AUTOCONF_VER + WANT_AUTOCONF_VER=$EXPECTED_AUTOCONF_VERSION + export WANT_AUTOCONF_VER + fi + exp_ac_vsn=$EXPECTED_AUTOCONF_VERSION + ac_vsn_blob=`autoconf --version` + ac_vsn=`echo x$ac_vsn_blob | sed "s|[^0-9]*\([0-9][^ \t\n]*\).*|\1|"` + case "$ac_vsn" in + $exp_ac_vsn) + ;; + *) + echo "***************************************************" 1>&2 + echo "***************************************************" 1>&2 + echo "*** WARNING: System might fail to configure or" 1>&2 + echo "*** might be erroneously configured" 1>&2 + echo "*** since autoconf version $ac_vsn is used" 1>&2 + echo "*** instead of version $exp_ac_vsn!" 1>&2 + echo "***************************************************" 1>&2 + echo "***************************************************" 1>&2 + ;; + esac + + if [ -d erts/autom4te.cache ]; then + echo "Cleaning erts/autom4te.cache" + rm -f erts/autom4te.cache/* + fi + + save_ot="$OVERRIDE_TARGET" + save_t="$TARGET" + if [ ! -z "$OVERRIDE_CONFIGURE" ]; then + echo "Autoconf disabled on target $TARGET, but is performed on host" >&2 + OVERRIDE_TARGET= + export OVERRIDE_TARGET + # We still use erts configure for erl_interface and VxWorks + case "$TARGET" in + *vxworks*) + AUTOCONF_SUBDIRS=`echo $AUTOCONF_SUBDIRS | \ + sed -e 's,lib/erl_interface,,' \ + -e 's,lib/gs,,' \ + -e 's,lib/megaco,,'` + ;; + esac + TARGET=`$ERL_TOP/erts/autoconf/config.guess` + fi + + for d in $AUTOCONF_SUBDIRS; do + if [ -f $d/configure.in ]; then + echo "=== running autoconf in $d" + ( cd $d && autoconf ) || exit 1 + fi + if [ x$d = x"erts" ]; then + echo "=== running autoheader in $d" + ( cd $d && autoheader configure.in > config.h.in ) \ + || exit 1 + fi + done + OVERRIDE_TARGET="$save_ot" + export OVERRIDE_TARGET + TARGET="$save_t" + if target_contains win32; then + WANT_AUTOCONF_VER=$save_want_autoconf_ver + export WANT_AUTOCONF_VER + fi +} + +mk_targetdir () +{ + if [ ! -d $ERL_TOP/$TARGET ]; then + echo "creating $ERL_TOP/$TARGET" + mkdir $ERL_TOP/$TARGET + else + echo "existing $ERL_TOP/$TARGET is used" + fi +} + +do_configure () +{ + setup_make + mk_targetdir + save_ot="$OVERRIDE_TARGET" + save_t="$TARGET" + if [ ! -z "$OVERRIDE_CONFIGURE" ]; then + case $TARGET in + vxworks_*) + ( cd erts/autoconf && \ + $ERL_TOP/erts/autoconf/configure.vxworks $TARGET ) + echo "Configuring for build host too..." >&2 + OVERRIDE_TARGET= + export OVERRIDE_TARGET + TARGET=`$ERL_TOP/erts/autoconf/config.guess` + mk_targetdir;; + *) + echo "Unexpected target when ordinary configure is" \ + "overridden" >&2 + echo 'check if $OVERRIDE_CONFIGURE and $OVERRIDE_TAGET' \ + 'environments are correct.' >&2 + exit 1;; + esac + else + if [ "x$OVERRIDE_TARGET" != "x" -a "x$OVERRIDE_TARGET" != "xwin32" ]; then + save_CONFIG_FLAGS="$CONFIG_FLAGS" + if [ "x$erl_xcomp_configure_flags" != "x" ]; then + set_config_flags $erl_xcomp_configure_flags + else + set_config_flags $CONFIG_FLAGS "$@" + fi + COMPFIX="" + save_CC="$CC" + save_LD="$LD" + save_CFLAGS="$CFLAGS" + save_LDFLAGS="$LDFLAGS" + save_RANLIB="$RANLIB" + save_AR="$AR" + save_DED_LD="$DED_LD" + save_DED_LDFLAGS="$DED_LDFLAGS" + save_DED_LD_FLAG_RUNTIME_LIBRARY_PATH="$DED_LD_FLAG_RUNTIME_LIBRARY_PATH" + save_CPP="$CPP" + if [ "x$erl_xcomp_cc" != "x" ]; then + CC="$erl_xcomp_cc" + fi + if [ "x$erl_xcomp_cpp" != "x" ]; then + CPP="$erl_xcomp_cpp" + fi + if [ "x$erl_xcomp_ld" != "x" ]; then + LD="$erl_xcomp_ld" + fi + if [ "x$erl_xcomp_cflags" != "x" ]; then + CFLAGS="$erl_xcomp_cflags" + fi + if [ "x$erl_xcomp_ldflags" != "x" ]; then + LDFLAGS="$erl_xcomp_ldflags" + fi + if [ "x$erl_xcomp_ranlib" != "x" ]; then + RANLIB="$erl_xcomp_ranlib" + fi + if [ "x$erl_xcomp_ar" != "x" ]; then + AR="$erl_xcomp_ar" + fi + if [ "x$erl_xcomp_ded_ld" != "x" ]; then + DED_LD="$erl_xcomp_ded_ld" + fi + if [ "x$erl_xcomp_ded_ld_runtime_library_path" != "x" ]; then + DED_LD_FLAG_RUNTIME_LIBRARY_PATH="$erl_xcomp_ded_ld_runtime_library_path" + fi + if [ "x$erl_xcomp_ded_ldflags" != "x" ]; then + DED_LDFLAGS="$erl_xcomp_ded_ldflags" + fi + export CC LD CFLAGS LDFLAGS RANLIB AR DED_LD DED_LDFLAGS DED_LD_FLAG_RUNTIME_LIBRARY_PATH CPP + + # + # The environment for compilers, cflags et al are sometimes hard + # to pass along in recursive configure, why each cross configure + # is run separately instead. This variable (crossdirs) need to + # be updated whenever a new application needs a configure + # of it's own, at least until I get the recirsive configure + # to work for the complicated environment needed by i.e. vxworks + # compilers. It's a kludge, but a working one... + # + + crossdirs="erts lib/common_test lib/erl_interface lib/gs lib/megaco lib/odbc lib/snmp lib/wx" + + if [ -z "$ONLY_ERTS" ]; then + for x in $crossdirs; do + if [ -f "$x/configure" ]; then + (cd $x;./configure --host=$erl_xcomp_hw --with-xcompconf=$ERL_XCOMP_CONF $CONFIG_FLAGS) || exit 1 + fi + done + else + (cd $ERL_TOP/erts;./configure --host=$erl_xcomp_hw --with-xcompconf=$ERL_XCOMP_CONF $CONFIG_FLAGS) || exit 1 + fi + CC="$save_CC" + LD="$save_LD" + CFLAGS="$save_CFLAGS" + LDFLAGS="$save_LDFLAGS" + RANLIB="$save_RANLIB" + AR="$save_AR" + DED_LD="$save_DED_LD" + DED_LDFLAGS="$save_DED_LDFLAGS" + DED_LD_FLAG_RUNTIME_LIBRARY_PATH="$save_DED_LD_FLAG_RUNTIME_LIBRARY_PATH" + CPP="$save_CPP" + export CC LD CFLAGS LDFLAGS RANLIB AR DED_LD DED_LDFLAGS DED_LD_FLAG_RUNTIME_LIBRARY_PATH CPP + echo "Configuring for build host too..." >&2 + OVERRIDE_TARGET= + export OVERRIDE_TARGET + TARGET=`$ERL_TOP/erts/autoconf/config.guess` + mk_targetdir + CONFIG_FLAGS="$save_CONFIG_FLAGS" + fi + fi + set_config_flags $CONFIG_FLAGS "$@" + if [ -z "$ONLY_ERTS" ]; then + ./configure $CONFIG_FLAGS || exit 1 + else + echo "erts/configure $CONFIG_FLAGS" + (cd $ERL_TOP/erts; ./configure $CONFIG_FLAGS) || exit 1 + fi + OVERRIDE_TARGET="$save_ot" + export OVERRIDE_TARGET + TARGET="$save_t" +} + +do_lazy_configure () +{ + setup_make + if [ "x$OVERRIDE_TARGET" != "x" -a "x$OVERRIDE_TARGET" != "xwin32" ]; then + echo "Not supported for cross compilation" >&2 + exit 1 + fi + set_config_flags $CONFIG_FLAGS "$@" + for c_dir in $AUTOCONF_SUBDIRS; do + if test -f $ERL_TOP/$c_dir/configure.in; then + dir=$ERL_TOP/$c_dir + echo "" + echo "=== Begin configuring $dir" + xc_dep= ; + xcs_dep= ; + test -d $dir/$TARGET || mkdir $dir/$TARGET + test -f $dir/aclocal.m4 && xc_dep="$xcs_dep $dir/aclocal.m4" + test -f $dir/acsite.m4 && xc_dep="$xcs_dep $dir/acsite.m4" + test x$c_dir = x"erts" && xcs_dep="$xcs_dep $dir/config.h.in" + $MAKE -f $ERL_TOP/make/lazy_configure.mk \ + MAKE="$MAKE" TARGET=$TARGET \ + ERL_TOP=$ERL_TOP \ + CONFIGURE_FLAGS="$CONFIG_FLAGS" \ + CONFIGURE_DIR=$dir \ + EXTRA_CONFIGURE_DEPENDENCIES=$xc_dep \ + EXTRA_CONFIG_STATUS_DEPENDENCIES=$xcs_dep \ + EXPECTED_AUTOCONF_VERSION=$EXPECTED_AUTOCONF_VERSION \ + lazy_configure + echo "=== Done configuring $dir" + echo "" + fi + done +} + +do_lazy_configure_clean () +{ + setup_make + if [ "x$OVERRIDE_TARGET" != "x" -a "x$OVERRIDE_TARGET" != "xwin32" ]; then + echo "Not supported for cross compilation" >&2 + exit 1 + fi + for c_dir in $AUTOCONF_SUBDIRS; do + if test -f $ERL_TOP/$c_dir/configure.in; then + dir=$ERL_TOP/$c_dir + echo "" + echo "=== Begin cleaning configure in $dir" + xc_dep= ; + xcs_dep= ; + test -d $dir/$TARGET || mkdir $dir/$TARGET + test -f $dir/aclocal.m4 && xc_dep="$xcs_dep $dir/aclocal.m4" + test -f $dir/acsite.m4 && xc_dep="$xcs_dep $dir/acsite.m4" + test x$c_dir = x"erts" && xcs_dep="$xcs_dep $dir/config.h.in" + $MAKE -f $ERL_TOP/make/lazy_configure.mk \ + MAKE="$MAKE" TARGET=$TARGET \ + ERL_TOP=$ERL_TOP \ + CONFIGURE_DIR=$dir \ + EXPECTED_AUTOCONF_VERSION=$EXPECTED_AUTOCONF_VERSION \ + lazy_configure_clean + echo "=== Done cleaning configure in $dir" + echo "" + fi + done + +} + +do_lazy_configure_target_clean () +{ + setup_make + if [ "x$OVERRIDE_TARGET" != "x" -a "x$OVERRIDE_TARGET" != "xwin32" ]; then + echo "Not supported for cross compilation" >&2 + exit 1 + fi + for c_dir in $AUTOCONF_SUBDIRS; do + if test -f $ERL_TOP/$c_dir/configure.in; then + dir=$ERL_TOP/$c_dir + echo "" + echo "=== Begin target cleaning configure in $dir" + xc_dep= ; + xcs_dep= ; + test -d $dir/$TARGET || mkdir $dir/$TARGET + test -f $dir/aclocal.m4 && xc_dep="$xcs_dep $dir/aclocal.m4" + test -f $dir/acsite.m4 && xc_dep="$xcs_dep $dir/acsite.m4" + test x$c_dir = x"erts" && xcs_dep="$xcs_dep $dir/config.h.in" + $MAKE -f $ERL_TOP/make/lazy_configure.mk \ + MAKE="$MAKE" TARGET=$TARGET \ + ERL_TOP=$ERL_TOP \ + CONFIGURE_DIR=$dir \ + EXPECTED_AUTOCONF_VERSION=$EXPECTED_AUTOCONF_VERSION \ + lazy_configure_target_clean + echo "=== Done target cleaning configure in $dir" + echo "" + fi + done + +} + + + +echo_setenv () +{ + case "$DAILY_BUILD_SCRIPT$SHELL" in + true*) + echo "$1=$2";; + *ash|*ksh|*/sh|*zsh|*ash) + echo "$1=\"$2\";export $1$3";; + *csh) + echo "setenv $1 \"$2\"$3";; + esac +} + +echo_env_bootstrap () +{ + boot_bin=$BOOTSTRAP_ROOT/bootstrap/bin + + echo_setenv PATH $boot_bin:$PATH +} + +echo_env_erltop () +{ + if [ X"$ERL_TOP" = X"" -o "$ERLTOP_FORCED" = "true" ]; then + if [ -f ./otp_build ]; then + # Seems to be current directory... + echo_setenv ERL_TOP `/bin/pwd` ';' + else + echo "You need to either set ERL_TOP first or stand in the same" \ + "directory as this script resides in." >&2 + exit 1 + fi + fi +} + +echo_envinfo () +{ + case "$SHELL" in + *csh) + return 0 + ;; + *) + ;; + esac + if [ X"$DAILY_BUILD_SCRIPT" = X"true" ]; then + echo '# Output generated for daily build script only '\ + '($DAILY_BUILD_SCRIPT=true)' + else + echo '# Please note:' + echo '# The command you are running is supposed to be run'\ + 'using the shells' + echo '# "eval" builtin, like in:' + echo '# $ eval `./otp_build env_<something>`' + echo '# If you see this comment, you probably haven'"'"'t done that.' + fi +} + +echo_env_vxworks () +{ + if [ -z "$1" ]; then + echo "env_vxworks requires CPU architecture as parameter (ppc603, ppc860 etc)." >&2 + exit 1 + fi + echo_env_erltop + echo_setenv OVERRIDE_CONFIGURE true ';' + echo_setenv OVERRIDE_TARGET vxworks_$1 + echo_envinfo +} + +echo_env_cross () +{ + if [ -z "$1" ]; then + echo "env_cross requires path to cross compilation configuration" >&2 + exit 1 + fi + + if [ ! -f $1 ]; then + echo "No such file: $1" >&2 + exit 1 + fi + . $1 + check_xcomp_file $1 + echo_env_erltop + echo_setenv ERL_XCOMP_CONF $1 ';' + echo_setenv OVERRIDE_TARGET $erl_xcomp_target + echo_envinfo +} + +echo_env_win32 () +{ + #echo_envinfo + if [ X"$SHELL" = X"" ]; then + echo "You need to export the shell variable first," \ + "for bourne-like shells, type:" >&2 + echo 'export SHELL' >&2 + echo "and for csh-like shells, type:" >&2 + echo 'setenv SHELL $SHELL' >&2 + echo " - then try again." >&2 + exit 1 + fi + echo_env_erltop + # Try to cope with paths containing unexpected things like stray + # mixed paths (c:/something/bin) and quotes. Only C and D drive + # handled. + CCYGPATH=`cygpath c:\\` + DCYGPATH=`cygpath d:\\` + P2=`echo :$PATH | \ + sed "s,\",,g;s,:[cC]:,:$CCYGPATH,g;s,:[dD]:,:$DCYGPATH,g;s,^:,,"` + P3="" + save_ifs=$IFS + IFS=: + for p in $P2; do + if [ -d "$p" ]; then + C1="`(cygpath -d $p 2>/dev/null || cygpath -w $p)`" 2> /dev/null + C2=`cygpath "$C1" 2> /dev/null` 2> /dev/null + else + C2="" + fi + if [ ! -z "$C2" ]; then + if [ -z "$P3" ];then + P3="$C2" + else + P3="$P3:$C2" + fi + fi + done + IFS=$save_ifs + + echo_setenv OVERRIDE_TARGET win32 ';' + echo_setenv CC cc.sh ';' + echo_setenv CXX cc.sh ';' + echo_setenv AR ar.sh ';' + echo_setenv RANLIB true ';' + echo_setenv OVERRIDE_CONFIG_CACHE "$ERL_TOP/erts/autoconf/win32.config.cache" + echo_setenv PATH "$ERL_TOP/erts/etc/win32/cygwin_tools/vc:$ERL_TOP/erts/etc/win32/cygwin_tools:$P3" + echo_envinfo +} + +echo_env_mingw32 () +{ + #echo_envinfo + if [ X"$SHELL" = X"" ]; then + echo "You need to export the shell variable first," \ + "for bourne-like shells, type:" >&2 + echo 'export SHELL' >&2 + echo "and for csh-like shells, type:" >&2 + echo 'setenv SHELL $SHELL' >&2 + echo " - then try again." >&2 + exit 1 + fi + echo_env_erltop + CCYGPATH=`cygpath c:\\` + DCYGPATH=`cygpath d:\\` + P2=`echo :$PATH | \ + sed "s,\",,g;s,:[cC]:,:$CCYGPATH,g;s,:[dD]:,:$DCYGPATH,g;s,^:,,"` + P3="" + save_ifs=$IFS + IFS=: + for p in $P2; do + if [ -d "$p" ]; then + C1="`(cygpath -d $p 2>/dev/null || cygpath -w $p)`" 2> /dev/null + C2=`cygpath "$C1" 2> /dev/null` 2> /dev/null + else + C2="" + fi + if [ ! -z "$C2" ]; then + if [ -z "$P3" ];then + P3="$C2" + else + P3="$P3:$C2" + fi + fi + done + found=false + for p in $P3; do + if [ -f "$p/mingw32-gcc.exe" ]; then + found=$p + fi + done + found2=false + for p in $P3; do + if [ -f "$p/wmc.exe" ]; then + found2=$p + fi + done + IFS=$save_ifs + if [ X"$found" = X"false" ]; then + echo "Could not find mingw32-gcc in PATH, build with mingw not possible!" >&2 + return + fi + + if [ X"$found2" = X"false" ]; then + echo "Could not find wmc.exe in PATH, part of wine for windows, " >&2 + echo "needed for message file compilation: http://wine.sourceforge.net!!" >&2 + return + fi + + + echo_setenv OVERRIDE_TARGET win32 ';' + echo_setenv MINGW_EXE_PATH $found ';' + echo_setenv WINE_EXE_PATH $found2 ';' + echo_setenv CC cc.sh ';' + echo_setenv CXX cc.sh ';' + echo_setenv AR ar.sh ';' + echo_setenv RANLIB true ';' + echo_setenv PATH "$ERL_TOP/erts/etc/win32/cygwin_tools/mingw:$ERL_TOP/erts/etc/win32/cygwin_tools:$P3" + echo_envinfo +} + +lookup_prog_in_path () +{ + PROG=$1 + save_ifs=$IFS + IFS=: + for p in $PATH; do + # In cygwin the programs are not always executable and have .exe suffix... + if [ "X$TARGET" = "Xwin32" ]; then + if [ -f $p/$PROG.exe ]; then + echo $p/$PROG + break; + fi + else + if [ -x $p/$PROG ]; then + echo $p/$PROG + break; + fi + fi + done + IFS=$save_ifs +} + +setup_make () +{ + if [ -z "$MAKE" ]; then + case $TARGET in + win32) + MAKE=make;; + *) + if [ "X$CLEARCASE_MAKE_COMPAT" = "Xgnu" -a \ + X"$CLEARCASE_ROOT" != X"" -a \ + -n "`lookup_prog_in_path clearmake`" ]; then + clearmake="clearmake -V" + MAKE=$clearmake + else + if [ -n "`lookup_prog_in_path gmake`" ]; then + MAKE=gmake + else + MAKE=make + fi + fi;; + esac + fi + export MAKE +} + +do_noboot_lib_and_erts () +{ + setup_make + EMULATORS=emulator + if [ "x$MAKE" != "x$clearmake" ]; then + $MAKE MAKE="$MAKE" TARGET=$TARGET OTP_SMALL_BUILD=$OTP_SMALL_BUILD depend || exit 1; + fi + $MAKE MAKE="$MAKE" TARGET=$TARGET OTP_SMALL_BUILD=$OTP_SMALL_BUILD TYPE=$TYPE FLAVOR=$FLAVOR noboot || exit 1 +} + +do_primary_cross () +{ + save_t="$TARGET" + save_ot="$OVERRIDE_TARGET" + OVERRIDE_TARGET= + export OVERRIDE_TARGET + TARGET=`$ERL_TOP/erts/autoconf/config.guess` + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET primary_bootstrap || exit 1; + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET all_bootstraps || exit 1 + OVERRIDE_TARGET="$save_ot" + export OVERRIDE_TARGET + TARGET="$save_t" +} + +do_primary () +{ + setup_make + if [ "x$OVERRIDE_TARGET" != "x" -a "x$OVERRIDE_TARGET" != "xwin32" ]; then + do_primary_cross + else + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET primary_bootstrap || exit 1; + fi +} + +do_prepare () +{ + CT=`lookup_prog_in_path cleartool` + if [ X"$CLEARCASE_ROOT" = X"" -o X"$CT" = X"" ]; then + echo "To prepare for update of primary bootstrap, you need to run in a clearcase view." >&2 + return + fi + + if [ X"$ERL_TOP" = X"" ]; then + echo "ERL_TOP is not set." >&2 + return + fi + + $CT ls -rec -view_only $ERL_TOP/bootstrap | xargs rm -rf + + $CT find $ERL_TOP/bootstrap -cview -nxname -print | xargs $CT co -nc + echo '*****************************************************' + echo "Prepared for new bootstrap build - " + echo "directory bootstrap clean and completely checked out." + echo '*****************************************************' +} + +do_commit () +{ + CT=`lookup_prog_in_path cleartool` + if [ X"$CLEARCASE_ROOT" = X"" -o X"$CT" = X"" ]; then + echo "To prepare for update of primary bootstrap, you need to run in a clearcase view." >&2 + return + fi + + if [ X"$ERL_TOP" = X"" ]; then + echo "ERL_TOP is not set." >&2 + return + fi + + + for x in compiler kernel stdlib orber/include; do + files=`$CT lspriv -do $ERL_TOP/bootstrap/lib/$x` + for y in $files; do + echo "Creating $y" + $CT mkelem -nc $y + done + done + $CT lsco -rec -me -cview -s $ERL_TOP/bootstrap | xargs $CT ci -nc -ident + $CT lsco -d -me -cview -s $ERL_TOP/bootstrap | xargs $CT ci -nc -ident + + $CT ls -rec -view_only -nxname $ERL_TOP/bootstrap | xargs rm -rf + + + echo '*****************************************************' + echo "Checked in primary bootstrap." + echo '*****************************************************' +} + +do_cancel () +{ + CT=`lookup_prog_in_path cleartool` + if [ X"$CLEARCASE_ROOT" = X"" -o X"$CT" = X"" ]; then + echo "To prepare for update of primary bootstrap, you need to run in a clearcase view." >&2 + return + fi + + if [ X"$ERL_TOP" = X"" ]; then + echo "ERL_TOP is not set." >&2 + return + fi + NOTEMPTY=`$CT lsco -rec -me -cview -s $ERL_TOP/bootstrap` + if [ X"$NOTEMPTY" != X"" ]; then + $CT lsco -rec -me -cview -s $ERL_TOP/bootstrap | xargs $CT unco -rm + $CT unco $ERL_TOP/bootstrap + fi + $CT ls -rec -view_only $ERL_TOP/bootstrap | xargs rm -rf + echo '*****************************************************' + echo "Cancelled all checkouts for primary bootstrap." + echo '*****************************************************' + +} +do_prepare_prel () +{ + CT=`lookup_prog_in_path cleartool` + if [ X"$CLEARCASE_ROOT" = X"" -o X"$CT" = X"" ]; then + echo "To prepare for update of preloaded code, you have to run in a Clearcase view" >&2 + return + fi + + if [ X"$ERL_TOP" = X"" ]; then + echo "ERL_TOP is not set." >&2 + return + fi + + setup_make + (cd $ERL_TOP/erts/preloaded/src && $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET prepare) || exit 1 + echo '*****************************************************' + echo "Prepared for new preloaded code build - " + echo "Directory ERL_TOP/erts/prelaoded/ebin completely" + echo "checked out." + echo '*****************************************************' +} + +do_update_prel () +{ + CT=`lookup_prog_in_path cleartool` + if [ X"$CLEARCASE_ROOT" = X"" -o X"$CT" = X"" ]; then + echo "To prepare for update of preloaded code, you have to run in a Clearcase view" >&2 + return + fi + + if [ X"$ERL_TOP" = X"" ]; then + echo "ERL_TOP is not set." >&2 + return + fi + + setup_make + (cd $ERL_TOP/erts/preloaded/src && $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET clean) + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET preloaded || exit 1 + (cd $ERL_TOP/erts/preloaded/src && $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET copy) + echo '*****************************************************' + echo "Rebuilt preloaded code." + echo '*****************************************************' +} + +do_commit_prel () +{ + CT=`lookup_prog_in_path cleartool` + if [ X"$CLEARCASE_ROOT" = X"" -o X"$CT" = X"" ]; then + echo "To prepare for update of primary bootstrap, you need to run in a clearcase view." >&2 + return + fi + + if [ X"$ERL_TOP" = X"" ]; then + echo "ERL_TOP is not set." >&2 + return + fi + setup_make + + (cd $ERL_TOP/erts/preloaded/ebin && $CT ci -ident -nc *.beam) + (cd $ERL_TOP/erts/preloaded && $CT ci -ident -nc ebin) + + echo '*****************************************************' + echo "Checked in preloaded code." + echo '*****************************************************' +} + +do_cancel_prel () +{ + CT=`lookup_prog_in_path cleartool` + if [ X"$CLEARCASE_ROOT" = X"" -o X"$CT" = X"" ]; then + echo "To prepare for update of primary bootstrap, you need to run in a clearcase view." >&2 + return + fi + + if [ X"$ERL_TOP" = X"" ]; then + echo "ERL_TOP is not set." >&2 + return + fi + setup_make + (cd $ERL_TOP/erts/preloaded/src && $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET cancel) || exit 1 + echo '*****************************************************' + echo "Cancelled all checkouts for preloaded code." + echo '*****************************************************' + +} + + +do_boot_cross () +{ + SAVE_TARGET=$TARGET + SAVE_OVERRIDE_TARGET=$OVERRIDE_TARGET + OVERRIDE_TARGET= + TARGET=`$ERL_TOP/erts/autoconf/config.guess` + + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET all_bootstraps || exit 1; + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET local_setup || exit 1; + TARGET=$SAVE_TARGET + OVERRIDE_TARGET=$SAVE_OVERRIDE_TARGET + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET libs || exit 1; + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET depend || exit 1; + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET emulator || exit 1; +} + +do_boot_emu_cross () +{ + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET emulator || exit 1; +} + +do_boot () +{ + setup_make + if [ "x$OVERRIDE_TARGET" != "x" -a "x$OVERRIDE_TARGET" != "xwin32" ]; then + do_boot_cross + else + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET all || exit 1 + fi +} + +do_boot_emu () +{ + setup_make + if [ "x$OVERRIDE_TARGET" != "x" -a "x$OVERRIDE_TARGET" != "xwin32" ]; then + do_boot_emu_cross + else + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET emulator || exit 1 + fi +} + +do_release () +{ + setup_make + $MAKE MAKE="$MAKE" BOOTSTRAP_ROOT=$BOOTSTRAP_ROOT TARGET=$TARGET RELEASE_ROOT=$1 release || exit 1 +} + +do_tests () +{ + setup_make + if [ X"$1" = X"" ]; then + $MAKE MAKE="$MAKE" TARGET=$TARGET release_tests || exit 1 + else + $MAKE MAKE="$MAKE" TARGET=$TARGET TESTSUITE_ROOT=$1 release_tests || exit 1 + fi +} + +do_debuginfo_win32 () +{ + setup_make + (cd erts/emulator && $MAKE MAKE="$MAKE" TARGET=$TARGET FLAVOR=smp debug &&\ + $MAKE MAKE="$MAKE" TARGET=$TARGET FLAVOR=plain debug) || exit 1 + if [ -z "$1" ]; then + RELDIR=$ERL_TOP/release/$TARGET + else + RELDIR="$1" + fi + BINDIR=$ERL_TOP/bin/$TARGET + EVSN=`grep '^VSN' erts/vsn.mk | sed 's,^VSN.*=[^0-9]*\([0-9].*\)$,@\1,g;s,^[^@].*,,g;s,^@,,g'` + for f in beam.debug.dll beam.debug.smp.dll beam.pdb beam.smp.pdb erl.pdb werl.pdb erlexec.pdb; do + if [ -f $BINDIR/$f ]; then + rm -f $RELDIR/erts-$EVSN/bin/$f + cp $BINDIR/$f $RELDIR/erts-$EVSN/bin/$f + fi + done +} + +do_installer_win32 () +{ + setup_make + installer_dir=$ERL_TOP/erts/etc/win32/nsis + (cd $installer_dir; $MAKE MAKE="$MAKE" TARGET=$TARGET TESTROOT=$1 release) || exit 1 +} + +do_copy_primary_bootstrap () +{ + if [ "x$1" = "x" ]; then + echo "Missing bootstrap source top" 1>&2 + exit 1 + fi + if [ ! -d $1 ]; then + echo "Invalid bootstrap source top" 1>&2 + exit 1 + fi + if [ "x$2" = "x" ]; then + echo "Missing bootstrap root" 1>&2 + exit 1 + fi + if [ ! -d $2 ]; then + echo "Invalid bootstrap root" 1>&2 + exit 1 + fi + + bootstrap=$2/bootstrap + bootstrap_src_top=$1 + lib_src=$bootstrap_src_top/lib + + # kernel + test -d $bootstrap/lib/kernel/ebin || mkdir -p $bootstrap/lib/kernel/ebin + test -d $bootstrap/lib/kernel/include || mkdir -p $bootstrap/lib/kernel/include + cp -f $lib_src/kernel/ebin/*.beam $bootstrap/lib/kernel/ebin + cp -f $lib_src/kernel/ebin/*.app* $bootstrap/lib/kernel/ebin + cp -f $lib_src/kernel/include/*.hrl $bootstrap/lib/kernel/include + + # stdlib + test -d $bootstrap/lib/stdlib/ebin || mkdir -p $bootstrap/lib/stdlib/ebin + test -d $bootstrap/lib/stdlib/include || mkdir -p $bootstrap/lib/stdlib/include + cp -f $lib_src/stdlib/ebin/*.beam $bootstrap/lib/stdlib/ebin + cp -f $lib_src/stdlib/ebin/*.app* $bootstrap/lib/stdlib/ebin + cp -f $lib_src/stdlib/include/*.hrl $bootstrap/lib/stdlib/include + + # compiler + test -d $bootstrap/lib/compiler/ebin || mkdir -p $bootstrap/lib/compiler/ebin + cp -f $lib_src/compiler/ebin/*.beam $bootstrap/lib/compiler/ebin + cp -f $lib_src/compiler/ebin/*.app* $bootstrap/lib/compiler/ebin + + # orber include + test -d $bootstrap/lib/orber/include || mkdir -p $bootstrap/lib/orber/include + cp -f $lib_src/orber/include/* $bootstrap/lib/orber/include + + # bootstrap bin + if [ $bootstrap_src_top != $ERL_TOP ]; then + test -d $bootstrap/bin || mkdir -p $bootstrap/bin + cp -f $bootstrap_src_top/bin/* $bootstrap/bin + fi + +} + +do_save_bootstrap () +{ + if [ ! -f $ERL_TOP/prebuilt.files ]; then + echo "This is not a pre-built source distribution" 1>&2 + exit 1 + fi + if [ -d $ERL_TOP/bootstrap/lib ]; then + echo "Bootstrap already exist" 1>&2 + exit 1 + fi + + do_copy_primary_bootstrap $ERL_TOP $ERL_TOP +} + +do_remove_prebuilt_files () +{ + do_save_bootstrap + for file in $ERL_TOP/`cat $ERL_TOP/prebuilt.files` ; do + rm -f $file + done +} + +# main + +check_erltop + +cd $ERL_TOP + +# Unset ERL_FLAGS and ERL_<Release>_FLAGS to prevent, for instance, +# a value of "-hybrid" to run the hybrid emulator during bootstrap. +sys_vsn=`awk '/SYSTEM_VSN = / {print $3}' < erts/vsn.mk` +sys_erl_flags="ERL_${sys_vsn}_FLAGS" +unset ERL_FLAGS +unset ${sys_erl_flags} + +# Target first guess, won't necessarily hold, may be changed for +# certain parameters. +if [ X"$TARGET" = X"" ]; then + TARGET=`$ERL_TOP/erts/autoconf/config.guess` +fi +BUILDSYS=$TARGET + +case $TARGET in + *-cygwin) + if [ X"$BUILD_FOR_CYGWIN" = X"" ]; then + if [ X"$OVERRIDE_TARGET" = X"" -a X"$1" != X"env_win32" -a X"$1" != X"env_mingw32" ];then + echo "Building for windows, you should do the " \ + "following first:" >&2 + echo 'eval `./otp_build env_win32`' >&2 + echo 'please note that there are backticks (``) in' \ + 'the command' + exit 1 + fi + fi;; + *) + ;; +esac + +if [ ! -z "$OVERRIDE_TARGET" ]; then + TARGET="$OVERRIDE_TARGET" +fi + +# Setting a bootstrap root is inherently very dangerous now that the bootstrap +# is prebuilt, avoid it if not forced by setting FORCE_BOOTSTRAP_ROOT=true! + +if [ X"$FORCE_BOOTSTRAP_ROOT" != X"true" ]; then + BOOTSTRAP_ROOT="$ERL_TOP" +else + if [ -z "$BOOTSTRAP_ROOT" ]; then + BOOTSTRAP_ROOT="$ERL_TOP" + fi +fi + +if [ X"$1" = X"" ]; then + usage + exit 1 +fi + +if [ X"$2" = X"-a" ]; then + minus_a_flag=true + OTP_SMALL_BUILD= +else + OTP_SMALL_BUILD=true + minus_a_flag=false +fi +export OTP_SMALL_BUILD + +if [ "x$ERL_XCOMP_CONF" != "x" ]; then + . $ERL_XCOMP_CONF +fi + +TYPE= +case "$1" in + all) + do_autoconf; + do_configure; + do_boot; + if [ $minus_a_flag = true ]; then + shift + fi; + do_release "$2";; + setup) + shift; + if [ $minus_a_flag = true ]; then + shift + fi; + do_autoconf; + do_configure "$@"; + do_boot;; + lazy_setup) + shift; + if [ $minus_a_flag = true ]; then + shift + fi; + do_lazy_configure "$@"; + do_boot;; + autoconf) + do_autoconf;; + configure) + shift; + do_configure "$@";; + lazy_configure) + shift; + do_lazy_configure "$@";; + lazy_configure_clean) + shift; + do_lazy_configure_clean;; + lazy_configure_target_clean) + shift; + do_lazy_configure_target_clean;; + opt) + do_boot;; + plain|smp|hybrid|nofrag) + if [ $minus_a_flag = false ]; then + TYPE=opt + fi; + FLAVOR=$1 + if [ $FLAVOR = opt ]; then + FLAVOR=plain + fi + do_boot;; + prepare_primary) + do_prepare;; + update_primary) + do_primary;; + commit_primary) + do_commit;; + cancel_primary) + do_cancel;; + prepare_preloaded) + do_prepare_prel;; + update_preloaded) + do_update_prel;; + commit_preloaded) + do_commit_prel;; + cancel_preloaded) + do_cancel_prel;; + primary) + echo "Primary bootstrap is under version control since R13"; + echo "Use {prepare,update,commit}_primary if you really are"; + echo "updating the primary bootstrap...";; + boot) + do_boot;; + emulator) + do_boot_emu;; + release) + if [ $minus_a_flag = true ]; then + shift + fi; + do_release "$2";; + tests) + if [ $minus_a_flag = true ]; then + shift + fi; + do_tests "$2";; + remove_prebuilt_files) + do_remove_prebuilt_files;; + save_bootstrap) + do_save_bootstrap;; + copy_primary_bootstrap) + do_copy_primary_bootstrap $2 $3;; + installer_win32) + if [ $minus_a_flag = true ]; then + shift + fi; + do_installer_win32 "$2";; + debuginfo_win32) + if [ $minus_a_flag = true ]; then + shift + fi; + do_debuginfo_win32 "$2";; + env_win32) + echo_env_win32;; + env_mingw32) + echo_env_mingw32;; + env_vxworks) + echo_env_vxworks "$2";; + env_cross) + echo_env_cross "$2";; + env_bootstrap) + echo_env_bootstrap;; + *) + usage;; +esac |