Makefile - Release und Debug Build
-
Hallo Leute!
Wie schreibe ich ein Makefile, dass Release und Debug Build kennt?
Ich habe ${OutputDir} und ${CompilerFlags} welche je nachdem eben die Debug bzw. Release zugewiesen bekommen sollen.
Wenn man "make release" schreibt, soll nur release gebuildet werden und bei "make debug" nur der Debug Build. bei nur "make" sollen beide gebuildet werden.
Wie kann ich das realisieren, ohne den Code doppelt zu schreiben?
Ich habe deswegen etwa sowas:${OutputDir}/Name.exe: name.cpp name.hpp
g++ ${CompilerFlags} -c name.cpp -o ${OutputDir}/Name.exeAber jetzt stehe ich an.
Wie kann ich OutputDir innerhalb eines 'Target's ändern?Release ${ReleaseDir}/Name.exe
OutputDir = ${ReleaseDir}funktioniert logischerweise nicht.
-
Könnte sein, das ich mich jetz irre, aber wie wär es mit (nach gnu make syntax):
dbgrel: release debug
So das das Standard Target Debug und Release aufruft.
-
ChockoCookie schrieb:
Könnte sein, das ich mich jetz irre, aber wie wär es mit (nach gnu make syntax):
dbgrel: release debug
So das das Standard Target Debug und Release aufruft.
Ja, aber dann muss ich in Release und Debug ja den selben Code haben - nur eben mit unterschiedlichen Flags und Verzeichnissen.
Ich drück es mal in Pseudocode aus:
do_compile($flags, $dir) { $dir/main.exe: main.cpp main.hpp g++ $flags -c main.cpp -o $dir/main.exe } //jetzt die Targets: target_release() { do_compile($release_flags, $release_dir); } target_debug() { do_compile($debug_flags, $debug_dir); } target_all() { do_compile($release_flags, $release_dir); do_compile($debug_flags, $debug_dir); }
So dass ich eben nur einmal
$dir/main.exe: main.cpp main.hpp
g++ $flags -c main.cpp -o $dir/main.exeschreiben muss, und es eben entweder mit den release oder debug Daten aufrufe (bzw. natürlich noch mehrere 'konfigurationen' wie zB fastbuild, profile, smallsize,...)
-
> cat makedemo DEBUG=1 CFLAGS_DEBUG=-g -Wall -W -pipe CFLAGS_RELEASE=-pipe -O3 -fomit-frame-pointers #usw. CFLAGS= ifeq ($(DEBUG),1) override CFLAGS=$(CFLAGS_DEBUG) else override CFLAGS=$(CFLAGS_RELEASE) endif foo: @echo $(CFLAGS) > make -f makedemo -e -g -Wall -W -pipe > DEBUG=0 && make -f makedemo -e -pipe -O3 -fomit-frame-pointers #usw.
ist (bestimmt) nur für GNU/make aber HTH
-
Schaut gut aus.
Und wie könnte man ein 'all' machen - das release und debug buildet?Das ist nämlich mein Problem mit diesen if
Aber wenns nicht geht, dann nehme ich deins. thx.
-
das kannst du auch mit Hilfe der Shell machen
> cat Makefile DEBUG=1 RELEASE=1 DEBUG_DIR= RELEASE_DIR= foo: if [ $(DEBUG) = 1 ]; then cd $(DEBUG_DIR); make; fi if [ $(RELEASE) = 1 ]; then cd $(RELEASE_DIR); make; fi > DEBUG=0 && make -e
-
thx!
daran hatte ich nicht gedacht!