2010-04-14 13 views
5

Mi proyecto (un lenguaje interpretado) tiene una biblioteca estándar compuesta por varios archivos, cada uno de ellos estará integrado en una biblioteca dinámica .so que el intérprete cargará a solicitud del usuario (con un directiva de importación). Cada archivo fuente se encuentra en un subdirectorio que representa su "espacio de nombres", por ejemplo:Makefile: compilación en un árbol de directorio separado

proceso libraries tree http://img707.imageshack.us/img707/7299/screenshot1tv.png

La construcción tiene que crear un directorio "construir", a continuación, cuando cada archivo está recopilando tiene que crear su espacio de nombres directorio dentro del "construir" una, por ejemplo, al compilar

std/io/network/tcp.cc 

que ejecutar un comando mkdir con

mkdir -p build/std/io/network 

El fragmento Makefile es:

STDSRC=stdlib/std/hashing/md5.cc \ 
     stdlib/std/hashing/crc32.cc \ 
     stdlib/std/hashing/sha1.cc \ 
     stdlib/std/hashing/sha2.cc \ 
     stdlib/std/io/network/http.cc \ 
     stdlib/std/io/network/tcp.cc \ 
     stdlib/std/io/network/smtp.cc \ 
     stdlib/std/io/file.cc \ 
     stdlib/std/io/console.cc \ 
     stdlib/std/io/xml.cc \ 
     stdlib/std/type/reflection.cc \ 
     stdlib/std/type/string.cc \ 
     stdlib/std/type/matrix.cc \ 
     stdlib/std/type/array.cc \ 
     stdlib/std/type/map.cc \ 
     stdlib/std/type/type.cc \ 
     stdlib/std/type/binary.cc \ 
     stdlib/std/encoding.cc \ 
     stdlib/std/os/dll.cc \ 
     stdlib/std/os/time.cc \ 
     stdlib/std/os/threads.cc \ 
     stdlib/std/os/process.cc \ 
     stdlib/std/pcre.cc \ 
     stdlib/std/math.cc 

STDOBJ=$(STDSRC:.cc=.so) 

all: stdlib 

stdlib: $(STDOBJ) 

.cc.so: 
    mkdir -p `dirname $< | sed -e 's/stdlib/stdlib\/build/'` 
    $(CXX) $< -o `dirname $< | sed -e 's/stdlib/stdlib\/build/'`/`basename $< .cc`.so $(CFLAGS) $(LDFLAGS) 

Tengo dos preguntas:

1 - El problema es que el comando make, yo realmente no sé por qué, no comprobar si se ha modificado un archivo y poner en marcha el proceso de construcción en tODOS los archivos no importa qué, así que si lo que necesito para construir un solo archivo, tengo que construir todos o utilizar el comando:

make path/to/single/file.so 

¿hay alguna manera de solucionar esto?

2 - ¿Alguna manera de hacer esto de una manera "limpia" sin tener que distribuir todos los directorios de compilación con las fuentes?

Gracias

Respuesta

11

Para 1) el problema es que el objetivo de la regla (stdlib/something.so) no es exactamente lo que hace que la regla (build/something.so), así que siempre piensa que debe hacer el objetivo. Esto debe fijarlo (estoy usando gnumake):

STDOBJ=$(patsubst stdlib%.cc,build%.so, $(STDSRC)) 

all: stdlib 

stdlib: $(STDOBJ) 

build/%.so: stdlib/%.cc 
mkdir -p $(dir [email protected]) 
    $(CXX) $< -o [email protected] $(CFLAGS) $(LDFLAGS) 

Para 2) No estoy seguro de lo que quiere decir. Si desea la estructura de directorios de compilación que describe, esto lo hará.

Cuestiones relacionadas