2010-11-14 9 views
6

No sé mucho material de archivo que he estado aprendiendo a aprender bits según sea necesario.gmake obtener lista de archivos de objeto de múltiples directorios

La falla más grande de mis makefiles es que he estado enumerando todos los archivos manualmente, aunque esto no ha sido un problema, mi proyecto actual se está volviendo difícil de manejar. Tengo 4 directorios cada uno con archivos de fuentes.

¿Cómo puedo obtener toda la lista de archivos objeto sin tener que enumerarlos manualmente.

Esto no funciona, pero muestra lo que he estado tratando de hacer.

VPATH = Lib GameCode Moot/Moot Moot/Impl 

OBJS = $(subst .cpp, .o, $(VPATH)) 

foobar: $(OBJS) 
    g++ -o [email protected] $^ 

%.o: %.cpp 
    g++ -c $< -o [email protected] -I Moot 

clean: 
    rm main.o lib.o foo.o foobar 

Respuesta

5

Personalmente, nunca he tenido ningún problema para enumerar todos los archivos manualmente. La inclusión de un archivo en el archivo MAKE requiere un tiempo insignificante en comparación con agregar contenido útil.

Para obtener todos los archivos de diferentes directorios, uno puede sugerir el uso de wildcard function. Por lo tanto, my_sources:=$(wildcard *.cpp dir1/*.cpp) hará que la variable contenga archivos fuente que coincidan con la expresión de comodín.

Sin embargo, creo que es menos conveniente que el uso habitual de comandos de Linux find a través de la cáscara:

# Find all sources 
my_sources:=$(shell find -iname '*.cpp') 
# Make targets out of them 
OBJS=$(my_sources:%.cpp=%.o) 

Find es más potente que simplemente realizar de orden interna wildcard. También es posible que desee utilizar otras capacidades de shell, como las tuberías, por ejemplo, para filtrar la salida de find (si la función de Make filter-out no es suficiente). O algo como esto, para evitar variables excesivas:

OBJS:=$(shell find -iname '*.cpp' | sed 's/\.cpp$/.o/') 

¡Usted lo nombra!

+0

En OS X, tiene que agregar el directorio actual después del comando find. Por ejemplo: 'encontrar. -iname '* .cpp''. – deepak

0

El uso de VPATH o vpath no funcionará para su problema .. proporciona una ruta de búsqueda para encontrar archivos, pero aún necesita enumerar los archivos. Si sólo tiene que recopilar toda y cualquier archivo .c/.cpp que se encuentran en esos directorios, entonces esto debería funcionar:

foobar: $(shell ls Lib/*.cpp) $(shell ls GameCode/*.cpp) $(shell ls Moot/Moot/*.cpp) $(shell ls Moot/Impl/*cpp) 
    g++ -o [email protected] $^ 

clean: 
    rm foobar $(shell ls Lib/*.o) $(shell ls GameCode/*.o) $(shell ls Moot/Moot/*.o) $(shell ls Moot/Impl/*o) 

La información VPATH no es necesario, la sustitución de .o para .cpp puede ir al igual que la anulación de la regla implícita. Además, no el uso de ls en lugar de find para buscar en, y solo en, el directorio especificado.

Cuestiones relacionadas