2

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

响应文件是命令行太长的经典答案:jamplus 在手册中指出可以即时生成它们。

手册中的示例如下所示:

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 的链接命令,并从列表中动态生成内容?我正在寻找一种侵入性最小的方法来处理这个问题——理想情况下,直接修改/覆盖工具,而不是在需要链接的地方添加新的间接目标——因为它是我们供应商的代码库,所以需要尽可能少的编辑。
4

2 回答 2

2

您正在寻找的语法是:

newLine = "
" ;

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

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

newLine = "" ;

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

tab = "    " ;

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

dollar = "$" ;

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

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

28号线左右...

于 2016-04-04T09:33:07.450 回答
0
  1. 我放弃了尝试在字符串连接中使用转义换行符和其他特定于语言的字符。也许有一种很棒的方法可以做到这一点,这太棘手了,无法发现。

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

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

因此,代码如下:

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 一行代码完成的_RESP2。并且链接按计划进行,jamplus 清理中间文件。

我不能用像这样的字符来做到这一点:;\n,但#只要它没有相邻的空格就可以工作。不完全满意,但继续前进。

于 2015-01-22T02:14:32.937 回答