"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como construir vários executáveis ​​com regras semelhantes usando GNU Make?

Como construir vários executáveis ​​com regras semelhantes usando GNU Make?

Publicado em 2024-11-07
Navegar:711

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

Construindo vários executáveis ​​com regras semelhantes usando GNU Make

Embora o Scons seja uma ferramenta de construção capaz, implementar a funcionalidade desejada pode ser um desafio. Uma abordagem mais direta é utilizar o GNU Make, que permite fácil construção e limpeza de diretórios de projetos individuais e de nível superior.

Configuração do Makefile

Os makefiles fornecidos habilite a construção e limpeza do diretório all_lessons e dos diretórios de projetos individuais. O executável de cada projeto recebe o nome de seu diretório.

Estrutura do projeto

Para conseguir isso, você precisará configurar uma estrutura de projeto semelhante ao exemplo fornecido:

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

Conteúdo do Makefile

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

Construindo a partir de indivíduo Diretórios do projeto

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

Construindo a partir do diretório de nível superior

[all_lessons]$ make

Limpando diretórios de projetos individuais

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

Limpando todos os projetos

[all_lessons]$ make clean
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3