2010-07-08 40 views
8

Tôi đang viết một makefile chung để xây dựng các thư viện tĩnh. Dường như hoạt động tốt cho đến thời điểm này, ngoại trừ dòng gọi là sed:Sử dụng sed trong một makefile; làm thế nào để thoát khỏi các biến?

# 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 được sử dụng để thay thế đường dẫn/tên của tệp đối tượng với đường dẫn đầy đủ của đối tượng thực tế. ví dụ. 'src/foo.o:' được thay thế bằng 'build/linux/src/foo.o:' trong ví dụ này. $ (BUILD_DIR) và $ * trong chuỗi thay thế cả hai đều có dấu gạch chéo về phía trước khi được mở rộng - làm cách nào để chuyển chúng sang sed?

Lưu ý: Điều này có thể đã được trả lời ở đây trước đây, nhưng tôi cho đến nay không thể áp dụng những câu trả lời cho vấn đề cụ thể của tôi!

Trả lời

13
  • Bạn có thể sử dụng bất kỳ thứ gì khác ngoài dấu gạch chéo chuyển tiếp làm dấu phân cách trong sed. Ví dụ. sed s~foo~bar~g
  • Bạn có thể sử dụng dấu ngoặc kép " (ít nhất là trong vỏ), và các biến vẫn sẽ được mở rộng: echo "Hello $PLANET"
+2

Làm cách nào chúng ta có thể làm điều gì đó như 'sed s ~ $ {PLANET} ~ bar ~'? Vì một số lý do không mở rộng trong Makefile –

5

Nếu bạn muốn con đường mở rộng vào một tập tin bạn sử dụng

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

Nếu PATH_VARIABLE biến của bạn trông giống như/opt/path/user/home/etc bây giờ nó sẽ thổi phồng để:

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

Điều này cho phép sed chèn chính xác '/'.

-Matt

+0

Điều này hữu ích, cảm ơn! –

+1

Tôi nghĩ rằng có một lỗi cú pháp ở đây. Thay vì ... '$ (subst, /, \ /, $ {PATH_VARIABLE})', tôi nghĩ nó phải là '$ (subst /, \ /, $ {PATH_VARIABLE})'. Đó là, có thêm một dấu phẩy ở đó sau "subst". – rdr

+0

Nếu nó là '$ (subst /, \ /, $ (PATH_VARIABLE))' giả sử 'PATH_VARIABLE' là một biến Make? – CMCDragonkai

Các vấn đề liên quan