Makefile : Construire dans un répertoire distinct de l'arbre

Mon projet (un langage interprété) a une bibliothèque standard composé par plusieurs fichiers, chacun d'entre eux sera construit dans une .donc, bibliothèque dynamique que l'interprète de charge sur demande de l'utilisateur (avec une directive d'importation).
Chaque fichier source est situé dans un sous-répertoire qui représente son "espace de noms", par exemple :

Makefile : Construire dans un répertoire distinct de l'arbre

Le processus de construction est de créer une "génération" de répertoire, puis lors de chaque fichier est de la compilation a la création de son espace de noms de répertoire à l'intérieur de la "construire" un, par exemple, lors de la compilation de

std/io/network/tcp.cc

il exécuter une commande mkdir avec

mkdir -p build/std/io/network

Le Makefile extrait 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 pas vraiment pourquoi, n'est-ce pas vérifier si un fichier a été modifié et lancer le processus de construction sur TOUS les fichiers de n'importe quoi, donc si j'ai besoin de construire un seul fichier, je dois construire tous ou d'utiliser la commande :

make path/to/single/file.so

Est-il un moyen pour résoudre ce problème?

2 - Aucun moyen de le faire dans un "nettoyeur" sans avoir à distribuer tous les répertoires de construction avec des sources?

Grâce