Difference between revisions of "Tutorial CMake"

From Asociación de Robótica UC3M
Jump to navigation Jump to search
Line 11: Line 11:
 
Habrá veces que quieras crear tu proyecto, que proporcione las bondades de CMake. ¿Cómo hacerlo? En general, si tienes una carpeta con muchos .cpp y .h, aquí tienes un fichero CMakeLists.txt que servirá si el proyecto no tiene dependencias adicionales:
 
Habrá veces que quieras crear tu proyecto, que proporcione las bondades de CMake. ¿Cómo hacerlo? En general, si tienes una carpeta con muchos .cpp y .h, aquí tienes un fichero CMakeLists.txt que servirá si el proyecto no tiene dependencias adicionales:
  
# Gracias "yarp cmake"!
+
<syntaxhighlight lang="cmake">
+
# Gracias "yarp cmake"!
cmake_minimum_required(VERSION 2.8.7)
+
 
+
cmake_minimum_required(VERSION 2.8.7)
set(KEYWORD "ejectutable")  # sustituye la palabra ejecutable por la que quieras
+
 
+
set(KEYWORD "ejectutable")  # sustituye la palabra ejecutable por la que quieras
# Start a project.
+
 
project(${KEYWORD})
+
# Start a project.
+
project(${KEYWORD})
# Search for source code.
+
 
file(GLOB folder_source *.cpp *.cc *.c)
+
# Search for source code.
file(GLOB folder_header *.h)
+
file(GLOB folder_source *.cpp *.cc *.c)
source_group("Source Files" FILES ${folder_source})
+
file(GLOB folder_header *.h)
source_group("Header Files" FILES ${folder_header})
+
source_group("Source Files" FILES ${folder_source})
+
source_group("Header Files" FILES ${folder_header})
# Automatically add include directories if needed.
+
 
foreach(header_file ${folder_header})
+
# Automatically add include directories if needed.
  get_filename_component(p ${header_file} PATH)
+
foreach(header_file ${folder_header})
  include_directories(${p})
+
  get_filename_component(p ${header_file} PATH)
endforeach(header_file ${folder_header})
+
  include_directories(${p})
+
endforeach(header_file ${folder_header})
# Set up our main executable.
+
 
if (folder_source)
+
# Set up our main executable.
  add_executable(${KEYWORD} ${folder_source} ${folder_header})
+
if (folder_source)
  target_link_libraries(${KEYWORD})
+
  add_executable(${KEYWORD} ${folder_source} ${folder_header})
else (folder_source)
+
  target_link_libraries(${KEYWORD})
  message(FATAL_ERROR "No source code files found. Please add something")
+
else (folder_source)
endif (folder_source)
+
  message(FATAL_ERROR "No source code files found. Please add something")
 +
endif (folder_source)
 +
</syntaxhighlight>
  
 
...y ya está!!!
 
...y ya está!!!

Revision as of 18:33, 10 February 2014

CMake es una herramienta software para la compilación multiplataforma. Esto es, para Linux puede generar ficheros Makefile, para Windows puede generar proyectos de Visual Studio, etc.

Reconocerás que un proyecto utiliza CMake por un fichero que se llama "CMakeLists.txt". Si estás en la raíz del proyecto y ves este fichero, la buena práctica para compilar el proyecto en una terminal es:

mkdir build; cmake ..; make

...ya está!

Generar un CMakeLists.txt

Habrá veces que quieras crear tu proyecto, que proporcione las bondades de CMake. ¿Cómo hacerlo? En general, si tienes una carpeta con muchos .cpp y .h, aquí tienes un fichero CMakeLists.txt que servirá si el proyecto no tiene dependencias adicionales:

# Gracias "yarp cmake"!

cmake_minimum_required(VERSION 2.8.7)

set(KEYWORD "ejectutable")  # sustituye la palabra ejecutable por la que quieras

# Start a project.
project(${KEYWORD})

# Search for source code.
file(GLOB folder_source *.cpp *.cc *.c)
file(GLOB folder_header *.h)
source_group("Source Files" FILES ${folder_source})
source_group("Header Files" FILES ${folder_header})

# Automatically add include directories if needed.
foreach(header_file ${folder_header})
  get_filename_component(p ${header_file} PATH)
  include_directories(${p})
endforeach(header_file ${folder_header})

# Set up our main executable.
if (folder_source)
  add_executable(${KEYWORD} ${folder_source} ${folder_header})
  target_link_libraries(${KEYWORD})
else (folder_source)
  message(FATAL_ERROR "No source code files found. Please add something")
endif (folder_source)

...y ya está!!!