Maison >développement back-end >C++ >Comment GNU Make peut-il être utilisé pour créer efficacement plusieurs exécutables avec des règles similaires provenant de différents répertoires ?

Comment GNU Make peut-il être utilisé pour créer efficacement plusieurs exécutables avec des règles similaires provenant de différents répertoires ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 08:42:03781parcourir

How can GNU Make be used to efficiently build multiple executables with similar rules from different directories?

Créer des exécutables avec des règles similaires à l'aide de GNU Make

Comme alternative à Scons, GNU Make peut être une solution efficace pour votre tâche. GNU Make vous permet de définir un processus de construction flexible grâce à son système de résolution de dépendances.

Approche GNU Make

Nous présentons deux makefiles qui permettent la construction et le nettoyage depuis le haut. -répertoire de niveau (all_lessons) et répertoires de projets individuels :

project.mk

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

Makefile

# one directory per project, one executable per directory
project_dirs := $(shell find * -maxdepth 0 -type d )

# executables are named after its directory and go into the same directory
exes := $(foreach dir,${project_dirs},${dir}/${dir})

all : ${exes}

#  the rules

.SECONDEXPANSION:

objects = $(patsubst %.cpp,%.o,$(wildcard $(dir )*.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 auto-generated dependency files
-include $(foreach dir,${project_dirs},$(wildcard ${dir}/*.d))

Avantages

  • Simplicité : GNU Make est simple et facile à comprendre, même pour les débutants.
  • Extensibilité : Les Makefiles peuvent être facilement étendus avec des cibles et des règles personnalisées.
  • Parallélisable : GNU Make peut créer plusieurs cibles simultanément, ce qui le rend efficace pour les grands projets.
  • Suivi automatique des dépendances :Make détecte et met à jour automatiquement les dépendances, garantissant que seules les cibles nécessaires sont créées.

Utilisation

Pour créer à partir d'un individu répertoire du projet, créez un lien symbolique vers project.mk en tant que Makefile dans ce répertoire. La construction ou le nettoyage à partir du répertoire all_lessons traitera tous les projets, tandis que le faire à partir du répertoire d'un projet n'affectera que ce projet.

Cette approche offre un moyen propre et flexible de créer plusieurs exécutables avec des règles similaires à partir de différents répertoires.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn