2017-04-03 3 views
4

Da ich ein Projekt mit einer einfachen Makefile habe etwa so:Wie kann ich Makefile-Build-Ausgaben für verschiedene Konfigurationen trennen?

all: foobar 
foobar: foo.o bar.o 

, dass ich verschiedene Architekturen gezielt aufbauen kann:

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

Dies funktioniert, aber ich möchte in der Lage sein, Ausgänge für mehr zu halten Konfigurationen gleichzeitig, zum Beispiel auf einem Build-Server.

Was wäre ein guter, sauberer Weg? Ich habe folgende betrachtet:

  • Verwenden Autotools oder einen anderen Build-Tool, aber ich will sehen, was ohne möglich ist
  • bauen Erstellen Sie Verzeichnisse mit Makefiles in ihnen diesen Satz VPATH und schließen die Wurzel Makefile
  • schreiben ein Skript, das die Ausgabe nach dem Erstellen jeder Architektur verschiebt
  • Ändern Sie das Makefile, um mehrere Konfigurationen zu erstellen. Ich mag diese Lösung nicht, weil Sie am Ende eine Art Meta-Makefile haben, das komplex und eng mit Ihrer spezifischen Build-Umgebung verbunden ist.
  • Fügen Sie dem Makefile eine Variable hinzu, um das Ausgabeverzeichnis festzulegen. Dies könnte funktionieren, aber es bedeutet, dass ich keine impliziten Makefile-Regeln verwenden kann. Musterregeln würden sich zu chaotisch
+0

Wenn Sie sagen, Sie die Ausgabe gespeichert werden soll, meinen Sie die Objekte, oder einfach nur die endgültige ausführbare Datei? Es ist üblich, '$ (OBJDIR)' als Ausgabeverzeichnis für Objekte festzulegen, und Sie können dies abhängig von der Build-Konfiguration festlegen. Die impliziten Regeln sind ziemlich einfach umzuschreiben, obwohl Sie erst eine Regel erstellen müssen, um $ (OBJDIR) zu erstellen. – blackghost

+0

Ich denke, Sie sollten verschiedene Ziele (mit Verzeichnissen) zu jeder Architektur verwenden. Sage 'arm/foo',' x86_64/foo' und 'main/foo'. Ich schlage vor, versuchen Sie so einfach wie möglich zu sein :) – uzsolt

+0

Ich denke, dass ich mit der '$ (OBJDIR)' Lösung gehen werde, die von @John erwähnt wird. Ich habe wirklich gehofft, dass etwas wie 'make -f ../Makefile VPATH = ...' möglich ist, aber ich nehme an, dass es nicht so ist. @uzsoft Ich glaube nicht, dass das Makefile Wissen über diese verschiedenen Umgebungen haben sollte, stattdessen sollte es anpassungsfähig sein. Daher meine Meta-Makefile-Bemerkung. –

Antwort

1

ich mit so etwas gehen würde:

# 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 

Beachten Sie, dass die Objekte Ziel static pattern wird mit der Lage sein, die Quelldateien im aktuellen Verzeichnis zu erhalten und das Objekt Dateien im Ausgabeverzeichnis.


Es ist auch so einfach wie ein Grund Makefile verwenden:

$ 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

Danke für die gründliche Antwort. Ich denke, das ist die Richtung, in die ich gehen werde. Wenn keine anderen neuen Ideen in der Zwischenzeit auftauchen, werde ich das als die Antwort auf eine Weile markieren. –

+0

Eine weitere Frage: Ist es möglich, die 'obj /%. O:% .c'-Regel in der klassischen Suffix-Syntax zu verwenden? –

+0

@SijmenMulder Ja ich glaube du kannst. Ich bevorzuge diese Notation, da sie nur für die von Ihnen angegebenen Ziele gültig ist. – jml

Verwandte Themen