【问题标题】:jamplus: link command line too long for osxjamplus:对于 osx,链接命令行太长
【发布时间】:2023-03-28 02:16:01
【问题描述】:

我正在使用 jamplus 构建供应商的跨平台项目。在 osx 上,C 工具的命令行(通过 clang 提供给 ld)太长。

响应文件是对过长命令行的经典解决方案:手册中的 jamplus 声明可以即时生成它们。

example in the manual 看起来像这样:

actions response C++
{
    $(C++) @@(-filelist @($(2)))
}

快到了!如果我特地把 C.Link 命令吹出来,像这样:

actions response C.Link
{
    "$(C.LINK)" $(LINKFLAGS) -o $(<[1]:C) -Wl,-filelist,@($(2:TC)) $(NEEDLIBS:TC) $(LINKLIBS:TC))
}

在我的 jamfile 中,我得到了传递给链接器所需的命令行,但响应文件没有换行符终止,因此链接失败(osx ld 需要换行符分隔的条目)。

  1. 有没有办法扩展加入换行符的 jamplus 列表?我试过使用连接扩展 $(LIST:TCJ=\n) 没有运气。 $(LIST:TCJ=@(\n)) 也不起作用。如果我能做到这一点,那么生成的文件应该是正确的。
  2. 如果不是,我可以使用什么 jamplus 代码来覆盖 clang 的链接命令,并从列表中即时生成内容?我正在寻找一种侵入性最小的方法来处理这个问题——理想情况下,直接修改/覆盖工具,而不是在需要链接的地方添加新的间接目标——因为它是我们供应商的代码库,所以需要尽可能少的编辑。李>

【问题讨论】:

  • 如果有超过 1500 名声望的人可以创建并添加 jamplus 标签,那就太棒了。
  • 添加了 jamplus 标签

标签: macos osx-yosemite jam


【解决方案1】:

您要查找的语法是:

newLine = "
" ;

actions response C.Link
{
    "$(C.LINK)" $(LINKFLAGS) -o $(<[1]:C) -Wl,-filelist,@($(2:TCJ=$(newLine))) $(NEEDLIBS:TC) $(LINKLIBS:TC))
}

为了清楚起见(我不确定 StackOverflow 将如何格式化上述内容),应该通过键入以下内容来定义 newLine 变量:

newLine = "" ;

然后将克拉放在两个引号之间并按回车键。您可以对某些其他字符使用相同的技术,即

tab = "    " ;

同样,以 newLine = "" 开头,然后在引号之间放置克拉并点击制表符。在上面它实际上是 4 个空格,这是错误的,但希望你明白这一点。另一个有用的是:

dollar = "$" ;

最后一个很有用,因为 $ 通常用于指定变量,因此当您实际想要指定美元文字时,使用美元变量很有用。对于它的价值,我正在使用的 Jambase(我正在使用的 JamPlus 附带的那个)有这个:

SPACE = " " ;
TAB = " " ;
NEWLINE = "
" ;

28号线左右……

【讨论】:

  • 我在我的 jamplus jambase 中也看到了 NEWLINE。尽管已经过去一年多,但我很高兴能尝试一下。
  • 我换入了 $(NEWLINE),我可以看到 jamplus 打印出来的响应文件的内容现在已正确分离。你太棒了,史蒂文!这完全杀了我。更新你的答案。
【解决方案2】:
  1. 我放弃了尝试在字符串连接中使用转义换行符和其他特定于语言的字符。也许有一种很棒的方法可以做到这一点,但发现起来太棘手了。

  2. 对多个临时文件使用多步 shell 命令。

对于 jamplus(可能还有其他 jam 变体),花括号之间的 actions response {} 部分成为内联 shell 脚本。并且响应文件语法@(&lt;value&gt;)返回一个可以在shell脚本中分配的文件名,内容设置为&lt;value&gt;

因此,代码如下:

actions response C.Link
{
    _RESP1=@($(2:TCJ=#)#$(NEEDLIBS:TCJ=#)#$(LINKLIBS:TCJ=#))
    _RESP2=@()
    perl -pe "s/[#]/\n/g" < $_RESP1 > $_RESP2
    "$(C.LINK)" $(LINKFLAGS) -o $(<[1]:C) -Wl,-filelist,$_RESP2
}

创建一对临时文件,分配给shell变量名称_RESP1_RESP2。路径 _RESP1 处的文件被分配了扩展序列的内容,并以 # 字符连接。搜索和替换是使用 perl one liner 到_RESP2 完成的。并且链接按计划进行,jamplus 清理中间文件。

我无法使用像 :;\n 这样的字符来执行此操作,但 # 只要没有相邻的空格就可以工作。不完全满意,但继续前进。

【讨论】:

  • 是的,但这会在使用 SubDirs 时影响所有项目的 C.Link 命令,并且可能会破坏其他项目。很高兴知道,我怎样才能将它应用于一个目标。
  • 啊。在此处添加任何空列表(保证分配仅$2)会破坏整个事情。重新思考。
  • 我最终用我选择的解释语言中的临时内联/heredoc 脚本替换了它,并调用了它。它不漂亮,但它现在可以处理我所有的极端情况。
猜你喜欢
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
相关资源
最近更新 更多