Maison  >  Article  >  développement back-end  >  GNU Make peut-il rationaliser la création de nombreux exécutables avec des règles similaires dans une structure de répertoires, permettant ainsi la compilation à partir du répertoire principal et des dossiers de projet individuels ?

GNU Make peut-il rationaliser la création de nombreux exécutables avec des règles similaires dans une structure de répertoires, permettant ainsi la compilation à partir du répertoire principal et des dossiers de projet individuels ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-27 16:07:02878parcourir

Can GNU Make streamline building numerous executables with similar rules across a directory structure, allowing compilation from both the main directory and individual project folders?

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

Question :

GNU Make peut-il faciliter la création de plusieurs exécutables avec des règles similaires dans une structure de répertoires, permettant la compilation à partir du répertoire principal et des répertoires de projets individuels ?

Réponse :

Oui, GNU Make peut gérer cette tâche avec une approche concise et efficace. Vous trouverez ci-dessous deux makefiles qui implémentent la fonctionnalité souhaitée :

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))

Utilisation :

  • Créez des liens symboliques nommés Makefile vers project.mk dans chaque répertoire de projet.
  • Pour créer un projet spécifique, accédez au répertoire du projet et exécutez make.
  • Pour construire tous les projets, exécutez make à partir du répertoire principal (all_lessons).
  • Pour nettoyer un projet spécifique, exécutez make clean à partir du répertoire du projet.
  • Pour nettoyer tous les projets, exécutez make clean à partir du répertoire principal.

Avantages :

  • Facile à mettre en œuvre et adapté aux exigences spécifiées.
  • Prend en charge la création et le nettoyage à partir du répertoire principal et des répertoires du projet.
  • Génère automatiquement des dépendances et est entièrement parallélisable.

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