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:
Solo agrega "etiquetas" como una dependencia del producto de compilación principal (
MyProject
) si realmente hay un programa dectags
en el sistema. No queremos romper la compilación solo porque sea Windows, o porque simplemente no se han instaladoctags
en el sistema de compilación.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 quectags -R
no los escaneará. Lo necesita para escanear las versiones generadas en el directorio de compilación. Por ejemplo, puede tenersrc/mainheader.h.in
en su árbol de fuentes, con el número de versión del proyecto automáticamente incluido en él comobuild/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.
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 quevi -t TagName
funcione. (Supongo que sictags
existe,ln
hace).