Mon projet (un langage interprété) a une bibliothèque standard composée de plusieurs fichiers, chacun d'eux sera construit dans une bibliothèque dynamique .so que l'interpréteur chargera à la demande de l'utilisateur (avec un directive d'importation). Chaque fichier source est situé dans un sous-répertoire représentant son « espace de noms », par exemple:Makefile: Construire dans une arborescence séparée
libraries tree http://img707.imageshack.us/img707/7299/screenshot1tv.png
Le processus de construction doit créer un répertoire « construire », puis quand chaque fichier compile doit créer son espace de noms répertoire à l'intérieur du "build" un, par exemple, lors de la compilation
std/io/network/tcp.cc
il exécuter une commande mkdir avec
mkdir -p build/std/io/network
L'extrait Makefile est:
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)
J'ai deux questions:
1 - Le problème est que la commande make, je ne sais vraiment pas pourquoi, ne vérifie pas si un fichier a été modifié et lancer le processus de construction sur tous les fichiers, peu importe quoi, donc si je dois construire un seul fichier, je dois les construire tout ou utiliser la commande:
make path/to/single/file.so
est-il un moyen de résoudre ce problème?
2 - Une façon de faire cela de façon "propre" sans avoir à distribuer tous les répertoires de construction avec les sources?
Merci