2011-03-04 11 views
8

que añade¿Cómo hacer referencia al directorio fuente en qmake?

version.target = version.h 
version.commands = bash generate-version.sh 

QMAKE_EXTRA_TARGETS += version 

PRE_TARGETDEPS += version.h 

al proyecto, pero los intentos de ejecutar "generate-version.sh" en el directorio de destino:

make: Leaving directory `.../qqq-build-desktop' 
make: Entering directory `.../qqq-build-desktop' 
Makefile:236: warning: overriding commands for target `version.h' 
Makefile:233: warning: ignoring old commands for target `version.h' 
bash generate-version.sh 
bash: generate-version.sh: No such file or directory 
make: Leaving directory `.../qqq-build-desktop' 

Hay $$ DESTDIR, pero no veo $$ SRCDIR. ¿Cómo hacer referencia al directorio del proyecto en qmake (o cómo reescribir esto)?

Respuesta

10

Mi primer pensamiento es tratar de reescribir

version.commands = bash generate-version.sh 

con el fin de no tener que invocar un script de shell. Tal vez se puede combinar todas las declaraciones en una sola línea:

version.commands = echo \'char VERSION[]=\"1.0\";\' > version.h && ls && echo Done 

Si le pegan con la invocación de la secuencia de comandos, probablemente, las personas con discapacidad o OUT_PWD son lo que busca. Desde el qmake Variable Reference

PWD

Esta variable contiene la ruta completa que lleva al directorio donde se encuentra el archivo de proyecto qmake (project.pro).

OUT_PWD

Esta variable contiene la ruta completa que lleva al directorio donde qmake coloca el Makefile generado.

La única advertencia que no se menciona en la documentación es que si está haciendo un qmake recursivo, PWD se refiere a dónde se leyó el archivo .pro de nivel superior. Por lo tanto, si ejecuta qmake -r desde {proj-root}, cuando sub/sub/sub/dir-proj.pro finalmente se lee, PWD aún apuntará a {proj-root}.

Suponiendo que generate-version.sh está en el mismo directorio que el archivo .pro nivel superior, puede intentar:

version.commands = bash $$PWD/generate-version.sh 
+0

De todos modos es necesario acceder a los directorios ".git" o ".svn" para obtener la versión, por lo que necesitamos $$ PWD en cualquier caso. –

+1

Si se usa dentro del archivo .pri incluido, PWD dirige al directorio donde reside .pri, no el directorio original del archivo .pro. Qt menos int Qt 5.6. ¿Hay alguna forma de obtener el directorio .pro original en el archivo .pri ...? –

1

He encontrado una solución mejor y más limpio

version.target = version.h 
version.commands = bash ${QMAKE_VAR__PRO_FILE_PWD_}/generate-version.sh 
QMAKE_EXTRA_TARGETS += version 

El variable _PRO_FILE_PWD_ está documentado desde qt 4.5 y contiene la ruta al directorio que contiene el archivo de proyecto en uso (contiene el archivo .pro)

Pero para acceder a esta variable para QMAKE_EXTRA_TARGETS, debe anexarse ​​QMAKE_VAR_.

+0

Parece que no funciona. Cuando reemplazo '$$ PWD' por' $ {QMAKE_VAR__PRO_FILE_PWD_} 'no se compila. Makefile contiene el literal '$ {QMAKE_VAR__PRO_FILE_PWD_}'. –

+0

¿Cuál es su versión de qtcreator – benjarobin

+0

que estaba comprobando con simple "qmake-qt4". 'QMake versión 2.01a' ahora (no sé la versión en el momento en que lo estaba probando). –

0

PWD

Especifica la ruta completa que lleva al directorio que contiene el archivo actual siendo analizada. Esto puede ser útil para hacer referencia a los archivos dentro de el árbol fuente al escribir archivos de proyecto para admitir compilaciones ocultas.

0

I usar (Linux y g ++)

DEFINES += SVN_VERSION=\\\"\""`svnversion $$PWD`\""\\\" 
DEFINES += COMPILE_DATE=\\\"\""`date`\""\\\" 
DEFINES += SW_VERSION=\\\"\"0.5\"\\\" 

que define el SVNVERSON macro a ser la versión SVN. Para acceder a él desde C++:

QString svnVersion = SVN_VERSION; 
QString swVersion = SW_VERSION; 

Explicación: En la cáscara Quiero ver a esta llamada:

-DSVN_VERSION=\""`svnversion /path/to/my/source`"\" 

Como se puede ver algunas de escape son necesarios en el nivel de la cáscara. En el archivo .pro, debe escaparse dos veces.

0

Esto funciona y es fácil de entender.

version.commands = (cd $${PWD}; generate-version.sh) 
Cuestiones relacionadas