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.exe

    Aber 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.exe

    schreiben 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!


Anmelden zum Antworten