1. 程式人生 > >makefile 裡的 eval 函式

makefile 裡的 eval 函式

函式原型 $(eval text)

它的意思是 text 的內容將作為makefile的一部分而被make解析和執行。

比如這樣一個makefile:

$(eval xd:xd.c a.c)

將會產生一個這樣的編譯

cc   xd.c a.c -o xd

這樣一個makefile:

define MA
aa:aa.c
 gcc  -g -o aa aa.c
endef 

$(eval $(call MA) )

會產生一個這樣的編譯:

gcc -g -o aa aa.c

這樣的makefile:

OBJ=a.o b.o c.o d.o main.o

define MA
main:$(OBJ)
 gcc  -g -o main $$(OBJ)
endef 

$(eval $(call MA) )

會產生這樣的編譯過程:

cc -c -o a.o a.c

cc -c -o b.o b.c

cc -c -o c.o c.c

g++ -c -o d.o d.cpp

cc -c -o main.o main.c

gcc -g -o main a.o b.o c.o d.o main.o

請注意到$$(OBJ) ,因為make要把這個作為makefile的一行,要讓這個地方出現$,就要用兩個$,因為兩個$,make才把把作為$字元。

Gnu make manual裡面舉了一個例子:

PROGRAMS = server client
server_OBJS = server.o server_priv.o server_access.o
server_LIBS = priv protocol
client_OBJS = client.o client_api.o client_mem.o
client_LIBS = protocol
# Everything after this is generic
.PHONY: all
all: $(PROGRAMS)
define PROGRAM_template
$(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
ALL_OBJS += $$($(1)_OBJS)
endef
$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
$(PROGRAMS):
$(LINK.o) $^ $(LDLIBS) -o

[email protected]
clean:
rm -f $(ALL_OBJS) $(PROGRAMS)

首先我認為$(PROGRAMS):
$(LINK.o) $^ $(LDLIBS) -o [email protected]
這一句好像是多餘的,本來在foreach 裡要定義server和client的依賴物件,然後套用預設的規則來編譯目標,我在cygwin+make3.8 下不把這個註釋掉會編譯不過。

註釋掉之後可以很好的產生 server.exe 和 client.exe。

我的理解是這樣

foreach 從 PROGRAMS 依次取出 server和client

對於server 在call之後會得到:

server:$$(server_OBJS) $$(server_LIBS:%=-l%)

經過eval之後將相當於makefile裡有這麼一行:

server:$(server_OBJS) $(server_LIBS:%=-l%)

make執行時按照變數替換原則相當於這麼一行:

server:server.o server_priv.o server_access.o -lpriv -lprotocol

所以make就會先編譯這些.o檔案,然後priv 和protocol 連線成server.exe

在這個makefile的基礎上我寫了一些簡單的c檔案來測試和學習。

相關推薦

makefile eval 函式

函式原型 $(eval text) 它的意思是 text 的內容將作為makefile的一部分而被make解析和執行。 比如這樣一個makefile: $(eval xd:xd.c a.c) 將會產生一個這樣的編譯 cc   xd.c a.c -o xd 這樣一個make

Makefile中的eval()函式用法

在一個論壇上找到了一個簡單易懂的解釋方法,我就不自己解釋了。 參考連結為: 點我 其實他的作用有點相當於c++中的模板,就是生成一個段makefile語句,然後還要被執行。 在參考連結中的示例程式,一開始我覺得這樣寫能執行嗎?直到我真正在自己的電腦上編輯完

php eval 函式

http://php.net/eval //獲取user_id 內的id的值 // $user['user_id'] = ' "id" => "123454321" '; eval('$user_id_arr = array(' .$user['user_id']. ');')

Python_從零開始學習_(46) eval 函式

eval() 函式十分強大 ---- 將字串 當成 有效的表示式 來求職 並 返回計算結果 # 基本的數學計算 print(eval("1 + 1")) # 2 # 字串重複 print(eval("'*' * 5")) # ***** # 將字串轉換成列表 print(eval("[1

python中eval函式作用

eval函式就是實現list、dict、tuple與str之間的轉化str函式把list,dict,tuple轉為為字串一、字串轉換成列表 a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" print(type(a)) b = eval(a)print(type(

js函式

js中的函式 函式是一段可以重複呼叫的程式碼塊,也是一個物件,為了解決程式碼重複的問題。 函式的5種宣告方式 1.具名函式 function f(x,y){ return x+y }   這裡function的作用相當於var,var用來宣告一個變數,而func

Opencv基礎: Mat類setTo函式詳解

https://blog.csdn.net/oMoDao1/article/details/80324360 函式原型:   /** @brief Sets all or some of the array elements to the specified value. &n

make之makefile 七 使用函式

在Makefile中能夠使用函式來處理變數,從而讓我們的命令或是規則更為的靈活和具有智慧。make所支援的函式也不算非常多,只是已經足夠我們的操作了。函式呼叫後,函式的返回值能夠當做變數來使用。 一、函式的呼叫語法 函式呼叫,非常像變數的使用,也是以“$”來標識的,其語法例如以下:

C++宣告函式原型的作用

#include <iostream> #include <cmath> using namespace std; // 這個宣告函式原型的程式碼必須有, 如果沒有的話會報use of undeclared identifier 'simon' 這個異常 void simo

vue如何在websocket方法內獲取data的資料和method函式

在實踐中,會發現在websocket的onmessage方法內處理資料時,從websocket得到的資料無法在其他函式內呼叫,其他變數和函式也無法在websocket裡使用,這是因為資料的作用域不同使得無法訪問。 我們可以進行如下修改 func() {

eval()函式 python eval() Python:eval的妙用和濫用

eval()函式十分強大,官方demo解釋為:將字串str當成有效的表示式來求值並返回計算結果。 so,結合math當成一個計算器很好用。 其他用法,可以把list,tuple,dict和string相互轉化。 見下例子: a = "[[1,2], [3,4], [5,6], [7,8], [9

Python中eval函式的作用

eval函式就是實現list、dict、tuple與str之間的轉化 str函式把list,dict,tuple轉為為字串 # 字串轉換成列表 a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" print(type(a)) b = eval(a) print(b)

Makefile中常用函式

Makefile常用函式總結 1、realpath  返回一個絕對路徑 例:ROOT  = $(realpath ./)  返回當前路徑的絕對地址,賦值給ROOT 2、wildcard 萬用字元函式,類似於linux中的 “*” 命令格式: $(

python中的EVAL函式的定義和用法!

https://blog.csdn.net/weixin_42859280/article/details/84673079 Python 內建函式 Python 內建函式 描述: eval() 函式用來執行一個字串表示式,並返回表示式的值。 以下是 eval() 方法的語法:

python eval 函式

eval()函式用處 在工作中我們經常會用到eval(),我總結了eval一下幾種用處: 功能 :eval函式可以將一個字串當成一個有效的表示式並返回結果 引數:有一下引數     source:一個Python表示式或函式compile()返回的程式碼物件

python-eval函式

一、基本用法 eval(expression, globals=None, locals=None) eval 最直接的作用就是把字串當成有效的表示式來求值並返回計算結果。 如下: a = 1 b

makefile-變數與 函式的綜合示例

變數與函式的綜合示例 1.專案需求 自動生成target資料夾存放可執行檔案 自動生成objs資料夾存放編譯生成的目標檔案(*.o) 支援除錯版本的編譯選項 考慮程式碼的擴充套件性 2. 關鍵語法 $(wildcard _pattern) 獲取當前工作

bytes型別轉字串 字典字串之間的轉換 eval 函式

一、bytes 型別 轉 字串:     str = bytes資料.decode() 二、字串型別的字典轉成字典     先匯入json模組     import json     dict = json.loads(str) 三、字典轉成字串型別     s

Vue學習日誌第二天 v-model 資料雙向繫結 eval函式用法

<div id="app"> <p> {{msg}}</p> <p><input type="text" v-b

【6】基礎知識類---eval函式及其安全性問題

eval()函式及其安全性問題 1.主要用途 a. 型別轉換:字串轉為列表、字典、元組 b. 做計算器使用 # 舉例1:型別轉換:字串轉為列表、字典、元組 mylist = '[1,2,3,4,[5,6,7,8,9]]' mydict = "{'a':12