2016-05-15 52 views
1

以前我有一个指令pictDBM这是这样的:多行bash脚本和make文件指令评估的bash变量的串联

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 [email protected] $^ $(LDLIBS) 

这部分工作非常出色。

然后我想我能够添加从命令行给出的可选参数。然后这个选项会进入我在pictDBM子部分执行的gcc命令行。

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

然后我宣布我的解决方案的变量base=gcc $(CFLAGS) -o [email protected] $^ $(LDLIBS)

一部分是使用if else结构包括或不是我选择的变量${OPT}${base}gcc命令,我在pictDBM执行。

我红this topic,即帮助建立我的多行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,我怎么能解决这个问题?

回答

2

你不需要条件或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 [email protected] $^ $(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 

RE您的意见,您需要指定一个变量的第一个定义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 
+0

我做你建议做什么我的make文件现在看起来像这样: 'CFLAGS + = -std = c99 -Wall'
'CFLAGS + = $$(pkg-config vips --cflags)'
'LDLIBS + = $$(pkg-config vips --libs)-lm -lssl -lcrypto'
'倍率CFLAGS + ='
'倍率LDFLAGS + ='
'所有:pictDBM'
'pictDBM:db_list.o db_delete.o db_utils.o error.o pictDBM.o db_create.o'
'去重的.o image_content.o pictDBM_tools.o db_read.o'
但是当我做'让所有CFLAGS = -g'
我得到: – Simonlbc

+0

'CC -g -c -o pictDBM.o pictDBM.c 在文件包括从pictDB.h:32:0, from pictDBM.c:11: /usr/local/include/vips/vips.h:85:18:致命错误:glib.h:没有这样的文件或目录 编译终止。 :目标'pictDBM.o'的配方失败 make:*** [pictDBM.o]错误1' 我错过了什么? – Simonlbc

+0

对不起,格式是可怕的。我试图做出最大的投入换行。但通过审判和失败它最终看起来像这样:( – Simonlbc