如何从crosstool-ng工具链名称中删除供应商名称

时间:2016-12-24 20:12:36

标签: linux

如何配置crosstool-ng以从生成的工具链名称中删除供应商名称。

例如,创建一个交叉工具链而不指定供应商部件会导致以下命名输出

  

臂未知-Linux的gnueabihf-G ++

如果我提供了一个供应商,例如“linaro”,那么我会有一个输出,如

  

臂Linaro的-Linux的gnueabihf-G ++

我想要的是让crosstool-ng输出如下名称

  

臂-Linux的gnueabihf-G ++

我知道你可以在menuconfig中使用“Tuple's sed transform”和“Tuple's alias”这些设施,但这些只能创建指向arm-unknown-gnueabihf-g ++等的符号链接。

我有一个工具链,附带我正在玩的电路板,这些工具链的供应商部分被省略了。所以我的问题是“他们如何做到这一点?”

1 个答案:

答案 0 :(得分:4)

即使文档声明:

  

CT_TARGET_VENDOR:[...]可以设置为空,从目标元组中删除供应商字符串。

(见http://crosstool-ng.github.io/docs/configuration/

目前的行为是回归到未知的'如果没有给出CT_TARGET_VENDOR的值。

这种情况在2011年的crosstool-ng邮件列表中进行了讨论,并且提供了一个可以帮助您的解决方案。

补丁的想法是:

  

[...]提供假冒的供应商和   然后把它剥掉。

在crosstool-ng源的脚本/函数中。

请参阅:https://sourceware.org/ml/crossgcc/2011-10/msg00047.html

diff -r a31d097e28cd -r 5b1330e7264a scripts/functions
--- a/scripts/functions Wed Oct 19 15:27:32 2011 +1300
+++ b/scripts/functions Wed Oct 19 16:23:36 2011 +1300
@@ -944,6 +944,20 @@
     fi
 }

+# Computes the target tuple from the configuration and the supplied
+# vendor string
+CT_BuildOneTargetTuple() {
+    local vendor="${1}"
+    local target
+
+    target="${CT_TARGET_ARCH}"
+    target="${target}${vendor:+-${vendor}}"
+    target="${target}${CT_TARGET_KERNEL:+-${CT_TARGET_KERNEL}}"
+    target="${target}${CT_TARGET_SYS:+-${CT_TARGET_SYS}}"
+
+    echo "${target}"
+}
+
 # Compute the target tuple from what is provided by the user
 # Usage: CT_DoBuildTargetTuple
 # In fact this function takes the environment variables to build the target
@@ -994,10 +1008,7 @@
     CT_DoKernelTupleValues

     # Finish the target tuple construction
-    CT_TARGET="${CT_TARGET_ARCH}"
-    CT_TARGET="${CT_TARGET}${CT_TARGET_VENDOR:+-${CT_TARGET_VENDOR}}"
-    CT_TARGET="${CT_TARGET}${CT_TARGET_KERNEL:+-${CT_TARGET_KERNEL}}"
-    CT_TARGET="${CT_TARGET}${CT_TARGET_SYS:+-${CT_TARGET_SYS}}"
+    CT_TARGET=$(CT_BuildOneTargetTuple "${CT_TARGET_VENDOR}")

     # Sanity checks
     __sed_alias=""
@@ -1012,7 +1023,14 @@
     esac

     # Canonicalise it
-    CT_TARGET=$(CT_DoConfigSub "${CT_TARGET}")
+    if [ -n "${CT_TARGET_VENDOR}" ]; then
+        CT_TARGET=$(CT_DoConfigSub "${CT_TARGET}")
+    else
+        # Canonicalise with a fake vendor string then strip it out
+        local target=$(CT_BuildOneTargetTuple "CT_INVALID")
+        CT_TARGET=$(CT_DoConfigSub "${target}" |sed -r -s s:CT_INVALID-::)
+    fi
+
     # Prepare the target CFLAGS
     CT_ARCH_TARGET_CFLAGS="${CT_ARCH_TARGET_CFLAGS} ${CT_ARCH_ENDIAN_CFLAG}"
     CT_ARCH_TARGET_CFLAGS="${CT_ARCH_TARGET_CFLAGS} ${CT_ARCH_ARCH_CFLAG}"