È possibile fare in modo che Microsoft build.exe includa origini da directory remote?
Domanda
Aggiunta di file di origine a più di una directory (ad es. ../../source.cpp o ../../../somewhere_else/source.cpp, anziché solo source.cpp o ../source. cpp) alla dichiarazione SOURCES = in una build WDK / DDK genera il seguente errore:
Ignoring invalid directory prefix in SOURCES= entry
È possibile includere file sorgente remoti in una build?
Soluzione
Non è possibile farlo direttamente. build
è esplicitamente progettato solo per gestire
codice sorgente nella stessa directory o padre del file fonti
. Non può utilizzare file di origine da posizioni arbitrarie. In particolare, il suo sistema di tracciamento delle dipendenze sembra incapace di analizzare e tracciare i file remoti, e quindi controlla esplicitamente e impone che tutti i file siano locali.
Esistono due soluzioni comuni:
-
Costruisci il codice remoto come lib separata (o tramite un'altra sottoprogetto / directory nello stesso progetto
build
, o usando un passo di compilazione indipendente). -
Posiziona uno stub locale per ogni file sorgente remoto che contiene
#include " ../../ remote_source.cpp
e aggiungi questo stub locale aSOURCES =
, invece. Funzionerà, mabuild
/nmake
non terrà traccia delle dipendenze inremote_source.cpp
. Seremote_source.cpp
cambia, dovraitoccare
l'origine proxy locale o forzare in altro modo una ricostruzione (elimina l'obj proxy locale, eseguibuild con
-cZ
, o altrimenti).
Altri suggerimenti
Un modo alternativo è usare source.inc per includere questi file.
Odio risorgere un argomento molto vecchio, ma mi sono appena imbattuto anche in questo.
Un modo alternativo alternativo è quello di creare un altro file di sorgenti all'interno che costruisca esclusivamente file di oggetti della fonte remota, quindi fondamentalmente un file chiamato somewhere_else \ sources e assegnargli la stessa directory intermedia.
Quindi aggiungi un file 'dirs' alla tua directory originale e specifica quella cartella remota all'interno. Quindi collegare direttamente al file oggetto aggiungendo qualcosa di simile al file sorgente originale:
$(TARGETLIBS) = $(PROJECT_OBJ_ROOT)\$(O)\source.obj
In questo modo, non è necessario compilare come lib, ma costruire lo tratta come uno e si collega senza alcun controllo delle dipendenze o cura della posizione.
Naturalmente potresti riscontrare alcuni problemi se dai loro la stessa directory intermedia e lo stesso nome del file sorgente originale (source.cpp)