2016-05-15 74 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