c++ - directories - ¿Cómo hacer que CMake muestre encabezados(que no forman parte de ningún objetivo binario) en el IDE?
cmake include directories (2)
Puede usar el nuevo comando target_sources
en CMake 3.1.
add_library(moduleA INTERFACE)
target_include_directories(moduleA INTERFACE ...)
target_sources(moduleA INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/utility.h
${CMAKE_CURRENT_SOURCE_DIR}/moreUtilities.h
)
También es transitivo.
http://www.cmake.org/cmake/help/v3.1/command/target_sources.html#command:target_sources
La limitación de no poder exportar destinos que tienen INTERFACE_SOURCES se ha eliminado para CMake 3.3.
En nuestro flujo de trabajo, podemos tener un módulo A que se compone de varios archivos de encabezado, el módulo A no produce ningún binario (nota al margen: obviamente será utilizado por otros módulos, que incluyen algunos de los encabezados del módulo A para producir binarios) .
Un buen ejemplo sería una biblioteca de solo encabezado, para la cual CMake 3 presenta un buen soporte gracias a la noción de biblioteca INTERFACE
(consulte esta respuesta SO y la documentación de la característica de CMake).
Podemos hacer un destino de biblioteca de interfaz fuera del módulo A :
add_library(module_A INTERFACE)
Eso nos da todas las características agradables de CMakes target (es posible usarlo como una dependencia de otro target, exportarlo, reenviar de forma transitiva los requisitos, etc.)
Pero en este caso, los encabezados en el módulo A no se muestran en nuestro IDE (Xcode, sin embargo, esperamos que sea igual con la mayoría / todos los demás IDE).
Esto demuestra ser un gran inconveniente en el flujo de trabajo, ya que necesitamos que los archivos que componen el módulo A se muestren en el IDE para la edición. ¿Es posible lograr eso?
Varios meses después, no encontré una forma de listar directamente los archivos de encabezado de una biblioteca INTERFACE
.
Como la pregunta aún tiene algunas opiniones, esto es lo que terminé haciendo (es decir, lo que parece ser el truco menor actualmente disponible).
Imagine el módulo A es una biblioteca de encabezado solamente. En el CMakeLists.txt declarando su objetivo:
# Define ''modA_headers'' variable to list all the header files
set(modA_headers
utility.h
moreUtilities.h
...)
add_library(moduleA INTERFACE) # ''moduleA'' is an INTERFACE pseudo target
#
# From here, the target ''moduleA'' can be customised
#
target_include_directories(moduleA ...) # Transitively forwarded
install(TARGETS moduleA ...)
#
# HACK: have the files showing in the IDE, under the name ''moduleA_ide''
#
add_custom_target(moduleA_ide SOURCES ${modA_headers})
No acepto esta respuesta, ya que espero que las nuevas versiones de CMake ofrezcan un enfoque más semánticamente correcto, que luego será aceptado:)