我正在使用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需要换行符分隔的条目)。
$(LIST:TCJ=\n)
。 $(LIST:TCJ=@(\n))
也不起作用。如果我能这样做,那么生成的文件肯定是正确的。答案 0 :(得分: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 =&#34;&#34;开始然后在引号和点击标签之间放置克拉。在上面它实际上是4个空格是错误的,但希望你能得到这个想法。另一个有用的是:
dollar = "$" ;
最后一个是有用的,因为$通常用于指定变量,因此当您实际想要指定美元文字时,使用美元变量很有用。对于它的价值,我使用的Jambase(我正在使用的JamPlus附带的Jambase)有:
SPACE = " " ;
TAB = " " ;
NEWLINE = "
" ;
第28行......
答案 1 :(得分:0)
我放弃了尝试在字符串连接中使用转义换行符和其他特定于语言的字符。也许有一种很棒的方法可以做到这一点,这太难以发现了。
使用包含多个临时文件的多步shell命令。
对于jamplus(以及其他可能的变种),花括号之间的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 one liner进入_RESP2
。并且链接按计划进行,jamplus清理中间文件。
我无法使用:;\n
这样的字符执行此操作,但#
只要没有相邻的空格就可以工作。不完全满意,但继续前进。