2017-04-03 52 views
4

鑑於我有一個簡單的Makefile中像這樣一個項目:如何分離不同配置的Makefile構建輸出?

all: foobar 
foobar: foo.o bar.o 

,我可以建立針對不同的架構:

$ CC=clang make     # or 
$ CC=x86_64-w64-mingw32-gcc make # or 
$ CC=arm-linux-gnueabihf-gcc make 

這工作,但我希望能夠保持多路輸出同時配置,例如在構建服務器上。

什麼是一個很好的,乾淨的方式去做這件事?我已經考慮了以下幾點:

  • 使用自動工具或其他構建工具,但我想看看有什麼可以不
  • 創建建立與生成文件目錄,在他們VPATH設置,包括根Makefile文件
  • 寫在構建每個體系結構後移動輸出的腳本
  • 修改Makefile以構建多個配置。我不喜歡這個解決方案,因爲你最終會遇到一種複雜的元文件,它與你的特定的編譯環境緊密耦合。
  • 向Makefile添加一個變量來設置輸出目錄。這可以工作,但這意味着我不能使用隱式的Makefile規則。模式的規則將變得混亂太
+0

,你的意思是對象,或者只是最終的可執行文件?通常的做法是將$(OBJDIR)設置爲對象的輸出目錄,並且可以根據構建配置有條件地設置它。隱式規則很容易重寫,儘管你必須首先創建一個規則來創建$(OBJDIR)。 – blackghost

+0

我認爲你應該對每個架構使用不同的目標(包含目錄)。說'arm/foo','x86_64/foo'和'main/foo'。我建議儘可能簡單:) – uzsolt

+0

我認爲我會使用@John提到的'$(OBJDIR)'解決方案。我真的希望能做到像'make -f ../Makefile VPATH = ...'這樣的東西,但我想它不是。 @uzsoft我不認爲Makefile應該具備這些不同環境的知識,而應該是適應性的。因此我的'meta-Makefile'的評論。 –

回答

1

我會用類似的東西去:

# User configuration 
BINARY := hello 
SOURCES := main.c 

# Create the output paths 
out  ?= out 
outdir := $(out)/$(CC) 
outbin := $(outdir)/$(BINARY) 
objects := $(outdir)/$(SOURCES:.c=.o) 

# Default target 
all: $(outbin) 

# Binary target 
$(outbin): $(objects) 
    $(CC) -o [email protected] $^ 

# Objects target 
$(objects): $(outdir)/%.o: %.c 
    mkdir -p $(@D) 
    $(CC) -o [email protected] -c $< 

# The cleanning targets 
clean: 
    $(RM) -r $(outdir) 

mrproper: 
    $(RM) -r $(out) 

# Declare phony targets 
.PHONY: all clean mrproper 

注意,目標是利用static pattern的對象能夠得到在當前目錄和對象的源文件輸出目錄中的文件。


它也容易作爲基本Makefile使用方法:當你說你要保存的輸出

$ make 
mkdir -p out/cc 
cc -o out/cc/main.o -c main.c 
cc -o out/cc/hello out/cc/main.o 

$ make 
make: Nothing to be done for 'all'. 

$ tree 
. 
├── main.c 
├── Makefile 
└── out 
    └── cc 
     ├── hello 
     └── main.o 

2 directories, 4 files 

$ CC=gcc make 
mkdir -p out/gcc 
gcc -o out/gcc/main.o -c main.c 
gcc -o out/gcc/hello out/gcc/main.o 

$ tree 
. 
├── main.c 
├── Makefile 
└── out 
    ├── cc 
    │   ├── hello 
    │   └── main.o 
    └── gcc 
     ├── hello 
     └── main.o 

3 directories, 6 files 
+0

感謝您的詳細解答。我認爲這是我將要進入的方向。如果在此期間沒有其他新穎的想法出現,我會在稍後將此標記爲答案。 –

+0

雖然有一個後續問題:是否可以在經典後綴語法中執行'obj /%。o:%.c'規則? –

+0

@SijmenMulder是的,我相信你可以。我更喜歡這種符號,因爲它只對你指定的目標有效。 – jml

相關問題