GNU Make Regeln generieren



  • Hallo,
    prinzipiell lässt sich mit Hilfe von Variablenersetzung in GNU Make ja auch selbst der "Programmcode" (also des Makefiles) ein stück weit "generieren".

    %.o : %.cpp
            $(EXPANDS_TO_LINE_TO_CREATE_O_FROM_CPP)
    

    Meine Frage ist aber, ob es möglich ist, ganze Regeln (mehrzeilig!) zu generieren?
    Im obigen Bsp. etwa eine gleiche Regel fuer die Endung .cc, einfach über ein foreach.
    Ich habe jetzt ewig rumprobiert, aber ich kriege es nicht hin. Offensichtlich können Variablen keine newlines und tabs speichern, also sehe ich keine Möglichkeit. Denke ich nur falsch?
    Achso, so Hacks wie irgendwelches sed gemehre, was dann in eine Datei umgeleitet wird und diese anschliessend eingebunden finde ich nicht sehr schoen und wuerde ich gern vermeiden (auch wenn das für Sachen wie Dependency-Generation vmtl unausweichlich ist [je nach tool]).

    makeloser



  • Es gibt sogar Tools, die generieren das komplette Makefile.


  • Mod

    Es gibt sogar Tools die generieren komplette Tools, die das komplette Makefile generieren 🙂 .



  • Danke, das waren die sinnvollsten Antworten, die ich mir hätte erhoffen können - überhaupt nicht am Thema vorbei und total relevant.


  • Mod

    makeloser schrieb:

    Danke, das waren die sinnvollsten Antworten, die ich mir hätte erhoffen können - überhaupt nicht am Thema vorbei und total relevant.

    Du musst mitdenken. Die Antworten machen dich darauf aufmerksam, dass du hier ungeeignete Mittel anwenden willst. Etwa so als würdest du in einem Jägerforum nachfragen wie du dein Hausschwein für die Entenjagd scharf machst. Klar geht das irgendwie, trotzdem ist es ein guter Rat dich auf die Existenz von Jagdhunden aufmerksam zu machen.

    So auch hier: Der nächste Schritt den du vor hast ist ohnehin, dass Makefile automatisch erstellen zu lassen. Denn das Problem hatten die Leute schon vor 30 Jahren. Und denen war die Frickelei dann schnell zu viel und so wird es auch dir ergehen. Und dann haben sich mal ein paar Leute hingesetzt und ein sauberes, automatisiertes System entwickelt. Und die Leute waren begeistert.

    Und unser Rat ist, dass du auch gleich auf das vollautomatische System umsteigen kannst, anstatt den historischen Weg (Manuell ➡ halbautomatische Frickelei ➡ Automatisierung) selber noch einmal zu gehen. Auf diese Weise sparst du dir den unangenehmen Schritt in der Mitte.



  • Wenn es nur um .cpp, .cc geht, dann kannst du einfach die Implicitrules über die entsprechenden Variablen (CXX, CPPFLAGS, CXXFLAGS) anpassen:

    http://www.gnu.org/software/automake/manual/make/Catalogue-of-Rules.html#Catalogue-of-Rules



  • Mal aus einem Makefile, das ich mir irgendwann gebastelt hab:

    define program_template
    $(1)_SRC := $$(shell find $(proc_srcdir)/$(1) -type f -name '*.c')
    $(1)_OBJ := $$(patsubst $(proc_srcdir)/%,$(proc_builddir)/%.o,$$($(1)_SRC))
    $(1)_DEP := $$(patsubst %.o,%.d,$$($(1)_OBJ))
    
    ifneq (,$$(findstring $(1),$$(MAKECMDGOALS)))
    -include $$($(1)_DEP)
    else
    ifeq (,$$(MAKECMDGOALS))
    -include $$($(1)_DEP)
    endif
    endif
    
    $(1)_CFLAGS    := $$(CFLAGS)
    $(1)_LINKFLAGS := $$(LINKFLAGS)
    $(1)_CPPFLAGS  := $$(CPPFLAGS)
    $(1)_LIBS      := $$(LIBS)
    
    ifneq (,$$(wildcard $$(proc_srcdir)/$(1)/config.mk))
    -include $$(proc_srcdir)/$(1)/config.mk
    endif
    
    $(1): $$($(1)_OBJ)
    	@echo '  LD  $$@'
    	$$(LD) $$(LINKFLAGS) $$(patsubst %,-l%,$$($(1)_LIBS)) -o $$@ $$($(1)_OBJ)
    
    $$($(1)_DEP) : $(proc_builddir)/%.d : $(proc_srcdir)/%
    	mkdir -p $$(dir $$@)
    	@echo 'Generating dependencies for $$(subst $(proc_srcdir)/,,$$<)'
    	$$(CC) -MM $$(CPPFLAGS) -MT $$@ -MT $$(patsubst %.d,%.o,$$@) $$< -o $$@
    
    .PHONY: test-$(1)
    test-$(1): $(1)
    	./$(1)
    
    endef
    
    $(foreach p,$(PROGRAMS),$(eval $(call program_template,$(p))))
    

    Das generiert Regel in Abhängigkeit vom Inhalt des Unterverzeichnisses src. Von der Verwendung für irgendwas größeres kann ich nur abraten.



  • Danke, genau dieses "define"-feature habe ich gesucht!


Anmelden zum Antworten