我正在编写一个通用的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 $@
$(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?
注意:这可能之前已在此处得到解答,但我目前无法将这些答案应用于我的具体问题!
答案 0 :(得分:13)
sed s~foo~bar~g
"
(至少在shell中),变量仍会展开:echo "Hello $PLANET"
答案 1 :(得分:5)
如果您希望路径扩展为文件,请使用
sed -i "s/TO_REPLACE/$(subst, /,\/,${PATH_VARIABLE})/g" filename.txt
如果您的变量PATH_VARIABLE看起来像/ opt / path / user / home / etc. 它现在会膨胀到:
\ /opt\ /path\ /user\ /home\ /etc
这应该允许sed插入&#39; /&#39;正确。
-Matt