„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie erstellt man mit GNU Make mehrere ausführbare Dateien mit ähnlichen Regeln?

Wie erstellt man mit GNU Make mehrere ausführbare Dateien mit ähnlichen Regeln?

Veröffentlicht am 07.11.2024
Durchsuche:732

 How to Build Multiple Executables with Similar Rules Using GNU Make?

Erstellen mehrerer ausführbarer Dateien mit ähnlichen Regeln mit GNU Make

Scons ist zwar ein leistungsfähiges Build-Tool, die Implementierung der gewünschten Funktionalität kann jedoch eine Herausforderung sein. Ein einfacherer Ansatz ist die Verwendung von GNU Make, das ein einfaches Erstellen und Bereinigen sowohl aus der obersten Ebene als auch aus einzelnen Projektverzeichnissen ermöglicht.

Makefile-Setup

Die bereitgestellten Makefiles Ermöglichen Sie das Erstellen und Bereinigen sowohl aus dem Verzeichnis all_lessons als auch aus einzelnen Projektverzeichnissen. Die ausführbare Datei jedes Projekts ist nach ihrem Verzeichnis benannt.

Projektstruktur

Um dies zu erreichen, müssen Sie eine Projektstruktur ähnlich dem bereitgestellten Beispiel einrichten:

all_lessons/
    helloworld/
        lesson.cpp
        main.cpp
    even_or_odd/
        lesson.cpp
        main.cpp
    calculator/
        lesson.cpp
        user_created_add.cpp
        main.cpp

Makefile-Inhalte

project.mk

all :
% : forward_ # build any target by forwarding to the main makefile
    $(MAKE) -C .. project_dirs=$(notdir ${CURDIR}) $@
.PHONY : forward_

Makefile

# project configuration

project_dirs := $(shell find * -maxdepth 0 -type d )
exes := $(foreach dir,${project_dirs},${dir}/${dir})

all : ${exes}

# rules

.SECONDEXPANSION:
objects = $(patsubst %.cpp,%.o,$(wildcard $(dir ${1})*.cpp))

# link
${exes} : % : $$(call objects,$$*) Makefile
    g   -o $@ $(filter-out Makefile,$^) ${LDFLAGS} ${LDLIBS}

# compile .o and generate dependencies
%.o : %.cpp Makefile
    g   -c -o $@ -Wall -Wextra ${CPPFLAGS} ${CXXFLAGS} -MD -MP -MF ${@:.o=.d} $<

.PHONY: clean
clean :
    rm -f $(foreach exe,${exes},$(call objects,${exe})) $(foreach dir,${project_dirs},$(wildcard ${dir}/*.d)) ${exes}

# include dependency files
-include $(foreach dir,${project_dirs},$(wildcard ${dir}/*.d))

Usage

Building from Individual Projektverzeichnisse

[project_directory]$ ln -s ../project.mk Makefile  # create a symlink
[project_directory]$ make

Erstellen aus dem Top-Level-Verzeichnis

[all_lessons]$ make

Bereinigung einzelner Projektverzeichnisse

[project_directory]$ cd ..
[all_lessons]$ make clean

Reinigung aller Projekte

[all_lessons]$ make clean
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3