多行bash脚本和make file指令中评估的bash变量的串联



以前我有一个指令pictDBM,它是这样的:

    all: pictDBM
    pictDBM : db_list.o db_delete.o db_utils.o error.o pictDBM.o 
          db_create.o dedup.o image_content.o pictDBM_tools.o db_read.o
                      gcc $(CFLAGS) -o $@ $^ $(LDLIBS)

这部分效果很好。

然后我想我希望能够添加一个从命令行给出的可选参数。然后,该选项将进入我在pictDBM子部分中执行的gcc命令行。

我通过使用我在代码中声明的OPTS=""变量(在任何指令之前的makefile的开头)来解决这个问题。我的目标是这样称呼make:make all OPT='-g'

然后我声明了一个变量base=gcc $(CFLAGS) -o $@ $^ $(LDLIBS)

我的部分解决方案是使用if-else构造将我的选项变量${OPT}包含或不包含在我在pictDBM中执行的${base} gcc命令中。

我红了这个主题,这有助于构建我的多行if else结构:

pictDBM : db_list.o db_delete.o db_utils.o error.o pictDBM.o 
    db_create.o dedup.o image_content.o pictDBM_tools.o db_read.o
        if [ ! -z "$$OPT" ];    
        then    
                echo "$$base $$OPT" ;  #for debugging purposes
                eval "$$base $$OPT"  ;   
        else    
                eval "$$base" ;  
        fi ;

当我简单地执行make all时,make似乎一切都正常,并且输出程序运行良好。

但当我执行make all OPTS='-g'时,我得到以下输出:

 -g
/bin/sh: 1: eval: -g: not found
makefile:16: recipe for target 'pictDBM' failed
make: *** [pictDBM] Error 127

你只能看到回声打印-g,我该怎么解决这个问题?

您不需要条件或eval,只需直接在命令行上指定CFLAGS即可:

make all CFLAGS=-g

并覆盖makefile中的变量:

override CFLAGS += # Your local options
all: pictDBM
pictDBM: db_list.o db_delete.o db_utils.o error.o pictDBM.o 
          db_create.o dedup.o image_content.o pictDBM_tools.o db_read.o
    gcc $(CFLAGS) -o $@ $^ $(LDLIBS)

CFLAGS在这里有点奇怪,但是,您不应该在链接期间传递编译标志。

链接选项可以用LDFLAGS指定;由于pictDBMpictDBM.o为先决条件,并且您已经正确使用了LDLIBS,因此您可以依赖make的隐式链接规则,无需配方。

override LDFLAGS += # Your local options
pictDBM: db_list.o db_delete.o db_utils.o error.o pictDBM.o 
          db_create.o dedup.o image_content.o pictDBM_tools.o db_read.o

关于您的评论,您需要在变量的第一个定义上指定override,否则它将不起作用:

override CFLAGS += $(shell pkg-config vips --cflags) -std=c99 -Wall
override LDLIBS += $(shell pkg-config vips --libs) -lm -lssl -lcrypto
pictDBM: db_list.o db_delete.o db_utils.o error.o pictDBM.o db_create.o dedup.o image_content.o pictDBM_tools.o db_read.o

最新更新