在makefile中使用sed;如何转义变量?

在makefile中使用sed;如何转义变量?,makefile,sed,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,$(SOU

我正在编写一个通用的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)
#用于构建静态库的通用makefile
ARCH=linux
CFLAGS=-O3-壁
来源=src
BUILD_DIR=BUILD/$(ARCH)
TARGET=$(BUILD_DIR)/libz.a
CFILES=$(foreach dir,$(SOURCES),$(通配符$(dir)/*.c))
对象=$(addprefix$(BUILD_DIR)/,$(c文件:.c=.o))
#拉入依赖项(如果存在)
# http://scottmcpeak.com/autodepend/autodepend.html
-包括$(对象:.o=.dep)
默认值:创建目录$(目标)
$(目标):$(对象)
$(AR)-rc$(目标)$^
$(构建目录)/%.o:%.c
$(CC)$(CFLAGS)-c$<-o$@
$(CC)-M$(CFLAGS)$*.c>$(BUILD\u DIR)/$*.tmp
sed s/*:/$(BUILD\u DIR)\\/$*.o:/$(BUILD\u DIR)/$*.tmp>$(BUILD\u DIR)/$*.dep
@rm$(构建目录)/$*.tmp
.伪造:创建目录
创建目录:
@以美元表示的p(来源);do mkdir-p$(BUILD_DIR)/$$p;完成
.假冒:干净
清洁:
rm-fr$(构建目录)
sed用于将对象文件的路径/名称替换为对象实际所在位置的完整路径。e、 在本例中,“src/foo.o:”替换为“build/linux/src/foo.o:”。 替换字符串中的$(BUILD_DIR)和$*在展开时都包含正斜杠-如何将它们传递给sed

注意:这可能已经在这里得到了回答,但我到目前为止无法将这些答案应用于我的具体问题

  • 您可以在sed中使用除正斜杠之外的任何东西作为分隔符。例如
    sed s~foo~bar~g
  • 您可以使用双引号
    (至少在shell中),变量仍将展开:
    echo“Hello$PLANET”

如果要将路径扩展到所使用的文件中

sed -i "s/TO_REPLACE/$(subst, /,\/,${PATH_VARIABLE})/g" filename.txt
如果您的变量PATH_变量看起来像/opt/PATH/user/home/etc 它现在会膨胀到:

\ /opt\ /path\ /user\ /home\ /etc 
这将允许sed正确插入“/”


-Matt

我们如何做像
sed s~${PLANET}~bar~
?出于某种原因,它在Makefile中不会展开,直到您可以使用任何东西作为分隔符。谢谢!这不适用于以分隔符开头的sed命令。我认为这里有语法错误。而不是…
$(subst,/,\/,${PATH\u VARIABLE})
,我认为应该是
$(subst/,\/,${PATH\u VARIABLE})
。也就是说,在“subst”之后有一个额外的逗号。应该是
$(subst/,\/,$(PATH\u VARIABLE))
假设
PATH\u VARIABLE
是Make变量吗?