configurar - makefile windows
hacer un archivo con subdirectorios fuente (3)
Mi último proyecto está en C ++ y estoy usando GNU Make. El diseño del directorio del proyecto es el siguiente:
project
|-src
|-subdir1
|-subdir2 (containing tests)
|-doc
|-bin
Me gustaría poder llamar a make
en el directorio de nivel superior (es decir, necesitar un archivo make en el directorio del proyecto) para compilar todas las fuentes en ambos subdirectorios "src" y colocar los binarios resultantes en el directorio "bin".
¿Cuál sería el mejor enfoque para hacer esto? También sería genial si no tuviera que agregar una regla de creación para cada archivo fuente, pero solo tenía uno para todos los archivos .cc y .h en los directorios.
Deberá hacer subarchivo en los directorios y usar los comandos para generar archivos compilados en g ++ en los directorios que desee. (Utilice variables de archivos MAKE, etc.)
Encontrarás una buena introducción sobre Makefiles recursivos aquí
Makefile te permite usar algunas reglas genéricas como:
%.o:%.cpp
gcc blahblahblah
y también puede incluir un archivo MAKE global de otro utilizando include
.
Si también google makefile, encontrarás muchos consejos sobre el tema.
Hacer le permite generalizar sus reglas, por lo que no necesitará crear una para cada archivo.
project
|-src
|-subdir1
|-subdir2 (containing tests)
|-doc
|-bin
Puedes probar algo como esto:
#This finds all your cc files and places then into SRC. It''s equivalent would be
# SRC = src/main.cc src/folder1/func1.cc src/folder1/func2.cc src/folder2/func3.cc
SRC = $(shell find . -name *.cc)
#This tells Make that somewhere below, you are going to convert all your source into
#objects, so this is like:
# OBJ = src/main.o src/folder1/func1.o src/folder1/func2.o src/folder2/func3.o
OBJ = $(SRC:%.cc=%.o)
#Tells make your binary is called artifact_name_here and it should be in bin/
BIN = bin/artifact_name_here
# all is the target (you would run make all from the command line). ''all'' is dependent
# on $(BIN)
all: $(BIN)
#$(BIN) is dependent on objects
$(BIN): $(OBJ)
g++ <link options etc>
#each object file is dependent on its source file, and whenever make needs to create
# an object file, to follow this rule:
%.o: %.cc
g++ -c $< -o $@
Utilice una ejecución para hacer la construcción (no soy fanático de la creación recursiva). No use $(shell)
ya que mata el rendimiento. Coloque los productos de compilación en un directorio temporal.
Bosquejo:
subdir1-srcs := $(addprefix subdir1/,1.cc 2.cc 3.cc)
subdir1-objs := ${subdir1-srcs:subdir1/%.cc=subdir1/obj/%.o)
bin/prog1: ${subdir1-objs} ; gcc $^ -o $@
${subdir1-objs}: subdir1/obj/%.o: subdir1/%.cc # Static pattern rules rule
gcc -c $< -o $@
${subdir1-objs}: subdir1/obj/.mkdir # Need to create folder before compiling
subdir1/obj/.mkdir:
mkdir -p ${@D}
touch $@
¿Puedes ver la placa de la caldera aquí? Algunas funciones junto con $(eval)
deberían permitirle escribir:
$(call build,bin/prog1,subdir1,1.cc 2.cc 3.cc)
$(call build,bin/prog2,subdir2,a.cc b.cc c.cc d.cc)
con estos objetivos agregados automáticamente como dependencias de all
falso, y muy bien -j
compatible (solo escriba make -j5 all
to build).