Tutoriales y Manuales
Entradas Mensuales
-
►
2024
(Total:
1090
)
- ► septiembre (Total: 50 )
-
►
2023
(Total:
710
)
- ► septiembre (Total: 65 )
-
►
2022
(Total:
967
)
- ► septiembre (Total: 72 )
-
►
2021
(Total:
730
)
- ► septiembre (Total: 56 )
-
►
2020
(Total:
212
)
- ► septiembre (Total: 21 )
-
►
2019
(Total:
102
)
- ► septiembre (Total: 14 )
-
►
2017
(Total:
231
)
- ► septiembre (Total: 16 )
-
►
2016
(Total:
266
)
- ► septiembre (Total: 38 )
-
▼
2015
(Total:
445
)
- ► septiembre (Total: 47 )
-
▼
junio
(Total:
73
)
- ¿Java dejará de funcionar en Google Chrome?
- La IEEE y la IET realizan con éxito Tests de Priva...
- El ministro de justicia japonés apaga su ordenador...
- Apple bloquea las versiones de Adobe Flash antigua...
- Microsoft añade silenciosamente 17 nuevos certific...
- El FBI advirtió a las compañías de USA para evitar...
- Secure Sockets Layer versión 3.0 (SSLv3) no es lo ...
- El proyecto de cifrado gratuito Let's Encrypt entr...
- Gmail ya permite deshacer el envío de un e-mail
- Java deja atrás la barra de Ask al ser considerada...
- Experimento Robin: Envía a 97.931 personas sus con...
- TrendMicro: un simple keylogger puede costar millo...
- La Europol detiene a una banda acusada de propagar...
- Disponible distribución PFSense 2.2.3 especializad...
- La NSA establece su presencia en GitHub para compa...
- La botnet Andromeda infecta con malware financiero...
- Msfvenom Payload Creator (MPC) para Metasploit
- HackerOne recibe una inversión de 25 millones de d...
- Facebook elimina el malware de 2 millones de orden...
- Investigador de Google encuentra una vulnerabilida...
- HardenFlash, Adobe Flash Player a prueba de exploi...
- Segunda actualización de seguridad en un mes para ...
- Las compañias de Antivirus también son objetivo de...
- Tutorial de CMake
- España, el segundo país Europeo con más infectados...
- DD4BC extorsiona pidiendo dinero en Bitcoins a cam...
- La Casa Blanca quiere que todos los organismos ofi...
- Bug en favicon.ico permite colgar Firefox, Chrome ...
- Múltiples vulnerabilidades incluyendo una crítica ...
- Tipos de Ataques DDoS con la botnet AthenaHTTP
- El buscador Shodan también disponible para Android
- Skype basado en Web (Beta) disponible en todo el m...
- Los creadores del malware Duqu 2.0 usaron certific...
- Lanzar un ataque DDoS sale barato: sólo 38 dólares...
- Google anuncia su programa de recompensas por enco...
- El ordenador de Angela Merkel infectado con un tro...
- La página web de peticiones de Uber atacada
- La noche temática de La 2 - Términos y condiciones...
- Canal + ha sido hackeado, y los datos comprometido...
- El ransomware Tox estaba dirigido a los pedófilos
- La Wikipedia usará HTTPS por defecto
- Un año de prisión por realizar ataques DDoS con la...
- Facebook Infer, herramienta de código libre para d...
- Un joven americano de 17 años se declara culpable ...
- Malware Poweliks se esconde en el registro de Wind...
- Detenidas 10 personas en España por fraude cibérne...
- Mozilla Firefox incrementa las recompensas por rep...
- Bélgica detiene a terroristas espiando sus mensaje...
- Duqu 2.0: la herramienta más sofisticada del ciber...
- Adobe Flash Player 18.x soluciona 13 vulnerabilida...
- Tesla Motors ofrece 1.000$ a quién sea capaz de ha...
- Medusa: herramienta para realizar ataques por fuer...
- microSD de 512GB presentado en el Computex 2015
- Página web del Ejército de EE.UU. hackeada por el ...
- REMnux: Distribución de Linux especializada en en ...
- IX Congreso OWASP sobre ciberseguridad en Barcelona
- La Policía detiene a uno de los uploaders más acti...
- Drupal también pagará recompensas a los que encuen...
- Dropbox prohibe usar 85.000 palabras como contrase...
- El creador del ransmoware Tox decide vender su neg...
- Hector Xavier Monsegur aka Sabu vuelve a Twitter t...
- Open Sesame, un nuevo gadget para abrir puertas de...
- El creador del malware RomberTik es un nigeriano d...
- Pentest Box: pentesting en línea de comandos para ...
- Intel presenta en Computex el Thunderbolt 3 con co...
- Servicios automatizados de análisis de Malware online
- El servicio de Pensiones de Japón ha sido hackeado
- Un simple mensaje de texto puede colgar Skype
- Sourceforge secuestra la cuenta de Nmap
- ASUS resucita los netbooks con un nuevo modelo
- El fundador de Silk Road sentenciado a cadena perp...
- Vuelve el Virus de la Polícia para Android
- El creador del ransomware Locker publica las llave...
-
►
2014
(Total:
185
)
- ► septiembre (Total: 18 )
-
►
2013
(Total:
100
)
- ► septiembre (Total: 3 )
-
►
2011
(Total:
7
)
- ► septiembre (Total: 1 )
Blogroll
Etiquetas
seguridad
(
396
)
privacidad
(
364
)
google
(
355
)
ransomware
(
341
)
vulnerabilidad
(
305
)
Malware
(
265
)
Windows
(
246
)
android
(
244
)
cve
(
237
)
tutorial
(
237
)
manual
(
222
)
software
(
206
)
hardware
(
196
)
linux
(
127
)
twitter
(
117
)
ddos
(
95
)
WhatsApp
(
92
)
Wifi
(
85
)
cifrado
(
77
)
herramientas
(
75
)
hacking
(
73
)
sysadmin
(
68
)
app
(
65
)
Networking
(
57
)
nvidia
(
53
)
ssd
(
51
)
youtube
(
50
)
firmware
(
44
)
adobe
(
43
)
office
(
41
)
hack
(
40
)
firefox
(
36
)
contraseñas
(
32
)
eventos
(
32
)
antivirus
(
31
)
juegos
(
31
)
cms
(
30
)
flash
(
28
)
anonymous
(
27
)
apache
(
26
)
MAC
(
25
)
programación
(
25
)
exploit
(
23
)
multimedia
(
23
)
javascript
(
22
)
Kernel
(
20
)
ssl
(
19
)
SeguridadWireless
(
17
)
documental
(
16
)
Forense
(
15
)
conferencia
(
15
)
Debugger
(
14
)
lizard squad
(
14
)
técnicas hacking
(
13
)
auditoría
(
12
)
delitos
(
11
)
metasploit
(
11
)
Virtualización
(
10
)
adamo
(
9
)
reversing
(
9
)
Rootkit
(
8
)
Ehn-Dev
(
7
)
MAC Adress
(
6
)
antimalware
(
6
)
oclHashcat
(
5
)
Entradas populares
-
Después de ver qué es una vCPU y la diferencia entre núcleos (cores) e hilos en los procesadores, pasamos a explicar toda la nomenclatura d...
-
iperf3 es la última versión del popular programa iperf para medir el ancho de banda entre dos o más equipos en red local o Internet . Es...
-
A finales del mes de agosto hablábamos de que los legisladores estadounidense habían solicitado la investigación de TP-Link . Y así, ya ten...
Tutorial de CMake
martes, 23 de junio de 2015
|
Publicado por
el-brujo
|
Editar entrada
CMake se trata de una herramienta multiplataforma para generar
instrucciones de compilación del código. No sustituye a las herramientas
de compilación como Make o MSBuild, sino que nos proporciona un único
lenguaje que será transformado a las instrucciones del sistema operativo
donde nos encontremos. Sería un sustituto de Autotools.
CMake es una herramienta desarrollada inicialmente para poder compilar de forma multiplataforma la librer a VTK como un desarrollo interno, pero que ha sido publicada como herramienta de Software Libre
CMake es software libre y lanzado bajo la licencia BSD. Es desarrollado por Kitware Inc.
Grandes proyectos como Apache, MySQL, KDE se han ido pasando de GNU autotools (automake, autoconf, libtool) a CMake en los últimos años.
CMake:
Las ventajas son que no tenemos que tener varios archivos para gestionar la compilación. Usando CMake podemos generar el resto. Actualmente CMake (3.2.3) soporta:
Podemos ajustar las variables de CMake desde la interfaz de usuario, usando el modo interactivo de la línea de comandos (
Dicho chero es el encargado de indicar toda la informaci on necesaria:
Ya estamos listos para crear nuestro primer archivo de configuración de CMake.
Vamos a ir viendo distintas versiones del archivo donde voy a ir añadiendo diferentes tareas. Estate atento a los comentarios de los archivos
Y ya está. Si quieres saber las flags que se usaran al llamar al compilador mira algunas variables interesantes
Esto tiene un inconveniente y es que CMake no detecta automáticamente
si hay nuevos archivos que cumplen la característica, por lo que hay
que forzar la recarga.
Muchas más en la wiki de CMake
Esto hará que los ejecutables construidos en UNIX puedan cargar librerías desde la carpeta donde se encuentran. Al estilo Windows.
Fuente:
http://adrianarroyocalle.github.io/blog/2015/06/22/tutorial-de-cmake/
CMake es una herramienta desarrollada inicialmente para poder compilar de forma multiplataforma la librer a VTK como un desarrollo interno, pero que ha sido publicada como herramienta de Software Libre
CMake es software libre y lanzado bajo la licencia BSD. Es desarrollado por Kitware Inc.
Grandes proyectos como Apache, MySQL, KDE se han ido pasando de GNU autotools (automake, autoconf, libtool) a CMake en los últimos años.
¿Qu é es CMake?
CMake:
- Genera fi cheros de compilaci ón.
- Unix/Linux --> Makefiles
- Windows --> Proyectos Visual Studio.
- Apple --> Xcode.
- Multiplataforma.
- Utilizado en entornos complejos (VTK+, KDE4, . . . ).
- Flexible y Extensible.
- Soporte de macros (buscar/con gurar software).
- Ejecutar programar externos.
- Syntaxis Intuitiva.
- Modos de compilaci on (Debug, Release, . . . ).
- Admite jerarqu a de directorios complejas, y detecta librer as.
Diferencias entre AutoTools y Cmake
GNU build system aka AutoToolsconfigure Command | CMake Command |
./configure | cmake . |
./configure --help | cmake . -LH or ccmake . |
rm config.cache
CMake (Unix):make clean
rm CMakeCache.txt
CMake (Windows):devenv MySQL.sln /clean
del CMakeCache.txt
Las ventajas son que no tenemos que tener varios archivos para gestionar la compilación. Usando CMake podemos generar el resto. Actualmente CMake (3.2.3) soporta:
- Unix Make
- Ninja
- CodeBlocks
- Eclipse CDT
- KDevelop
- Sublime Text 2
- Borland Make
- MSYS Make
- MinGW Make
- NMake
- NMake JOM
- Watcom WMake
- Kate
- CodeLite
- Xcode
- Visual Studio (desde el 6 hasta 2013)
Usando CMake
En CMake las configuraciones estan centralizadas por defecto en un archivo llamado CMakeLists.txt. Este se encuentra en la carpeta central del proyecto. Normalmente con CMake los proyectos se construyen en una carpeta diferente de la que tenemos el código fuente. Es corriente crear una carpetabuild
en lo alto del proyecto. Así si tenemos un proyecto con CMake ya descomprimido haríamos lo siguiente.mkdir build cd build cmake .. # make o ninja o nmake o lo que toque
También puedes usar la aplicación gráfica. Muy cómoda cuando debamos modificar las configuraciones.Podemos ajustar las variables de CMake desde la interfaz de usuario, usando el modo interactivo de la línea de comandos (
cmake .. -i
) o usando flags cuando llamamos a CMake (cmake .. -DCMAKE_CXX_FLAGS=-std=c++11
)El archivo CMakeLists.txt
Para aplicar la herramienta para compilar un proyecto s olo es necesario generar un fi chero CMakeLists.txt.Dicho chero es el encargado de indicar toda la informaci on necesaria:
- Los ficheros a compilar.
- Las librer as y ejecutables a generar.
- Librer as de las que depende.
- Par ametros adicionales.
- Programas externos a utilizar (doxygen, . . . ).
Ya estamos listos para crear nuestro primer archivo de configuración de CMake.
Vamos a ir viendo distintas versiones del archivo donde voy a ir añadiendo diferentes tareas. Estate atento a los comentarios de los archivos
Compilar como programa main.cpp
PROJECT(MiProyecto)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
# Indicamos la versión mínima que necesitamos de CMake
SET(MiProyecto_SRC "src/main.cpp")
# Creamos la variable MiProyecto_SRC y le asignamos el valor "src/main.cpp" que es la ubicación de nuestro archivo.
# Por defecto las variables son listas o arrays
# Si tenemos dos archivos sería SET(MiProyecto_SRC "src/main.cpp"
"src/segundo.cpp")
# Se permite multilínea
ADD_EXECUTABLE(MiProyecto ${MiProyecto_SRC})
# Se creará un ejecutable llamado MiProyecto en Linux o MiProyecto.exe en Windows.
# Se hace referencia a las variables con ${NOMBRE_VARIABLE}.
Trabajar con opciones y condicionales
CMake permite ajustar muchas opciones como hemos visto con el asistente gráfico de CMake. Sin embargo no todas las variables se muestran ahí. Solo son modificables las que nosotros marquemos explícitamente. Se usa OPTION()PROJECT(MiProyecto) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) SET(MiProyecto_SRC "src/main.cpp") OPTION(EXPERIMENTAL_FEATURE "Activar característica experimental" OFF) # OPTION(NOMBRE_VARIABLE DESCRIPCION_LEGIBLE VALOR_POR_DEFECTO) # ON/OFF es la pareja de valores booleanos en CMake. TRUE/FALSE también es correcto IF(EXPERIMENTAL_FEATURE) # El condicional más básico LIST(APPEND MiProyecto_SRC "experimental_feature.cpp") # Añadimos un elemento a la lista # También se puede hacer con # SET(MiProyecto_SRC ${MiProyecto_SRC} "experimental_feature.cpp") ENDIF() ADD_EXECUTABLE(MiProyecto ${MiProyecto_SRC})
Usar librería estática
PROJECT(MiProyecto C CXX) # Podemos marcar opcionalmente los lenguajes para que CMake busque los compiladores CMAKE_MINIMUM_REQUIRED(VERSION 2.8) SET(MiProyecto_SRC "src/main.cpp") SET(Lib_SRC "lib/lib.cpp") ADD_LIBRARY(Lib STATIC ${Lib_SRC}) # El comando es exactamente igual que ADD_EXECUTABLE, pero marcamos si STATIC o SHARED ADD_EXECUTABLE(MiProyecto ${MiProyecto_SRC}) TARGET_LINK_LIBRARIES(MiProyecto ${Lib}) # Necesitamos "unir" la librería con nuestro ejecutable # Si necesitamos una librería tal cual usamos su nombre # TARGET_LINK_LIBRARIES(MiProyecto pthread) # Se pueden hacer las llamadas que se quiera a TARGET_LINK_LIBRARIES
Usar librería dinámica
PROJECT(MiProyecto) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) SET(MiProyecto_SRC "src/main.cpp") SET(Lib_SRC "lib/lib.cpp") ADD_LIBRARY(Lib SHARED ${Lib_SRC}) ADD_EXECUTABLE(MiProyecto ${MiProyecto_SRC}) TARGET_LINK_LIBRARIES(MiProyecto ${MiProyecto_SRC})
Seleccionar archivos de forma masiva
Usar SET para los archivos es muy fácil de entender, pero es posible que no queramos mantener una lista explícita del código fuente.
PROJECT(MiProyecto)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
FILE(GLOB MiProyecto_SRC "src/*.cpp")
# FILE GLOB selecciona todos los archivos que cumplan la característica y los almacena en MiProyecto_SRC
# GLOB no es recursivo. Si lo necesitas, usa GLOB_RECURSE
ADD_EXECUTABLE(MiProyecto ${MiProyecto_SRC})
Copiar, crear, eliminar y descargar archivos
PROJECT(MiProyecto) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) FILE(GLOB MiProyecto_SRC "src/*.cpp") # Copiar archivos FILE(COPY "MiArchivo.cpp" DESTINATION mi-carpeta) # COPY usa como destino siempre una carpeta # Se puede crear con FILE(MAKE_DIRECTORY mi-carpeta) # Crear archivos FILE(WRITE "Generado.txt" "Este archivo ha sido generado por CMake\nLos archivos son: ${MiProyecto_SRC}") # Borrar archivos FILE(REMOVE "Generado.txt") # No es recursivo, REMOVE_RECURSE sí lo es # Descargar archivos FILE(DOWNLOAD http://mi-servidor.com/archivo.tar.gz archivo.tar.gz) # Podemos mostrar el progreso # FILE(DOWNLOAD http://mi-servidor.com/archivo.tar.gz archivo.tar.gz SHOW_PROGRESS) # Comprobar la suma MD5 # FILE(DOWNLOAD http://mi-servidor.com/archivo.tar.gz archivo.tar.gz EXPECTED_MD5 LaSumaMD5) # Usar SSL # FILE(DOWNLOAD http://mi-servidor.com/archivo.tar.gz archivo.tar.gz TLS_VERIFY ON) # Guardar la información en un archivo de log # FILE(DOWNLOAD http://mi-servidor.com/archivo.tar.gz archivo.tar.gz LOG descarga.log) # Calcular suma de control FILE(SHA256 archivo.tar.gz VARIABLE_CON_EL_HASH) ADD_EXECUTABLE(MiProyecto ${MiProyecto_SRC})
Incluir archivos de cabecera
A veces es necesario incluir archivos de cabecera en localizaciones no estándarPROJECT(MiProyecto) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) SET(MiProyecto_SRC "src/main.cpp" "src/algo_mas.cpp") INCLUDE_DIRECTORIES("src/includes") # Se añade el directorio a la ruta de búsqueda del compilador de turno ADD_EXECUTABLE(MiProyecto ${MiProyecto_SRC})
Plugins de CMake
CMake es extensible a través de módulos. La instalación por defecto de CMake trae unos cuantos módulos, no obstante, podemos añadir módulos solo para nuestro proyecto. Los módulos tienen extensión .cmake. Normalmente se dejan en una carpeta llamadacmake
.PROJECT(MiProyecto) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) LIST(APPEND CMAKE_PLUGIN_PATH "cmake") # Simplemente añadimos un nuevo lugar a buscar. Veremos como se usan los módulos más adelante ADD_EXECUTABLE(MiProyecto_SRC "src/main.cpp")
Mostrar información y generar errores
En ciertas situaciones querremos que no se pueda compilar el proyecto. MESSAGE es la solución.
PROJECT(MiProyecto)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
MESSAGE("Información relevante")
MESSAGE(STATUS "Información sin relevancia")
MESSAGE(WARNING "Alerta, continúa la configuración y generación")
MESSAGE(SEND_ERROR "Error, continúa la configuración pero no generará")
MESSAGE(FATAL_ERROR "Error grave, detiene la configuración")
ADD_EXECUTABLE(MiProyecto "src/main.cpp")
Condicionales avanzados
PROJECT(MiProyecto) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) ## Con variables booleanas, es decir, ON/OFF, TRUE/FALSE IF(NOMBRE_VARIABLE) MESSAGE("Algo es cierto") ENDIF() IF(NOT NOMBRE_VARIABLE) MESSAGE("Algo no es cierto") ENDIF() # La estructura completa es algo así IF(CONDICION) ELSEIF(CONDICION_2) ELSE() ENDIF() # Se pueden aplicar operadores lógicos IF(CONDICION AND CONDICION_2) IF(CONDICION OR CONDICION_2) # Con números y texto IF(VAR_1 LESS VAR_2) # VAR_1 < VAR_2 IF(VAR_1 GREATER VAR_2) # VAR_1 > VAR_2 IF(VAR_1 EQUAL VAR_2) # VAR_1 === VAR_2 IF(VAR_1 MATCHES REGEX) # Se comprueba la expresión regular # Además, CMake provee operadores para trabajar directamente con archivos, comandos y ejecutables IF(DEFINED VAR_1) # ¿Está definida VAR_1? IF(COMMAND CMD_1) # ¿CMD_1 es un comando de CMake? IF(POLICY POL_1) # ¿La directiva POL_1 está activada? IF(TARGET MiProyecto) # ¿Está definido el ejecutable MiProyecto? IF(EXISTS src/main.cpp) # ¿Existe el archivo src/main.cpp? IF(src/main.cpp IS_NEWER_THAN src/old/main.cpp) # ¿Es src/main.cpp más nuevo que src/old/main.cpp? IF(IS_DIRECTORY src/includes) # ¿src/includes es un archivo o una carpeta?
Bucles
PROJECT(MiProyecto) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) SET(MiProyecto_SRC "src/main.cpp" "src/list.cpp" "src/algomas.cpp") FOREACH(Archivo_SRC IN MiProyecto_SRC) MESSAGE(STATUS "Procesando archivo ${Archivo_SRC}") ENDFOREACH()
Submódulos
CMake usa un único archivo, pero quizá nos conviene repartir la configuración de CMake por varias carpetas entre zonas diferenciadas.PROJECT(MiProyecto) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) ADD_SUBDIRECTORY(lib) ADD_SUBDIRECTORY(src) # src y lib tienen un CMakeLists.txt cada uno
Librerías externas
Una de las características más interesantes de CMake es que es capaz de encontrar librerías externas que necesite nuestro programa. Esta característica se implementa con plugins de CMake. Aquí voy a necesitar wxWidgets.PROJECT(MiProyecto) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) FIND_PACKAGE(wxWidgets) # El plugin debe llamarse FindPackagewxWidgets.cmake, este esta incluido en la distribución estándar de CMake # En grandes librerías como wxWidgets, podemos pedir solo ciertos componentes # FIND_PACKAGE(wxWidgets COMPONENTS core gl html base net) # Podemos hacer que CMake no continúe si no encuentra la librería # FIND_PACKAGE(wxWidgets REQUIRED) # Si todo va bien, tenemos las variables wxWidgets_FOUND, wxWidgets_LIBRARIES y wxWidgets_INCLUDE_DIR INCLUDE_DIRECTORIES(${wxWidgets_INCLUDE_DIR}) TARGET_LINK_LIBRARIES(MiProyecto ${wxWidgets_LIBRARIES})
Definiciones
Podemos añadir directivas del preprocesador de C++ con CMake
PROJECT(MiProyecto)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
ADD_DEFINITIONS(-DPREMIUM_SUPPORT)
# Ahora #ifdef PREMIUM_SUPPORT en el código evaluará como cierto
ADD_EXECUTABLE(MiProyecto "src/main.cpp")
Dependencias
Se pueden crear árboles de dependencias en CMake
PROJECT(MiProyecto)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
ADD_EXECUTABLE(MiProyecto "src/main.cpp")
ADD_EXECUTABLE(NecesitaMiProyecto "src/otro.cpp")
ADD_DEPENDENCY(NecesitaMiProyecto MiProyecto)
# NecesitaMiProyecto ahora depende de MiProyecto
Usando Qt
Ejemplo práctico usando CMake y Qt5 que es capaz de usar QML. Soporta archivos QRC de recursos. Requiere los plugins de Qt5
PROJECT(ProyectoQt)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(CMAKE_AUTOMOC ON)
SET(CMAKE_INCLUDE_CURRENT_DIR ON)
FILE(GLOB ProyectoQt_SRC "src/*.cpp")
FIND_PACKAGE(Qt5Core REQUIRED)
FIND_PACKAGE(Qt5Widgets REQUIRED)
FIND_PACKAGE(Qt5Qml REQUIRED)
FIND_PACKAGE(Qt5Quick REQUIRED)
qt5_add_resources(Res_SRC "src/res.qrc")
ADD_EXECUTABLE(ProyectoQt ${ProyectoQt_SRC} ${Res_SRC})
qt5_use_modules(ProyectoQt Widgets Qml Quick)
Usando Java
CMake soporta Java, aunque no maneja dependencias como Maven o Gradle.
PROJECT(ProyectoJava)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
FIND_PACKAGE(Java REQUIRED)
INCLUDE(UseJava)
SET(CMAKE_JAVA_COMPILE_FLAGS "-source" "1.6" "-target" "1.6")
FILE(GLOB JAVA_SRC "src/*.java")
SET(DEPS_JAR "deps/appengine.jar")
add_jar(ProyectoJava ${JAVA_SRC} INCLUDE_JARS ${DEPS_JAR} ENTRY_POINT "PuntoDeEntrada")
Comandos personalizados, Doxygen
En CMake podemos crear comandos personalizados. Por ejemplo, generar documentación con Doxygen
PROJECT(Doxy)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
ADD_CUSTOM_TARGET(doxygen doxygen ${PROJECT_SOURCE_DIR}/Doxyfile DEPENDS MiProyectoEjecutable WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMENT "Generando documentación" VERBATIM )
# Ahora puedes usar "make doxygen"
# Como es un TARGET cualquiera de CMake, puedes usar ADD_DEPENDENCY
# También puedes usar el plugin FindDoxygen para más portabilidad
Archivos de configuración
En Autotools es común usar un archivo con configuraciones en tiempo de compilación. Normalmente se trata de una cabecera con soporte para plantillas. En CMake se puede hacer.config.hpp.in
#ifndef CONFIG_HPP #define CONFIG_HPP #cmakedefine PREMIUM_SUPPORT /* Si PREMIUM_SUPPORT está definido en CMakeLists.txt, se definirá aquí */ #define AUTHOR @AUTHOR@ /* Se definirá AUTHOR con el valor que tenga CMakeLists.txt de la variable AUTHOR */ #endif
PROJECT(MiProyecto) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) SET(AUTHOR "\"Adrian Arroyo Calle\"") CONFIGURE_FILE(src/config.hpp.in src/config.hpp)
Instalar
CMake permite instalar también los programas
PROJECT(MiProyecto)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
ADD_EXECUTABLE(MiProyecto "src/main.cpp")
INSTALL(TARGETS MiProyecto DESTINATION bin/)
# Instala un ejecutable o librería en la carpeta seleccionada. Tenemos que tener en cuenta los prefijos, que son configurables en CMake.
# Si un programa en Linux suele ir en /usr/local/bin, debemos usar bin, pues /usr/local será añadido por CMake automáticamente
INSTALL(FILES ${ListaDeArchivos} DESTINATION .)
# Archivos normales
INSTALL(DIRECTORY mi-carpeta DESTINATION .)
# Copia la carpeta entera, conservando el nombre
# Se permiten expresiones regulares y wildcards
# INSTALL(DIRECTORY mi-carpeta DESTINATION . FILES_MATCHING PATTERN "*.png")
INSTALL(SCRIPT install-script.cmake)
# Un archivo de CMake que se ejecutará en la instalación
INCLUDE(InstallRequiredSystemLibraries)
# Importante si usas Windows y Visual Studio
# Y con esto se puede usar 'make install'
CPack
Peromake install
es un poco incómodo. No se puede
distribuir fácilmente. Aquí CMake presenta CPack, que genara
instaladores. Yo soy reacio a usarlos pues son de mala calidad pero
soporta:- ZIP
- TAR.GZ
- TAR.BZ2
- TZ
- STGZ - Genera un script de Bash que ejecutará la descompresión y hará la instalación
- NSIS
- DragNDrop
- PackageMaker
- OSXX11
- Bundle
- Cygwin BZ2
- DEB
- RPM
cpack
en vez de cmake
PROJECT(MiProyecto)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
ADD_EXECUTABLE(MiProyecto "src/main.cpp")
INSTALL(TARGETS MiProyecto DESTINATION bin)
INCLUDE(CPack)
# Esto servirá para ZIP, TAR.GZ, TAR.BZ2, STGZ y TZ
# Para el resto deberás configurar manualmente unas cuantas variables necesarias
# http://www.cmake.org/Wiki/CMake:CPackPackageGenerators
Usando ensamblador
CMake soporta correctamente GNU ASM. Nasm requiere más trabajo.
PROJECT(gnu-asm ASM C)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
ENABLE_LANGUAGE(ASM-ATT)
FILE(GLOB ASM_SOURCES "*.asm")
FILE(GLOB C_SOURCES "*.c")
ADD_LIBRARY(asm STATIC ${ASM_SOURCES})
ADD_EXECUTABLE(gnu-asm ${C_SOURCES})
TARGET_LINK_LIBRARIES(gnu-asm asm)
Algunas variables interesantes
Variable | Información |
---|---|
CMAKE_CURRENT_SOURCE_DIR | La ruta completa a la carpeta donde se encuentra CMakeLists.txt |
CMAKE_MODULE_PATH | Las rutas para buscar plugins de CMake |
PROJECT_BINARY_DIR | La carpeta que se está usando para guardar los resultados de la compilación |
CMAKE_INCLUDE_PATH | Las carpetas de búsqueda de cabeceras |
CMAKE_VERSION | Versión de CMake |
CMAKE_SYSTEM | El nombre del sistema |
CMAKE_SYSTEM_NAME | El sistema operativo |
CMAKE_SYSTEM_PROCESSOR | El procesador |
CMAKE_GENERATOR | El generador usado en ese momento |
UNIX | Si estamos en Linux, OS X, BSD o Solaris será cierto |
WIN32 | Si estamos en Windows |
APPLE | En OS X |
MINGW | Usando MinGW |
MSYS | Usando MSYS |
BORLAND | Usando Borland |
CYGWIN | Usando Cygwin |
WATCOM | Usando OpenWatcom |
MSVC | Usando Visual Studio |
MSVC10 | Usando Visual Studio 10 |
CMAKE_C_COMPILER_ID | El identificador de compilador de C |
CMAKE_CXX_COMPILER_ID | El identificador de compilador de C++ |
CMAKE_COMPILER_IS_GNUCC | El compilador de C es una variante de GNU GCC |
CMAKE_COMPILER_IS_GNUCXX | El compilador de C++ es una variante de GNU G++ |
CMAKE_BUILD_TYPE | La configuración Debug/Release que estamos usando |
CMAKE_C_COMPILER | La ruta al compilador de C |
CMAKE_C_FLAGS | La configuración del compilador de C |
CMAKE_C_FLAGS_DEBUG | La configuración del compilador de C solo si estamos en la configuración Debug |
CMAKE_C_FLAGS_RELEASE | La configuración del compilador de C solo si estamos en la configuración Release |
CMAKE_SHARED_LINKER_FLAGS | La configuración del compilador para librerías compartidas |
BUILD_SHARED_LIBS | Por defecto en ADD_LIBRARY, las librerías son compartidas. Podemos cambiar esto |
RPath
El RPath es importante en los sistemas UNIX. Se trata de cargar librerías dinámicas que no están en directorios estándar.
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH "$ORIGIN")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
Esto hará que los ejecutables construidos en UNIX puedan cargar librerías desde la carpeta donde se encuentran. Al estilo Windows.
Fuente:
http://adrianarroyocalle.github.io/blog/2015/06/22/tutorial-de-cmake/
Enviar por correo electrónico
Escribe un blog
Compartir en X
Compartir con Facebook
Compartir en Pinterest
0 comentarios :
Publicar un comentario
Los comentarios pueden ser revisados en cualquier momento por los moderadores.
Serán publicados aquellos que cumplan las siguientes condiciones:
- Comentario acorde al contenido del post.
- Prohibido mensajes de tipo SPAM.
- Evite incluir links innecesarios en su comentario.
- Contenidos ofensivos, amenazas e insultos no serán permitidos.
Debe saber que los comentarios de los lectores no reflejan necesariamente la opinión del STAFF.