1. 程式人生 > >Makefile通用編寫規則

Makefile通用編寫規則

#簡單實用的Makefile模板:

objs := a.o b.o

test:$(objs)
    gcc -o test $^

# .a.o.d .b.o.d
dep_files := $(foreach f,$(objs),.$(f).d)
dep_files := $(wildcard $(dep_files))

ifneq ($(dep_files),)
  include $(dep_files)
endif

%.o : %.c 
    gcc -Wp,-MD,[email protected] -c -o [email protected] $<

clean:
    rm *.o test 

#/*關鍵解釋*/	
這裡面用到了一些Makefile函式,首先我們來說一下Makefile函式的格式:
$(函式名 引數,引數,......)
這裡用到了兩個函式,我們分別來說一下:
1、dep_files := $(foreach f,$(objs),.$(f).d)
依次取出objs中的成員,放在f中,然後加上.d字尾,組成一個字串(各個成員以空格分開),返回給dep_files !
2、dep_files := $(wildcard $(dep_files))
展開當前目錄下名字為符合dep_files的檔名,並組成字串返回給dep_files

此外還有一點要說的是:
gcc -Wp,-MD,
[email protected]
-c -o [email protected] $< 1、-Wp,-MD:表示生成依賴檔案,後跟依賴檔案的名字 2、[email protected]:表示規則的目標 $^:所有的依賴 $<:第一個依賴 $?:代表依賴檔案列表中被改變過的所有檔案 # 第一次執行,沒有依賴檔案,這個ifneq不執行, # 當修改.h檔案之後,判斷執行這個include $(dep_files) ifneq ($(dep_files),) include $(dep_files) endif 參考核心的Makefile編寫包括Makefile和Makefile.build #Makefile file CROSS_COMPILE = arm-linux- AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld CC = $(CROSS_COMPILE)gcc CPP = $(CC) -E AR = $(CROSS_COMPILE)ar NM = $(CROSS_COMPILE)nm STRIP = $(CROSS_COMPILE)strip OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdump export AS LD CC CPP AR NM export STRIP OBJCOPY OBJDUMP CFLAGS := -Wall -O2 -g CFLAGS += -I $(shell pwd)/include LDFLAGS := -lm -lfreetype export CFLAGS LDFLAGS TOPDIR := $(shell pwd) export TOPDIR TARGET := show_file obj-y += main.o obj-y += display/ obj-y += draw/ obj-y += encoding/ obj-y += fonts/ all : make -C ./ -f $(TOPDIR)/Makefile.build $(CC) $(LDFLAGS) -o $(TARGET) built-in.o clean: rm -f $(shell find -name "*.o") rm -f $(TARGET) distclean: rm -f $(shell find -name "*.o") rm -f $(shell find -name "*.d") rm -f $(TARGET) #Makefile.build file PHONY := __build __build: obj-y := subdir-y := include Makefile #找出子目錄 # obj-y := a.o b.o c/ d/ # $(filter %/, $(obj-y)) : c/ d/ # __subdir-y : c d # subdir-y : c d __subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y))) subdir-y += $(__subdir-y) # c/built-in.o d/built-in.o subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o) #找出目標檔案 # a.o b.o cur_objs := $(filter-out %/, $(obj-y)) dep_files := $(foreach f,$(cur_objs),.$(f).d) dep_files := $(wildcard $(dep_files)) ifneq ($(dep_files),) include $(dep_files) endif PHONY += $(subdir-y) __build : $(subdir-y) built-in.o $(subdir-y): make -C
[email protected]
-f $(TOPDIR)/Makefile.build #built-in.o 依賴當前目錄下的build-in.o built-in.o : $(cur_objs) $(subdir_objs) $(LD) -r -o [email protected] $^ dep_file = [email protected] %.o : %.c $(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o [email protected] $< .PHONY : $(PHONY) 關鍵點說明:


相關推薦

Makefile通用編寫規則

#簡單實用的Makefile模板: objs := a.o b.o test:$(objs) gcc -o test $^ # .a.o.d .b.o.d dep_files := $(foreach f,$(objs),.$(f).d) dep_files

【android】Android平臺編譯makefile編寫規則

Date: 2018.10.9 1、參考 https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/ https://blog.csdn.net/yuanjize1996/article/det

makefile編寫規則

第一章、概述 什麼是makefile?或許很多Winodws的程式設計師都不知道這個東西,因為那些Windows的IDE都為你做了這個工作,但我覺得要作一個好的和professional(專業)的程式設計師,makefile還是要懂。這就好像現在有這麼多的HTML的編輯

makefile 編寫規則

可執行 缺點 容易 編譯鏈接 清晰 bool div class 區別 一、makefile 規則   1、如果沒編譯過,將所有的 (.c) 文件編譯並且鏈接;   2、如果有其中的 (.c) 文件改變,編譯並鏈接改變的文件;   3、如果(.h)文件被修改,編譯引

java 程序編寫規則(自己總結)

