构建OCaml交叉编译器-配置零件 [英] Building an OCaml cross-compiler - configure part

查看:101
本文介绍了构建OCaml交叉编译器-配置零件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要构建一个OCaml交叉编译器.可悲的是,似乎似乎不支持此功能,需要做一些工作,如所述 以获得 OCaml编译器的较旧版本.
我的第一个问题是:生成文件 config/mh config/sh config/Makefile 的一种好方法是什么?

I need to build an OCaml cross-compiler. Sadly, it seems this is not supported out of the box and needs a little work, as described for an older version of the OCaml compiler.
My first question is: What is a nice way to generate the files config/m.h, config/s.h and config/Makefile?

推荐答案

使用修改后的配置链",可以生成文件. Ocamls configure脚本假定它可以在同一运行中编译并执行结果,这在交叉编译环境中是不可能的.
因此,必须修改配置过程,以便存储编译结果(包括可执行文件)并可以在目标计算机上的第二次运行中使用.这是显示修改的差异文件(约200行).

With a modified configure "chain" it is possible to generate the files. Ocamls configure script assumes that it can compile and execute the results on the same run, which can be impossible in a cross compile environment.
Hence the configure procedure must be modified such that the results of the compilations (including the executables) are stored and can be used in a second run on the target machine. Here is the diff file showing the modification (~200 lines).

diff -r -U 1 ocaml-4.00.0-orig/config/auto-aux/hasgot ocaml-4.00.0-cross/config/auto-aux/hasgot
--- ocaml-4.00.0-orig/config/auto-aux/hasgot
+++ ocaml-4.00.0-cross/config/auto-aux/hasgot
@@ -15,2 +15,4 @@

+. ./keyval.sh
+
 opts=""
@@ -36,7 +38,13 @@

+key="$cc $args"
+getValueExit "$key"
+
 if test "$verbose" = yes; then
   echo "hasgot $args: $cc $opts -o tst hasgot.c $libs" >&2
-  exec $cc $opts -o tst hasgot.c $libs > /dev/null
+  `exec $cc $opts -o tst hasgot.c $libs > /dev/null`
 else
-  exec $cc $opts -o tst hasgot.c $libs > /dev/null 2>/dev/null
+  `exec $cc $opts -o tst hasgot.c $libs > /dev/null 2>/dev/null`
 fi
+res=$?
+setValue "$key" "$res"
+exit "$res"
diff -r -U 1 ocaml-4.00.0-orig/config/auto-aux/hasgot2 ocaml-4.00.0-cross/config/auto-aux/hasgot2
--- ocaml-4.00.0-orig/config/auto-aux/hasgot2
+++ ocaml-4.00.0-cross/config/auto-aux/hasgot2
@@ -15,2 +15,4 @@

+. ./keyval.sh
+
 opts=""
@@ -36,7 +38,13 @@

+key="$cc $args"
+getValueExit "$key"
+
 if test "$verbose" = yes; then
   echo "hasgot2 $args: $cc $opts -o tst hasgot.c $libs" >&2
-  exec $cc $opts -o tst hasgot.c $libs > /dev/null
+  `exec $cc $opts -o tst hasgot.c $libs > /dev/null`
 else
-  exec $cc $opts -o tst hasgot.c $libs > /dev/null 2>/dev/null
+  `exec $cc $opts -o tst hasgot.c $libs > /dev/null 2>/dev/null`
 fi
+res=$?
+setValue "$key" "$res"
+exit "$res"
Only in ocaml-4.00.0-cross/config/auto-aux: keyval.sh
diff -r -U 1 ocaml-4.00.0-orig/config/auto-aux/runtest ocaml-4.00.0-cross/config/auto-aux/runtest
--- ocaml-4.00.0-orig/config/auto-aux/runtest
+++ ocaml-4.00.0-cross/config/auto-aux/runtest
@@ -17,6 +17,30 @@
 echo "runtest: $cc -o tst $* $cclibs" >&2
-$cc -o tst $* $cclibs || exit 100
+stream=/dev/stderr
 else
-$cc -o tst $* $cclibs 2> /dev/null || exit 100
+stream=/dev/null
+#$cc -o tst $* $cclibs 2> /dev/null || exit 100
 fi
+
+key="$* $cclibs"
+
+if test "$crossmode" = cross-cc; then
+   i=`cat ./counter`
+   $cc -o tst"$i" $* $cclibs 2> "$stream" || exit 100
+   echo "$key"'%%#%%'tst"$i" >> ./map_runtest
+   i=`expr $i + 1`
+   echo "$i" > ./counter
+   if test "$*" = sizes.c; then
+       echo "4 4 4 2"
+   fi
+   if test `expr "$*" : '.*tclversion.c'` -ne 0; then
+       echo "8.5"
+   fi
+   exit 0
+fi
+if test "$crossmode" = cross-run; then
+   tst=`awk -v ccargs="$key" 'BEGIN {FS="%%#%%"} $1 == ccargs {print $2}' ./map_runtest`
+   exec ./"$tst"
+fi
+
+$cc -o tst $* $cclibs 2> "$stream" || exit 100
 exec ./tst
diff -r -U 1 ocaml-4.00.0-orig/config/auto-aux/tryassemble ocaml-4.00.0-cross/config/auto-aux/tryassemble
--- ocaml-4.00.0-orig/config/auto-aux/tryassemble
+++ ocaml-4.00.0-cross/config/auto-aux/tryassemble
@@ -1,8 +1,16 @@
 #!/bin/sh
