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!
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 –