簡體   English   中英

將源文件列表放入Makefile中的最佳方法

[英]Best way to get a source file list into a Makefile

我想將我的源文件列表分離到自己的文件(source.list)中,這樣就不必每次添加內容時都需要更新Makefile。

source.list看起來像:

a_file.cpp
another_file.cpp
...
xyz_file.cpp

每個文件都放在換行符上。

如何將該列表作為空格分隔的列表放入Makefile中?

如有必要,可以使用configure bash腳本。 我知道awk可以用於此目的,但我盡可能避免使用它

SOURCE_LIST := $(shell cat source.list)

在gmake中使用$(wildcard *.cpp)

如果需要,您可以使用對列表進行操作的其他功能來過濾掉某些源文件。

如果確實需要將源放入單獨的文件中,則可以簡單地擁有一個或多個變量,具體取決於將所有翻譯單元編譯為目標文件所需的目標數量:

SOURCE_OBJ1 = src1.cpp depends1 depends2 ...
SOURCE_OBJ2 = src2.cpp depends1 depends2 ...
....

將其保存到sources.list,並將其包括在Makefile中的實際目標定義之前:

include sources.list
 .PHONY: all
 all: executable

 executable: obj1.o obj2.o
    g++ -o executable obj1.o obj2.o

 src1.o: $(SOURCE_OBJ1)
 src2.o: $(SOURCE_OBJ2)

編輯 :我概括了具有一個或多個依賴項(源文件本身除外)的多個目標的方法。 在某個時候,您將需要再次進入Makefile本身,例如,當您添加需要編譯的新源文件時。 您僅可以在分隔列表中執行的操作就是切換實際的源文件和/或更改目標的依存關系,而無需觸摸Makefile。

這一切都很好,除了它可怕而且無法擴展之外。 請使用諸如CMake之類的構建系統生成器,否則當您的項目增長時,您將不會獲得樂趣。

EDIT2 :添加了所有人期望的假目標。

EDIT3 :請注意:上面的代碼希望您將src1等替換為實際的源文件名,例如main 否則,make將無法推斷出適當的g ++命令行,並且可能將提及為依賴項的頭文件添加到源文件列表中。 結果是無法使用的目標文件。

另外,您可以為源和依賴項指定一個變量,然后指定如何自己調用編譯器:

# sources.list
SOURCES_OBJ1 = src1 src2 src3 # only source files here
DEPENDS_OBJ1 = $(SOURCES_OBJ1) dep1 dep2 dep3 # dependencies might include different file types

# ....

# Makefile
# all the other stuff here
obj1.o: $(DEPENDS_OBJ1) # can now be names however you see fit
        g++ -c $(SOURCES_OBJ1) -o obj1.o # handle compiler invocation manually

請注意,obj1.o現在可以具有您想要選擇的任何名稱,並且不是 PHONY目標。 還要注意,使用的任何源文件也是目標依賴項列表的一部分-但是,只有源文件才傳遞給g ++進行編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM