【问题标题】:Error in Makefile calling sed with comment characterMakefile 使用注释字符调用 sed 时出错
【发布时间】:2015-06-30 21:24:03
【问题描述】:

我正在尝试构建lstrip,这是一个用于压缩 Lua 源代码的 Lua 实用程序。我正在尝试在 OS X v10.10.3 上为 Lua 5.1.3 构建。

我已经下载并解压了 Lua 5.1.3 源代码并修改了 lstrip 的 Makefile 以指向该目录。但是,当我运行 make 时,我得到了以下输出:

cc -I/usr/local/src/lua-5.1.3/src -I/usr/local/src/lua-5.1.3/src -O2 -Wall -Wextra -O2    -c -o lstrip.o lstrip.c
lstrip.c:33:14: warning: unused parameter 'argc' [-Wunused-parameter]
int main(int argc, char* argv[])
             ^
1 warning generated.
sed '/void luaX_next/i#include "proxy.c"' /usr/local/src/lua-5.1.3/src/llex.c > llex.c
sed: 1: "/void luaX_next/i#inclu ...": command i expects \ followed by text
make: *** [llex.c] Error 1

这是相关的 Makefile 命令的样子:

llex.c:
    sed '/void luaX_next/i#include "proxy.c"' $(LUASRC)/$@ > $@

认为这是因为 sed 命令中的 # 被视为实际注释,但我不确定。

如何修复 Makefile 或手动运行步骤以构建 lstrip


Makefile 的完整副本如下,以防万一:

# makefile for lstrip

# change these to reflect your Lua installation (Lua 5.1!)
LUA= /usr/local/src/lua-5.1.3
LUAINC= $(LUA)/src
LUALIB= $(LUA)/src
LUASRC= $(LUA)/src

# no need to change anything below here
CFLAGS= $(INCS) $(WARN) -O2 $G
WARN= -O2 -Wall -Wextra

INCS= -I$(LUAINC) -I$(LUASRC)
LIBS= -L$(LUALIB) -llua -lm

MYNAME= lstrip
MYLIB= $(MYNAME)
T= $(MYNAME)
OBJS= $(MYNAME).o llex.o
TEST= test.lua

all:    test

test:   $T
    $T $(TEST)

$T: $(OBJS)
    $(CC) -o $@ $(OBJS) $(LIBS)

llex.c:
    sed '/void luaX_next/i#include "proxy.c"' $(LUASRC)/$@ > $@

llex.o: proxy.c

clean:
    -rm -f $(OBJS) core core.* a.out $(MYNAME)

# eof

手工解决方案:

  1. cp /usr/local/src/lua-5.1.3/src/llex.c .
  2. 手动编辑 llex.c 以在以 void luaX_next 开头的行之前添加行 #include "proxy.c"(我是第 446 行)。
  3. 现在运行make,将会成功。

【问题讨论】:

  • 对此我很抱歉。它在 Linux 中工作,但在 Mac OS X 中不工作。我会尽快修复它。感谢您的报告。

标签: sed lua makefile


【解决方案1】:

您可以在 sed 手册中找到答案,它在 Makefile 行中

llex.c:
    sed '/void luaX_next/i#include "proxy.c"' $(LUASRC)/$@ > $@

这里发生了一些变量扩展: $(LUASRC) 扩展为上面设置的变量 -> $(LUA)/src。根据需要递归。 $@ 替换为当前目标 (llex.c)

所以这个食谱说: 为了获得目标llex.c(稍后将通过其他配方处理),将流编辑命令应用于文件$LUASRC/llex.c并将其写入llex.c。

流编辑命令是:查找文本“void luaX_next”,在打印之前,插入行“#include “proxy.c”。 问题是,执行此操作的命令不是“i”而是“i\(newline)”,这与 Makefile 的配方必须位于单行的要求相冲突。

我怀疑为了修复您的 Makefile,您需要使用与 sed 不同的命令; awk 可以满足要求,尽管它有点复杂。

【讨论】:

  • 有趣。未经验证,我无法对此 +1;此外,如果这是问题所在,我会感到惊讶,因为我确信我过去能够成功构建 lstrip,而且我不认为(经验丰富的编程老手)lhf 犯了一个错误防止它编译。这个计划已经存在了将近 9 年。你所描述的听起来好像永远不会奏效。我怀疑这是真的。我怀疑这是与最近的 OS X 实用程序更改有关的问题。
  • 啊!但是,您对 sed 命令的英文解码允许我自己手动执行它,并且此时程序已编译。仅此一项就值得+1,也许还值得接受。 :)
  • @Phrogz:有一个 GNU 扩展允许您省略第一个反斜杠换行符组合。请参阅here(它记录在a 命令下)。
【解决方案2】:

此行适用于 Mac OS X 和 Linux:

sed '/void luaX_next/{h;s/.*/#include "proxy.c"/;p;g;}' $(LUASRC)/$@ > $@

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2017-10-20
  • 1970-01-01
相关资源
最近更新 更多