¿Es posible hacer que Microsoft build.exe incluya fuentes de directorios remotos?
Pregunta
Adición de archivos de origen a más de un directorio (por ejemplo, ../../source.cpp o ../../../somewhere_else/source.cpp, en lugar de solo source.cpp o ../source. cpp) a la declaración SOURCES = en una compilación WDK / DDK produce el siguiente error:
Ignoring invalid directory prefix in SOURCES= entry
¿Es posible incluir archivos de origen remotos en una compilación?
Solución
No es posible hacer esto directamente. build
está diseñado explícitamente solo para tratar con
Código fuente en el mismo directorio o en el directorio principal del archivo sources
. No puede usar archivos de origen de ubicaciones arbitrarias. En particular, su sistema de seguimiento de dependencias parece incapaz de analizar y rastrear archivos remotos y, por lo tanto, verifica y aplica explícitamente que todos los archivos sean locales.
Hay dos soluciones comunes:
-
Cree el código remoto como una biblioteca separada (ya sea a través de otro subproyecto / directorio en el mismo proyecto
build
, o usando un paso de compilación independiente). -
Coloque un apéndice local para cada archivo de origen remoto que haga
#include " ../../ remote_source.cpp
, y agregue este apéndice local alSOURCES =
lista, en su lugar. Esto funcionará, perobuild
/nmake
no not rastreará las dependencias enremote_source.cpp
. Siremote_source.cpp
cambia, deberátocar
la fuente del proxy local o, de lo contrario, forzar una reconstrucción (elimine el proxy local obj, ejecutebuild con
-cZ
, o de otro modo).
Otros consejos
Una forma alternativa es usar source.inc para incluir estos archivos.
Odio resucitar un tema super viejo, pero también me encontré con esto.
Una forma alternativa alternativa es crear otro archivo de fuentes dentro que solo genere archivos de objetos de la fuente remota, así que básicamente un archivo llamado somewhere_else \ sources , y darle el mismo directorio intermedio.
Luego agregue un archivo 'dirs' a su directorio original y especifique esa carpeta remota en su interior. Luego vincule directamente al archivo de objeto agregando algo como esto al archivo de fuentes original:
$(TARGETLIBS) = $(PROJECT_OBJ_ROOT)\$(O)\source.obj
De esta manera, no tiene que compilar como lib, sino que la compilación se trata como una y se vincula sin ninguna verificación de dependencia o cuidado de la ubicación.
Naturalmente, puede tener algunos problemas si les da el mismo directorio intermedio y el mismo nombre de archivo de origen original (source.cpp)