"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo crear varios ejecutables con reglas similares usando GNU Make?

¿Cómo crear varios ejecutables con reglas similares usando GNU Make?

Publicado el 2024-11-07
Navegar:939

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

Creación de varios ejecutables con reglas similares utilizando GNU Make

Si bien Scons es una herramienta de compilación capaz, implementar la funcionalidad deseada puede ser un desafío. Un enfoque más sencillo es utilizar GNU Make, que permite crear y limpiar fácilmente desde directorios de proyectos individuales y de nivel superior.

Configuración de Makefile

Los archivos Make proporcionados habilite la creación y limpieza tanto desde el directorio all_lessons como desde los directorios de proyectos individuales. El ejecutable de cada proyecto lleva el nombre de su directorio.

Estructura del proyecto

Para lograr esto, deberá configurar una estructura de proyecto similar al ejemplo proporcionado:

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

Contenido del archivo Make

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

Uso

Construcción desde individuo Directorios de proyectos

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

Construyendo desde el directorio de nivel superior

[all_lessons]$ make

Limpiando directorios de proyectos individuales

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

Limpiar todos los proyectos

[all_lessons]$ make clean
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3