cmake ctags

ejecutar un comando de shell(ctags) en cmake y hacer



(3)

La forma más básica de hacer esto es:

set_source_files_properties( tags PROPERTIES GENERATED true) add_custom_command ( OUTPUT tags COMMAND ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) add_executable ( MyProjectOutput tags )

La primera línea le dice a CMake que se generarán las tags . add_custom_command es CMake generará tags cuando sea necesario, y finalmente, algún objetivo debe depender de las tags . El directorio de trabajo predeterminado está en el árbol de compilación, por lo que WORKING_DIRECTORY debe establecerse en su árbol de origen. Esto es equivalente a una entrada Makefile:

tags: ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . MyProjectOutput: tags # Whatever here...

Estoy codificando un proyecto de C ++ en vim.

Me gustaría ejecutar un comando ctags ( ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . ) Para generar referencias cuando ejecuto make.

Creo que la forma de hacerlo es usar add_custom_command pero me confundo sobre cómo integrarlo en CMakeLists.txt.


Nueva solución:

Creo que CMake cambió desde que se dio la respuesta anterior.
Aquí están las líneas que agregué en mi CMakeLists.txt (probado con la versión 2.8.12):

# Add "tags" target and make my_project depending on this target. set_source_files_properties(tags PROPERTIES GENERATED true) add_custom_target(tags COMMAND ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) add_dependencies(my_project tags)

Y funciona perfectamente ahora!


Las respuestas de Daniel y Creak me ayudaron a comenzar, pero terminé con una solución más compleja que pensaba compartir:

# Add a top-level "tags" target which includes all files in both # the build and source versions of src/*. set_source_files_properties(tags PROPERTIES GENERATED true) add_custom_target(tags COMMAND ctags -R --c++-kinds=+p --fields=+iaS --extra=+q ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} COMMAND ln -sf ${CMAKE_CURRENT_BINARY_DIR}/tags ${CMAKE_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) # ...but only make it a dependency of the project if the ctags program # is available, else it will fail to build on Windows. find_program(CTAGS_PATH ctags) if(CTAGS_PATH) message(STATUS "Found ctags: ${CTAGS_PATH}") add_dependencies(MyProjecct tags) endif(CTAGS_PATH)

Hace varias cosas que las soluciones más simples no:

  1. Solo agrega "etiquetas" como una dependencia del producto de compilación principal ( MyProject ) si realmente hay un programa de ctags en el sistema. No queremos romper la compilación solo porque sea Windows, o porque simplemente no se han instalado ctags en el sistema de compilación.

  2. Extrae símbolos de los archivos de origen tanto en el directorio de compilación como en el de origen. Esto importa en un par de casos.

    En primer lugar, es posible que esté utilizando configure_file() y provenga de un fondo de Autotools, por lo que ha nombrado sus verdaderos archivos fuente *.in , lo que significa que ctags -R no los escaneará. Lo necesita para escanear las versiones generadas en el directorio de compilación. Por ejemplo, puede tener src/mainheader.h.in en su árbol de fuentes, con el número de versión del proyecto automáticamente incluido en él como build/src/mainheader.h .

    Segundo, algunos de tus archivos "fuente" pueden ser generados por otras herramientas. En mi proyecto actual, tengo un par de archivos de encabezado C ++ que son generados por los scripts de Perl. Quiero símbolos tanto de los encabezados generados como de Perl en el archivo de etiquetas.

  3. Funciona en un subdirectorio.

    En el proyecto en el que estoy trabajando en este momento, el producto de compilación principal está hecho desde src/* relativo a la raíz del proyecto, y solo quiero símbolos de ese subárbol en el archivo de etiquetas. No quiero que incluya símbolos de las pruebas unitarias, los ejemplos o las secuencias de comandos de la utilidad.

    Debido a que está diseñado para ejecutarse en un subdirectorio, crea un enlace simbólico al archivo src/tags en la parte superior del directorio de compilación, de modo que vi -t TagName funcione. (Supongo que si ctags existe, ln hace).