在makefile中使用sed; 如何逃避变量?

x-x*_*x-x 9 makefile 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 $@ 
    $(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)
Run Code Online (Sandbox Code Playgroud)

sed用于将对象文件的路径/名称替换为对象实际所在的完整路径.例如'src/foo.o:'在本例中被'build/linux/src/foo.o:'替换.替换字符串中的$(BUILD_DIR)和$*在扩展时都包含正斜杠 - 如何将它们传递给sed?

注意:这可能之前已在此处得到解答,但我到目前为止无法将这些答案应用于我的具体问题!

Sjo*_*erd 13

  • 你可以在sed中使用除正斜杠之外的任何东西作为分隔符.例如sed s~foo~bar~g
  • 您可以使用双引号"(至少在shell中),并且仍然会扩展变量:echo "Hello $PLANET"

  • 我们怎么能做'sed s~ $ {PLANET} ~bar~`这样的事情?由于某些原因,在Makefile中没有扩展 (2认同)

Mat*_*att 5

如果您希望路径扩展为您使用的文件

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

如果您的变量PATH_VARIABLE看起来像/ opt/path/user/home/etc,它现在将膨胀为:

\ /opt\ /path\ /user\ /home\ /etc 
Run Code Online (Sandbox Code Playgroud)

这应该允许sed正确插入'/'.

-Matt