sed - 使用 sed 改变 Makefile 变量

标签 sed makefile

我正在尝试使用 sed 更改 Makefile 变量。我写了一个小的 Makefile 来说明我想做什么。 CINCS 变量最终将附加到 CFLAGS 变量。 CSINCS 变量应该保存所有包含文件的路径,前面没有“-I”。

#
SHELL = /bin/sh

SRCS = /usr/local/src/jpeg/jpeg-9b
CINCS = -I/usr/local/src/jpeg/jpeg-9b
CSINCS = $(CINCS) | sed -e "s/-I//g"

check:
@echo 1. $(SRCS)
find $(SRCS) -name "*.c" -print > cscope.files
@echo 2. $(CSINCS)
find '$(CSINCS) -name" "*.h' -print >> cscope.files
cscope -k -b
cat cscope.files | xargs ctags -u
#

我正在尝试删除所有包含路径前面的“-I”。执行时:

$ make -f test check
1. /usr/local/src/jpeg/jpeg-9b
find /usr/local/src/jpeg/jpeg-9b -name "*.c" -print > cscope.files
2. /usr/local/src/jpeg/jpeg-9b
find '-I/usr/local/src/jpeg/jpeg-9b | sed -e "s/-I//g" -name" "*.h'   -print >> cscope.files
find: unknown predicate `-I/usr/local/src/jpeg/jpeg-9b | sed -e "s/-I//g" -name" "*.h'
test:8: recipe for target 'check' failed
make: *** [check] Error 1

在位置“2”处,CSINCS 变量看起来是正确的。但是用“查找命令”进行扩展。这就是问题所在。

我知道我可以在 cscope 命令中使用 CINCS 变量:

cscope -I $(CINCS)

但我也想为 ctags 文件使用 cscope.files。我可以只生成一个单独的 CSINCS 变量并始终保持 CINCS 和 CSINCS 同步。只是好奇发生了什么。

最佳答案

你还没有告诉 make 将 CSINCS 的值作为 shell 脚本来执行,你需要像

CSINCS := $(shell echo $(CINCS) | sed -e "s/-I//g")

或者如果你有 make 4.0 或者更新

CSINCS != echo $(CINCS) | sed -e "s/-I//g"

尽管对于这么简单的事情您不需要使用 sed 或 shell

CSINCS := $(subst -I,,$(CINCS))

关于sed - 使用 sed 改变 Makefile 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40479175/

相关文章:

c - 如何使用子目录中的 Makefile 进行编译?

regex - 使用 [ :word:] gives: Invalid character class name 删除单词

bash - 如何找到每行输入的唯一字符?

linux - 如何阻止换行符转义旧的 gnu sed 命令

linux - sed 和转义 bash 变量的奥德赛

c - kbuild 外部模块问题

c++ - MakeFile 只编译一个文件

c - makefile 是否可以自动将所有构建对象移动到 dist 目录?

c++ - 尝试运行 OpenCV 代码时出现 “no rule to make target” 错误

linux - 如何以优化的方式用多行替换exec文件中的字符串