pub switch 成員 文件的 類型 ont 記憶 縮進 setname 1.命名規範 (1)所有的標示符都只能用ASCⅡ字母(A-Z或a-z)、數字(0-9)和下劃線“_”。 (2)類名是一個名詞,采用大小寫混合的方式,每個單詞的首字母大寫。例如:UserInfo (

模塊和類的通用轉換規則(2),如何oo?

show utf8 註意 Coding 編程 IT 設計 人的 變量 介紹模塊和類怎麽互相轉換,不談面向對象的繼承 封裝 多態等特點。 一個person_module模塊,有人的基本屬性和功能。 person_module.py如下 # coding=utf8

基礎篇:6.10)通用公差規則

nbsp ros 最終 測量 基礎篇 dimens 質量保證 所表 做的 本章目標:不管是用線性尺寸標註或形位公差標註,基礎的公差標註規則需要遵守。 1.通用公差規則(Fundamental Dimension Rule) 基本工程圖紙尺寸公差尺寸規則 (ASME

Python編寫規則值得收藏

導航 講師 ref port 收藏 編寫 建議 斜杠 版本 Python中采用PEP8作為編碼規範,其中PEP是 python enhancement proposal 的縮寫,而“PEP8”中的“8”表示版本號。PEP8是Python代碼的樣式指南。下面給出PEP8編碼規

【一】makefile的基本規則

1、基本格式: target(目標):prerequisites(依賴) command ... ... 注意:command的縮排必須使用tab,使用空格時會error。例子: image_bs: image_bs.o ../common/profile.o

make之makefile 三 書寫規則

makefile的規則包括兩個部分,一個是依賴關係,一個是生成目標的方法。 在Makefile中,規則的順序是非常重要的,由於,Makefile中僅僅應該有一個最終目標,其他的目標都是被這個目標所連帶出來的,所以一定要讓make知道你的最終目標是什麼。一般來說,定義在Makefile中的目標

make之makefile 九 隱含規則

在我們使用Makefile時,有一些我們會常用,而且使用頻率非常高的東西,比方,我們編譯C/C++的源程式為中間目標檔案(Unix下是[.o]檔案,Windows下是[.obj]檔案)。本章講述的就是一些在Makefile中的“隱含的”,早先約定了的,不須要我們再寫出來的規則。 “隱含規則”

自動萬能makefile(linux ubuntu gcc/g++),讓makefile編寫不在煩人

自動萬能makefile(linux ubuntu gcc/g++),讓makefile的編寫不在煩人 keyword: wildcard notdir patsubst findstring wordlist suffix foreach

Makefile通用寫法

可直接在eclipse中建立makefile工程,使用該makefile檔案。 SRC := $(wildcard *.c) OBJ := $(patsubst %.c, %.o, $(SRC)) CC = gcc CCLINK = g++ CFLAGS = -

Makefile簡單編寫例項

介紹一下Makefile的簡單編寫例子。 編寫Makefile的規則就是: 目標檔案:依賴檔案 (tab)編譯規則 現在我有一個檔案目錄結構為: 解釋一下這幾個檔案。首先我建立makefile目錄,底下有一個include目錄和src目錄。include目錄存放一個head.h標頭檔案,是我們sr

【Linux】makefile編寫

昨天把程式移植到linux改了bug以後,感覺好麻煩 每次編譯都要輸那麼長一堆命令,容易輸錯,而且沒有變的原始碼也順便重新編譯了一次,很浪費時間。 當時用了別名,發現不能實現需求。 嗯,學一學makefile怎麼寫 基本語法 target : prerequisites <ta

Makefile編寫

1生成可執行檔案: #source file #原始檔,自動找所有.c和.cpp檔案,並將目標定義為同名.o檔案 SOURCE := $(wildcard *.c) $(wildcard *.cpp) OBJS := $(patsubst %.c,%.o,$(pat

makefile--隱式規則

1、makefile中出現同名目標時 同名依賴:所有的依賴將合併在一起,成為目標的最終依賴 同名命令:當多處出現同一目標的命令時,make發出警告;所有之前定義的命令被最後定義的命令取代 示例1–makefile中出現同名依賴 .PHONY : all

Linux系統使用入門進階總結(7)——CMake簡單的編寫規則

文章轉自: https://blog.csdn.net/VennyJin/article/details/84995621 本篇以使用CMakeLists.txt構建一個簡單的OpenCV程式為例,簡單介紹一下CMakeLists.txt的編寫規則,各位讀者若後期有進一步的需求,強烈推薦

Makefile編寫快速入門

Makefile的編寫快速入門 一、Makefile編寫須知 二、簡單的Makefile的編寫 三、通用Makefile的編寫 四、使用 在學習Linux下使用C語言程式設計的時候,我們需要為自己的專案編寫一個Ma

HTML郵件模板編寫規則編寫郵件HTML模板

工作中遇到需要發郵件模板給客戶傳送憑證,踩坑踩出來一下規則: 1.所有樣式必須行內,否則不起作用 大部分郵件客戶端中不支援使用外接css樣式,最好使用內聯樣式 2.所有佈局必須使用table,複雜佈局使用table巢狀或單元格合併 佈局儘量使用table ,將頁面拆分