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