# $Id: Head.U,v 3.0.1.9 1997/02/28 15:02:09 ram Exp $
#
-# Generated on Sat Jun 16 19:06:04 EET DST 2001 [metaconfig 3.0 PL70]
+# Generated on Tue Jun 19 02:14:42 EET DST 2001 [metaconfig 3.0 PL70]
# (with additional metaconfig patches by perlbug@perl.org)
cat >c1$$ <<EOF
case "$usecrosscompile" in
$define|true|[yY]*)
+ $echo "Cross-compiling..."
croak=''
case "$cc" in
*-*-gcc) # A cross-compiling gcc, probably.
- targetarch=`echo $cc|sed 's/-gcc$//'`
+ targetarch=`$echo $cc|$sed 's/-gcc$//'`
ar=$targetarch-ar
# leave out ld, choosing it is more complex
nm=$targetarch-nm
ranlib=$targetarch-ranlib
+ $echo 'extern int foo;' > try.c
+ set X `$cc -v -E perl.c 2>&1 | $awk '/^#include </,/^End of search /'|$grep '/include'`
+ shift
+ if $test $# -gt 0; then
+ incpth="$incpth $*"
+ incpth="$echo $incpth|$sed 's/^ //'"
+ echo "Guessing incpth $incpth" >&4
+ for i in $*; do
+ j=`$echo $i|$sed 's,/include$,/lib,'`
+ if $test -d $j; then
+ libpth="$libpth $j"
+ fi
+ done
+ libpth="$echo $libpth|$sed 's/^ //'"
+ echo "Guessing libpth $libpth." >&4
+ fi
+ $rm -f try.c
;;
esac
case "$targetarch" in
- '') echo "Cross-compiling: you should define targetarch." >&4; croak=y ;;
- esac
- case "$usrinc" in
- '') echo "Cross-compiling: you should define usrinc." >&4; croak=y ;;
+ '') echo "Targetarch not defined." >&4; croak=y ;;
+ *) echo "Using targetarch $targetarch." >&4 ;;
esac
case "$incpth" in
- '') echo "Cross-compiling: you should define incpth." >&4; croak=y ;;
+ '') echo "Incpth not defined." >&4; croak=y ;;
+ *) echo "Using incpth $incpth." >&4 ;;
esac
case "$libpth" in
- '') echo "Cross-compiling: you should define libpth." >&4; croak=y ;;
+ '') echo "Libpth not defined." >&4; croak=y ;;
+ *) echo "Using libpth $libpth." >&4 ;;
esac
- case "$targethost" in
- '') echo "Cross-compiling: targethost not defined." >&4; croak=y ;;
+ case "$usrinc" in
+ '') for i in $incpth; do
+ if $test -f $i/errno.h -a -f $i/stdio.h -a -f $i/time.h; then
+ usrinc=$i
+ echo "Guessing usrinc $usrinc." >&4
+ break
+ fi
+ done
+ case "$usrinc" in
+ '') echo "Usrinc not defined." >&4; croak=y ;;
+ esac
+ ;;
+ *) echo "Using usrinc $usrinc." >&4 ;;
esac
- case "$targetdir" in
- '') echo "Cross compiling: targetdir not defined." >&4; croak=y ;;
+ case "$targethost" in
+ '') echo "Targethost not defined." >&4; croak=y ;;
+ *) echo "Using targethost $targethost." >&4
esac
- locincpth=''
- loclibpth=''
+ locincpth=' '
+ loclibpth=' '
case "$croak" in
- y) exit 1 ;;
+ y) echo "Cannot continue, aborting." >&4; exit 1 ;;
esac
case "$src" in
/*) run=$src/Cross/run
to=$src/Cross/to
from=$src/Cross/from
;;
- *) pwd=`test -f ../Configure & cd ..; pwd`
+ *) pwd=`$test -f ../Configure & cd ..; pwd`
run=$pwd/Cross/run
to=$pwd/Cross/to
from=$pwd/Cross/from
run=$run-$targetrun
to=$to-$targetto
from=$from-$targetfrom
+ case "$targetdir" in
+ '') targetdir=/tmp
+ echo "Guessing targetdir $targetdir." >&4
+ ;;
+ esac
case "$targetuser" in
- '') targetuser=root ;;
+ '') targetuser=root
+ echo "Guessing targetuser $targetuser." >&4
+ ;;
esac
case "$targetfrom" in
scp) q=-q ;;
$targetrun -l $targetuser $targethost "cd $targetdir && ./\$exe \$@"
EOF
;;
- *) echo "Cross-compiling: unknown targetrun '$targetrun'" >&4
+ *) echo "Unknown targetrun '$targetrun'" >&4
exit 1
;;
esac
cp \$@ $targetdir/.
EOF
;;
- *) echo "Cross-compiling: unknown targetto '$targetto'" >&4
+ *) echo "Unknown targetto '$targetto'" >&4
exit 1
;;
esac
exit 0
EOF
;;
- *) echo "Cross-compiling: unknown targetfrom '$targetfrom'" >&4
+ *) echo "Unknown targetfrom '$targetfrom'" >&4
exit 1
;;
esac
- if test ! -f $run; then
- echo "Cross-compiling: target 'run' script '$run' not found." >&4
+ if $test ! -f $run; then
+ echo "Target 'run' script '$run' not found." >&4
else
chmod a+rx $run
fi
- if test ! -f $to; then
- echo "Cross-compiling: target 'to' script '$to' not found." >&4
+ if $test ! -f $to; then
+ echo "Target 'to' script '$to' not found." >&4
else
chmod a+rx $to
fi
- if test ! -f $from; then
- echo "Cross-compiling: target 'from' script '$from' not found." >&4
+ if $test ! -f $from; then
+ echo "Target 'from' script '$from' not found." >&4
else
chmod a+rx $from
fi
- if test ! -f $run -o ! -f $to -o ! -f $from; then
+ if $test ! -f $run -o ! -f $to -o ! -f $from; then
exit 1
fi
cat >&4 <<EOF
-Cross-compiling: Using
- $run-ssh
- $to-ssh
- $from-ssh
+Using '$run' for remote execution, and '$from' and '$to'
+for remote file transfer.
EOF
;;
*) run=''
MakeMaker is not yet cross-compilation aware, and neither is
the main Makefile.
+Since the functionality is so lacking, it must be considered
+highly experimental. It is so experimental that it is not even
+mentioned during an interactive Configure session, a direct comand
+line invocation (detailed shortly) is required to access the
+functionality.
+
NOTE: Perl is routinely built using cross-compilation
in the EPOC environment but the solutions from there
- can't directly be used.
+ can't directly be used elsewhere.
The one environment where cross-compilation has successfully been used
as of this writing is the Compaq iPAQ running ARM Linux. The build
-host was Intel Linux, the networking setup was PPP + SSH, see
+host was Intel Linux, the networking setup was PPP + SSH. The exact
+setup details are beyond the scope of this document, see
http://www.handhelds.org/ for more information.
To run Configure in cross-compilation mode the basic switch is
-Dtargethost=so.me.ho.st -Dtargetdir=/tar/get/dir
The targethost is what e.g. ssh will use as the hostname, the targetdir
-must exists (the scripts won't create it). You can also specify a
-username to use
+must exist (the scripts won't create it), the targetdir defaults to /tmp.
+You can also specify a username to use for ssh/rsh logins
-Dtargetuser=luser
but in case you don't, "root" will be used.
-Because this is a cross-compilation effort, you will also need to
-specify which target environment and which compilation environment to
-use. This includes the compiler, the header files, and the libraries.
-In the below we will use the usual settings for the iPAQ
-cross-compilation environment:
+Because this is a cross-compilation effort, you will also need to specify
+which target environment and which compilation environment to use.
+This includes the compiler, the header files, and the libraries.
+In the below we use the usual settings for the iPAQ cross-compilation
+environment:
-Dtargetarch=arm-linux
-Dcc=arm-linux-gcc
If the name of the C<cc> has the usual GNU C semantics for cross
compilers, that is, CPU-OS-gcc, the names of the C<ar>, C<nm>, and
C<ranlib> will also be automatically chosen to be CPU-OS-ar and so on.
-(The C<ld> requires more thought and will be chosen later by Configure.)
+(The C<ld> requires more thought and will be chosen later by Configure
+as appropriate.) Also, in this case the incpth, libpth, and usrinc
+will be guessed by Configure (unless explicitly set to something else,
+in which case Configure's guesses with be appended).
In addition to the default execution/transfer methods you can also
choose B<rsh> for execution, and B<rcp> or B<cp> for transfer,
Putting it all together:
sh ./Configure -des -Dusecrosscompile \
- -Dtargethost=so.me.ho.st -Dtargetdir=/tar/get/dir \
+ -Dtargethost=so.me.ho.st \
+ -Dtargetdir=/tar/get/dir \
-Dtargetuser=root \
-Dtargetarch=arm-linux \
-Dcc=arm-linux-gcc \
-Dlibpth=/skiff/local/arm-linux/lib \
-D...
+or if you are happy with the defaults
+
+ sh ./Configure -des -Dusecrosscompile \
+ -Dtargethost=so.me.ho.st \
+ -Dcc=arm-linux-gcc \
+ -D...
+
=head1 make test
This will run the regression tests on the perl you just made. If