2010-07-08 63 views
8

我在寫一個通用的生成文件來構建靜態庫。它似乎運作良好,到目前爲止,除了排隊叫SED:在makefile中使用sed;如何逃避變量?

# Generic makefile to build a static library 
ARCH  = linux 

CFLAGS  = -O3 -Wall 

SOURCES = src 
BUILD_DIR = build/$(ARCH) 
TARGET  = $(BUILD_DIR)/libz.a 

CFILES  = $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.c)) 
OBJECTS = $(addprefix $(BUILD_DIR)/,$(CFILES:.c=.o)) 

# Pull in the dependencies if they exist 
# http://scottmcpeak.com/autodepend/autodepend.html 
-include $(OBJECTS:.o=.dep) 

default: create-dirs $(TARGET) 

$(TARGET): $(OBJECTS) 
    $(AR) -rc $(TARGET) $^ 

$(BUILD_DIR)/%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 
    $(CC) -M $(CFLAGS) $*.c > $(BUILD_DIR)/$*.tmp 
    sed s/.*:/$(BUILD_DIR)\\/$*.o:/ $(BUILD_DIR)/$*.tmp > $(BUILD_DIR)/$*.dep 
    @rm $(BUILD_DIR)/$*.tmp 

.PHONY: create-dirs 
create-dirs: 
    @for p in $(SOURCES); do mkdir -p $(BUILD_DIR)/$$p; done 

.PHONY: clean 
clean: 
    rm -fr $(BUILD_DIR) 

sed的使用與其中對象實際上是完整路徑替換目標文件的路徑/名稱。例如在本例中,'src/foo.o:'替換爲'build/linux/src/foo.o:'。 $(BUILD_DIR)和$ *替換字符串在展開時都包含正斜槓 - 我如何將它們傳遞給sed?

注意:這可能已經在這裏回答過了,但我至今無法將這些答案應用於我的具體問題!

回答

13
  • 你可以在sed中使用除正斜槓之外的任何東西作爲分隔符。例如。 sed s~foo~bar~g
  • 您可以使用雙引號"(至少在外殼)和變量仍然會擴大:echo "Hello $PLANET"
+2

我們該如何做一些像'sed s〜$ {PLANET}〜bar〜'的東西?由於某些原因,不能在Makefile中擴展 – 2015-09-12 01:38:06

5

如果你想擴展到一個文件的路徑,您使用

sed -i "s/TO_REPLACE/$(subst, /,\/,${PATH_VARIABLE})/g" filename.txt 

如果您的變量PATH_VARIABLE樣子的/ opt /路徑/用戶/家庭/等 它現在將膨脹到:

\ /opt\ /path\ /user\ /home\ /etc 

這應該允許sed正確插入'/'。

-Matt

+0

這很有幫助,謝謝! – 2016-08-09 20:34:17

+1

我認爲這裏有一個語法錯誤。而不是......'$(subst,/,\ /,$ {PATH_VARIABLE})',我認爲它應該是'$(subst /,\ /,$ {PATH_VARIABLE})'。也就是說,在「subst」後面有一個額外的逗號。 – rdr 2017-01-17 15:45:19

+0

假設'PATH_VARIABLE'是一個Make變量,它應該是'$(subst /,\ /,$(PATH_VARIABLE))'嗎? – CMCDragonkai 2017-01-21 11:42:02