#!/bin/sh
#
# %CopyrightBegin%
#
# Copyright Ericsson AB 2010. All Rights Reserved.
#
# The contents of this file are subject to the Erlang Public License,
# Version 1.1, (the "License"); you may not use this file except in
# compliance with the License. You should have received a copy of the
# Erlang Public License along with this software. If not, it can be
# retrieved online at http://www.erlang.org/.
#
# Software distributed under the License is distributed on an "AS IS"
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
# the License for the specific language governing rights and limitations
# under the License.
#
# %CopyrightEnd%
#
# Author: Rickard Green
#

target=
build_otp=
erl_top=
force=no

while [ $# -gt 0 ]; do
    case "$1" in
	-target)
	    shift
	    test $# -gt 0 || { echo "$0: Missing target" 1>&2; exit 1; }
	    target="$1";;
	-otp)
	    shift
	    test $# -gt 0 || { echo "$0: Missing otp release" 1>&2; exit 1; }
	    build_otp="$1";;
	-erl_top)
	    shift
	    test $# -gt 0 || { echo "$0: Missing erl top" 1>&2; exit 1; }
	    erl_top="$1";;
	-force)
	    shift
	    test $# -gt 0 || { echo "$0: Missing force value" 1>&2; exit 1; }
	    force=$1;;
	*)
	    echo "$0: Bad argument: $1" 1>&2
	    exit 1;;
    esac
    shift
done

test "X$target" != "X" || { echo "$0: Missing target" 1>&2; exit 1; }
test "X$build_otp" != "X" || { echo "$0: Missing otp release" 1>&2; exit 1; }
test "X$erl_top" != "X" || { echo "$0: Missing erl top" 1>&2; exit 1; }
test "X$force" != "X" || { echo "$0: Missing force value" 1>&2; exit 1; }

cd $erl_top

cat > cross_check_erl.erl <<\EOF
%
% Copyright Ericsson AB 2010. All Rights Reserved.
% 
% The contents of this file are subject to the Erlang Public License,
% Version 1.1, (the "License"); you may not use this file except in
% compliance with the License. You should have received a copy of the
% Erlang Public License along with this software. If not, it can be
% retrieved online at http://www.erlang.org/.
% 
% Software distributed under the License is distributed on an "AS IS"
% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
% the License for the specific language governing rights and limitations
% under the License.
%

-module(cross_check_erl).

-export([start/0]).

start() ->
    OTP = case catch erlang:system_info(otp_release) of
	      {'EXIT', _} -> "OTP";
	      Rel -> "OTP-" ++ Rel
	  end,
    io:format("~s~n", [OTP]),
    init:stop().

EOF

erlc cross_check_erl.erl 2>/dev/null \
  && used_otp=`erl -noshell -noinput -pa . -run cross_check_erl 2>/dev/null`

res=$?

rm -f cross_check_erl.erl cross_check_erl.beam

test $res -eq 0 || {
    cat 1>&2 <<EOF
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* ERROR:   No usable Erlang/OTP system for the build machine found! Cannot
*          cross compile without such a system.
*
*          Either build a bootstrap system for the build machine, or provide
*          an Erlang/$build_otp system in the \$PATH, and try again. For more
*          information on cross compiling Erlang/$build_otp, see the
*          \$ERL_TOP/xcomp/README file.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
EOF
    exit 1
}

test "X$build_otp" = "X$used_otp" || {
    test $force = yes || {
	cat 1>&2 <<EOF
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* ERROR:   Trying to cross compile an Erlang/$build_otp system with a different
*          Erlang/$used_otp system. When cross compiling you should compile
*          with an Erlang/OTP system of the same release. It is possible,
*          however not recomended, to force the cross compilation even though
*          the wrong Erlang/OTP system is used. For more information on this,
*          and cross compiling Erlang/$build_otp in general, see the
*          \$ERL_TOP/xcomp/README file.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
EOF
	exit 1
    }

    cat <<EOF
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* WARNING: Cross compiling an Erlang/$build_otp system with a different
*          Erlang/$used_otp system. When cross compiling you should compile
*          with an Erlang/OTP system of the same release. This build might
*          fail, or silently produce suboptimal code. For more information on
*          cross compiling Erlang/$build_otp, see the \$ERL_TOP/xcomp/README
*          file.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

EOF
}

cat <<EOF
*
* Cross compiling Erlang/$build_otp for: $target
*
EOF

exit 0