2010-07-08 19 views
106

Estoy considerando cambiar un proyecto de plataforma cruzada de sistemas de administración de compilación separados en Visual C++, XCode y makefiles a CMake.CMake - ¿Agregar automáticamente todos los archivos de una carpeta a un destino?

Una característica esencial que necesito es agregar automáticamente todos los archivos en un directorio a un destino. Si bien esto es fácil de hacer con make, no es factible con Visual C++ y XCode (corríjanme si estoy equivocado). ¿Es posible hacerlo directamente en CMake? ¿Cómo?

Siéntase libre de agregar cualquier otra cosa que deba tener en cuenta antes de ir a aprender CMake, considerando que actualmente el proyecto es de tamaño medio (8 bibliotecas, 2 ejecutables, 8 proyectos de prueba y depende de 8 bibliotecas externas)

+0

Por cierto. en In Visual Studio, al menos en proyectos C#, hay un botón en la barra de herramientas en el explorador del proyecto, llamado mostrar todos los archivos. Hace que todos los subdirectorios de un proyecto sean visibles, atenuados si no contienen ningún archivo lógicamente incluido en el proyecto. Puede incluir estos directorios a través del menú contextual, que incluye todos los archivos fuente dentro de ellos, recursivamente :) – yeoman

Respuesta

154

Es posible. P.ej. con file(GLOB:

cmake_minimum_required(VERSION 2.8) 

file(GLOB helloworld_SRC 
    "*.h" 
    "*.cpp" 
) 

add_executable(helloworld ${helloworld_SRC}) 

Tenga en cuenta que esto requiere manual de de volver a ejecutar de cmake si se añade un archivo de origen o se elimina, ya que el sistema de construcción generados no sabe cuándo pedir CMake para regenerar, y hacerlo en cada compilación aumentaría el tiempo de compilación.

+8

Una alternativa para volver a ejecutar manualmente cmake es tocar el archivo CMakeLists.txt antes de ejecutar make. –

+1

Alternativa a 'GLOB': [' archivo (variable GLOB_RECURSE [ruta RELATIVA] [FOLLOW_SYMLINKS] [expresiones globbing] ...) '] (https://cmake.org/cmake/help/v3.0/command/ file.html). – Hydro

+2

> "No recomendamos usar GLOB para recopilar una lista de archivos fuente de su árbol de fuentes. Si no se agrega o elimina un archivo CMakeLists.txt, el sistema de compilación generado no puede saber cuándo solicitar la regeneración de CMake". Esto ya no se recomienda en documentos CMAKE3.7 vinculados por Hand1Cloud – triple

27

La respuesta por Kleist ciertamente funciona, pero hay una advertencia importante:

Cuando se escribe un Makefile manualmente, es posible generar una variable SRCS utilizar una función para seleccionar todos los archivos .cpp y .h. Si posteriormente se agrega un archivo de origen, se lo volverá a ejecutar make.

Sin embargo, CMake (con un comando como file(GLOB ...)) generará explícitamente una lista de archivos y la colocará en el Makefile autogenerado. Si tiene un nuevo archivo fuente, deberá volver a generar el Makefile volviendo a ejecutar cmake.

editar: No es necesario eliminar el archivo Makefile.

+4

No se puede volver a ejecutar simplemente, lo que debería eliminar/modificar el Makefile obsoleto? – Ethan

+1

Ethan: acaba de probarlo, está en lo correcto. Editó la respuesta. –

+7

Esto no es una respuesta, es un comentario sobre la respuesta de @ Kleist – Neowizard

Cuestiones relacionadas