+
+. ./keyval.sh
+
+key="$aspp $*"
+getValueExit "$key"
+
 if test "$verbose" = yes; then
 echo "tryassemble: $aspp -o tst $*" >&2
-$aspp -o tst $* || exit 100
+`$aspp -o tst $* || exit 100`
 else
-$aspp -o tst $* 2> /dev/null || exit 100
+`$aspp -o tst $* 2> /dev/null || exit 100`
 fi
+res=$?
+setValue "$key" "$res"

@@ -11,7 +19,14 @@
 if test "$verbose" = yes; then
+key="$as $*"
+getValueExit "$key"
 echo "tryassemble: $as -o tst $*" >&2
-$as -o tst $* || exit 100
+`$as -o tst $* || exit 100`
 else
-$as -o tst $* 2> /dev/null || exit 100
+`$as -o tst $* 2> /dev/null || exit 100`
 fi
+res=$?
+setValue "$key" "$res"
+exit $res
+else
+exit $res
 fi
diff -r -U 1 ocaml-4.00.0-orig/config/auto-aux/trycompile ocaml-4.00.0-cross/config/auto-aux/trycompile
--- ocaml-4.00.0-orig/config/auto-aux/trycompile
+++ ocaml-4.00.0-cross/config/auto-aux/trycompile
@@ -15,7 +15,15 @@

+. ./keyval.sh
+
+key="$cc $* $cclibs"
+getValueExit "$key"
+
 if test "$verbose" = yes; then
 echo "trycompile: $cc -o tst $* $cclibs" >&2
-$cc -o tst $* $cclibs || exit 100
+`$cc -o tst $* $cclibs || exit 100`
 else
-$cc -o tst $* $cclibs 2> /dev/null || exit 100
+`$cc -o tst $* $cclibs 2> /dev/null || exit 100`
 fi
+res=$?
+setValue "$key" "$res"
+exit $res
diff -r -U 1 ocaml-4.00.0-orig/configure ocaml-4.00.0-cross/configure
--- ocaml-4.00.0-orig/configure
+++ ocaml-4.00.0-cross/configure
@@ -47,2 +47,3 @@
 withcamlp4=camlp4
+crossmode=''

@@ -119,2 +120,4 @@
         withcamlp4="";;
+    -cross|--cross)
+       crossmode="$2"; shift;;
     *) echo "Unknown option \"$1\"." 1>&2; exit 2;;
@@ -158,2 +161,21 @@

+case "$crossmode" in
+   cc)
+       crossmode=cross-cc
+       echo 0 > ./counter
+       rm -f ./map_runtest ./map_hasgot
+       touch ./map_runtest ./map_hasgot;;
+   run)
+       crossmode=cross-run
+       if test ! -e ./map_runtest -o ! -e ./map_hasgot; then
+           echo 'Run with -cross cc first'
+           exit 2
+       fi
+       rm -f ./counter;;
+   none) crossmode=none;;
+   "") crossmode=none ;;
+   *)
+       echo 'Unknown crossmode'>&2
+       exit 2;;
+esac
 # Write options to Makefile
@@ -350,3 +372,3 @@
 cc="$bytecc -O $bytecclinkopts"
-export cc cclibs verbose
+export cc cclibs verbose crossmode

@@ -1647,2 +1669,5 @@

+if test "$crossmode" = cross-run; then
+   rm -f tst* ./map_runtest ./map_hasgot
+fi
 # Print a summary 

configure脚本将获得一个新的-cross选项.当cc是它的参数时,它仅进行编译,而当它是run时,它仅执行已编译的内容.中间结果存储在 config/auto-aux/map_ {hasgot,runtest} 中,主要使用setValuegetValueExit进行检索,两者均在 config/auto-aux/keyval中定义.sh .如果有人向跨工具链数据提供

The configure script gets a new -cross option. When cc is its argument, it only compiles, when it is run, it only executes the compiled stuff. Intermediate results are stored in config/auto-aux/map_{hasgot,runtest}, mostly using setValue and getValueExit for retrieval, both defined in config/auto-aux/keyval.sh. If one supplies the cross toolchain data with

-cc-as-aspp-partialld-libs-dllibs-dldefs

Makefile应该可用.最后,文件keyval.sh的内容不在diff中:

the Makefile should be usable. Finally the file keyval.sh whose content is not in the diff:

getValueExit()
{
if test "$crossmode" = cross-run; then
    res=`awk -v ccargs="$1" 'BEGIN {FS="%%#%%"} $1 == ccargs {print $2; exit}' ./map_hasgot`
    exit "$res"
fi
}

setValue()
{
if test "$crossmode" = cross-cc; then
    echo "$1"'%%#%%'"$2" >> ./map_hasgot
fi
}

如果使用tk,则必须修改 config/auto-aux/runtest 并将0.0替换为其版本号.此外,如果将solaris用作目标计算机或主机,则可能需要修改文件 config/auto-aux/solaris-ld .

If tk is used, one must modify config/auto-aux/runtest and replace 0.0 with its version number. Further, it may be necessary to modify the file config/auto-aux/solaris-ld if solaris is used as target or host machine.

这篇关于构建OCaml交叉编译器-配置零件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