2015-06-30 33 views
1

我正在嘗試構建lstrip,一個用於壓縮Lua源代碼的Lua實用程序。我試圖在OS X v10.10.3上爲Lua 5.1.3構建。Makefile調用sed與註釋字符錯誤

我已經下載並提取了Lua 5.1.3源代碼並修改了Makefile文件lstrip指向這個目錄。然而,當我運行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)/[email protected] > [email protected] 

認爲這是因爲在該# 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 [email protected] $(OBJS) $(LIBS) 

llex.c: 
    sed '/void luaX_next/i#include "proxy.c"' $(LUASRC)/[email protected] > [email protected] 

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添加行#include "proxy.c"void luaX_next開頭的行(對我而言是446行)。
  3. 現在運行make,這將成功。
+1

我感到很抱歉。它可以在Linux中使用,但不能在Mac OS X中使用。我會盡快修復它。感謝您的報告。 – lhf

回答

1

這條線工作在Mac OS X和Linux中:

sed '/void luaX_next/{h;s/.*/#include "proxy.c"/;p;g;}' $(LUASRC)/[email protected] > [email protected] 
+0

我想知道這是否可以縮短:http://stackoverflow.com/q/31151156/107090。 – lhf

+0

你現在在那裏工作(因爲我懷疑你知道)。謝謝! – Phrogz

2

您可以找到sed的手冊中的答案,這是在Makefile線

llex.c: 
    sed '/void luaX_next/i#include "proxy.c"' $(LUASRC)/[email protected] > [email protected] 

這裏有些變量發生膨脹: $(LUASRC)擴展到上面設置的變量 - > $(LUA)/ src。根據需要緩步。 $ @被替換爲當前目標(llex.c)

所以這個配方表示: 爲了獲得目標llex.c(這將在後面通過其他的配方處理過的),應用流編輯命令文件$ LUASRC/llex.c並將其寫入llex.c.

流編輯命令是:查找文本「void luaX_next」,打印之前,插入行「#include」proxy.c「」。 問題是,執行此操作的命令不是「我」,而是「我\(換行符)」,這與Makefiles的要求相沖突,即食譜必須位於一行中。

我懷疑爲了修復你的Makefile,你需要使用與sed不同的命令;雖然它有點複雜,但awk可以適應賬單。

+0

有趣。如果沒有驗證,我無法對此進行+1。此外,如果這是問題,我會感到很驚訝,因爲我確信我能夠成功構建'lstrip',而且我並不認爲(經驗豐富的編程老手)會犯一個錯誤,防止編譯。這個計劃已經有將近9年了。你所描述的聽起來像是永遠不會奏效的;我懷疑這是真的。我懷疑這是一個與最近OS X實用程序更改有關的問題。 – Phrogz

+0

啊!但是,您對sed命令的英文解碼允許我自己手動執行,然後編譯程序。僅此一項就值得+1,也許是接受。 :) – Phrogz

+2

@Progro:有一個GNU擴展,允許你省略第一個反斜槓 - 換行符組合。見[這裏](http://www.gnu.org/software/sed/manual/sed.html#index-Text_002-appending-129)(它在'a'命令下記錄)。 – siffiejoe