ilustrar
Esta serie presentará cómo MXNet usa CMake para organizar proyectos.
Esta serie de artículos cubre la mayoría de los comandos de CMake utilizados en el desarrollo real.
El código de este artículo proviene de MXNet .
¿Qué es CMake? ¿Por qué aprender CMake?
Para descubrir CMake
qué hace, debemos comprender C++
el proceso de desarrollo de todo el proyecto. Debido a mi capacidad limitada, aquí solo daré una breve introducción.
Después de escribir el código, el código debe compilarse a través de un compilador. Cuando el proyecto se vuelve grande, se vuelve muy problemático ingresar manualmente el comando de compilación después de cada compilación. Para resolver el problema, se requiere entrada manual para Cada compilación nació el problema del comando de compilación Makefile
. El llamado Makefile
es escribir el comando de compilación de todo el proyecto Makeifle
en un archivo llamado. Solo necesita ingresar make cada vez para compilar todo el proyecto. Makefile implementa muchas operaciones convenientes, como buscar todos los archivos fuente a la vez, para que pueda No es necesario. Cada vez que agregue un archivo fuente, escriba un g++ filename.cpp -c -o filename.o
comando manualmente.
Aunque Makefile
solo necesita escribir el comando de compilación una vez, cuando el proyecto se vuelve enorme y necesita usar una biblioteca de terceros, la Makefile
administración será un poco problemática, además de esto, Makefile
hay un problema más fatal: no puede admite muy bien multiplataforma, es decir, si necesita implementarlo para usarlo en dos plataformas diferentes, Makefile
a menudo necesita escribir dos Makefile
archivos. Para resolver los problemas encontrados
anteriormente , existe . Lo que puede hacer, aquí hay una descripción del sitio web oficial:Makefile
CMake
CMake
CMake es una familia de herramientas multiplataforma de código abierto diseñada para crear, probar y empaquetar software. CMake se utiliza para controlar el proceso de compilación de software utilizando archivos de configuración independientes del compilador y de la plataforma simple, y generar espacios de trabajo y archivos MAKE nativos que se pueden usar en el entorno del compilador de su elección. Kitware creó el conjunto de herramientas CMake en respuesta a la necesidad de un entorno de compilación potente y multiplataforma para proyectos de código abierto como ITK y VTK.
El significado aproximado de lo anterior en inglés CMake
es una herramienta de construcción multiplataforma que se utiliza para generar Makefile
. Este es Cmake
el objetivo principal.
CMake
Ahora se ha convertido en C++
una herramienta de construcción utilizada en muchos proyectos y su uso CMake
se ha convertido en una tendencia general. Por eso el aprendizaje CMake
es particularmente importante.
Introducción a MXNet
MXNet
Es un marco de aprendizaje automático de código abierto que admite muchos lenguajes diferentes y puede facilitar a los usuarios la capacitación e implementación del aprendizaje automático. Todos están familiarizados con el uso Python
de la instalación MXNet
para la capacitación en aprendizaje automático, y MXNet
el código aquí proporciona una biblioteca dinámica. Los desarrolladores de diferentes idiomas la encapsularán de manera diferente y eventualmente llamarán a la biblioteca dinámica. MXNet
La biblioteca dinámica aquí se C++
escribe usando y CMake
el proyecto se construye usando.
Estructura de organización del código MXNet
MXNet
Hay muchos subdirectorios bajo el directorio, solo debemos prestar atención a algunos de sus directorios y archivos:
Directorio src: almacena el código fuente y algunos archivos de encabezado
incluyen directorio: almacena archivos de encabezado de bibliotecas publicadas externamente
directorio de prueba: almacena casos de prueba
directorio cmake: almacena.cmake
archivos
Directorio de terceros: almacena archivos de bibliotecas de terceros
CMakeList.txt
:CMake
archivos de configuración
Cómo utilizar CMake
Para usarlo, CMake
solo necesitamos escribir CMakeList.txt
el archivo. Después de completar la escritura del archivo, podemos pasar cmake
el comando (debe asegurarse de que exista en la ubicación de ejecución. CMakeList.txt
Si no existe, solo necesita ingresar la ruta del archivo después del comando). El comando generará Makefile
el archivo por nosotros. Después de generar Makefile
el archivo, solo necesitamos ejecutar make
el comando para comenzar a construir el proyecto.
CMakeList.txt en MXNet
A continuación, aprendamos MXNet
cómo usarlo CMake
para construir. En la estructura de organización del código anterior, encontramos que además de su propio código fuente, el proyecto también utiliza bibliotecas de terceros, y estos terceros en realidad se construyen a través de CMake
. las bibliotecas del partido CMake
pueden gestionarse bien.
cmake_minimum_required(VERSIÓN 3.13)
Este comando se utiliza para especificar cmake
el número de versión mínimo. Cuando el número de versión es menor que el número de versión especificado, no 3.13
continuará cmake
ejecutándose, pero solicitará al usuario que actualice cmake
la versión.
si () más si () más () endif ()
cmake
Las declaraciones de control lógico MXNet
son las siguientes:
if(CMAKE_CROSSCOMPILING)
set(__CMAKE_CROSSCOMPILING ${CMAKE_CROSSCOMPILING})
set(__CMAKE_CROSSCOMPILING_OVERRIDE ON)
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0)
message(FATAL_ERROR "MXNet 2 requires a C++17 compatible compiler. Please update to GCC version 7 or newer.")
endif()
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0)
message(FATAL_ERROR "MXNet 2 requires a C++17 compatible compiler. Please update to Clang version 6 or newer.")
endif()
endif()
if
El segundo parámetro de la declaración es la condición de juicio, que STREQUAL
se utiliza para juzgar si las dos cadenas son iguales y VERSION_LESS
si el número de versión anterior es menor que el número de versión posterior.
La primera if
declaración anterior se CMAKE_CROSSCOMPILING
ejecutará ON
cuando, y la declaración de juicio aquí debe usarse para la compilación cruzada.
Nota: La suma CMake
en se expresa por suma .true
false
ON
OFF
Nota: La compilación cruzada se utiliza principalmente para implementar la compilación de código para dispositivos integrados. Dado que el rendimiento de los dispositivos integrados es limitado, generalmente se compila en un host con un rendimiento sólido. El archivo (o biblioteca) de destino compilado se puede trasplantar al servidor integrado. dispositivo para su uso. .
colocar()
set
Los comandos CMake
se utilizan para definir variables en, por ejemplo:
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)
Si desea obtener una determinada variable, puede ${VARIABLE_NAME}
hacerlo.
set
Los comandos también pueden establecer variables de búfer, que se pueden usar globalmente.
cmake variables incorporadas
Generalmente, CMAKE
las variables que comienzan con ellas son cmake
variables integradas. Puede obtener el valor de cada variable de acuerdo con el método de obtención del valor de la variable. set
Los valores de estas variables se pueden cambiar mediante comandos para lograr algunos propósitos especiales MXNet
. variables integradas utilizadas en:
- CMAKE_CROSSCOMPILING macro de compilación multiplataforma, esta macro se activará después de especificar el nombre del sistema
- CMAKE_CXX_STANDARD se utiliza para especificar la versión de C++
- CMAKE_CXX_STANDARD_REQUIRED Cuando esté activado, se utilizará la versión especificada en CMAKE_CXX_STANDARD. De lo contrario, se detendrá e informará un error. De lo contrario, se utilizará la versión anterior cuando esté desactivado.
- CMAKE_CXX_EXTENSIONS Si se deben habilitar las extensiones del compilador para C++
- CMAKE_CXX_COMPILER_ID El nombre del compilador como GNU
- CMAKE_CXX_COMPILER_VERSION Número de versión del compilador
- CMAKE_PROJECT_NAME El nombre del proyecto de nivel superior (si un proyecto contiene un subproyecto, entonces CMAKE_PROJECT_NAME en el subproyecto será el nombre del proyecto de nivel superior, no el nombre de su propio proyecto)
- PROJECT_NAME El nombre del proyecto actual.
- CMAKE_CURRENT_SOURCE_DIR La ruta absoluta del directorio de origen que se está procesando actualmente.
proyecto()
Este comando se utiliza para especificar el nombre del proyecto y el lenguaje de programación utilizado por el proyecto. MXNet
El ejemplo para especificar el nombre del proyecto como mxnet
lenguaje de programación es C/C++
:
project(mxnet C CXX)
mensaje()
Se utiliza para imprimir información de solicitud, similar a la salida del registro, que puede especificar la salida level
. MXNet
Se utilizan los siguientes level
:
message(FATAL_ERROR "MXNet 2 requires a C++17 compatible compiler. Please update to GCC version 7 or newer.")
message(STATUS "CMAKE_CROSSCOMPILING ${CMAKE_CROSSCOMPILING}")
message(WARNING "Could not find NVML libraries")
message(ERROR " Only one of USE_JEMALLOC and USE_GPERFTOOLS can be defined at once")
message("After choosing blas, linking to ${mxnet_LINKER_LIBS}")
Nota: El nivel de registro determina el procesamiento que se producirá y qué ejecución FATAL_ERROE
se detendrá . Nota: Cuando no se ingresa ningún nivel, significa que el mensaje es importante y el usuario debe prestar atención. Nota: No existe tal nivel en , pero este nivel se usa en y no se producen errores. Esto es algo que no entiendo del todo.cmake
cmake
ERROR
MXNet
incluir()
include
Se puede utilizar para introducir macros, módulos y un archivo.
-
Si introduce un archivo (generalmente con el sufijo
.cmake
), el uso en este momento es consistente con el uso de macrosC/C++
eninclude
mxnet. El uso de introducir un archivo en mxnet es el siguiente:include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Utils.cmake)
El comando anterior importará
Utils.cmake
algunas funciones de herramientas y macros de uso común definidas en este archivo. \ -
mxnet
Los módulos también seinclude
introducen mediante comandos en , por ejemplo:include(CMakeDependentOption)
CmakeDependentOption
Los principales métodos admitidos en este módulo se presentan arribacmake_dependent_option
.
cmake_dependent_option()
Este método se utiliza para establecer algunas variables macro. Las variables macro se establecen en un valor cuando se establece la dependencia y en otro valor cuando no se cumple la dependencia, como en un ejemplo en mxnet
:
cmake_dependent_option(USE_NVML "Build with nvml support if found" ON "USE_CUDA" OFF)
USE_NVML
Será cuando USE_CUDA
esté hecho , será cuando esté hecho . Un ejemplo más complejo:ON
ON
OFF
OFF
cmake_dependent_option(A "this is description" ON "B;NOT C" OFF)
El código anterior significa que cuando B
se abre o C
se cierra, A
se abrirá; en otros casos, A
se cerrará.
opción()
Se utiliza para establecer una opción. La variable de esta opción se puede utilizar para establecer su valor al ejecutar el comando cmake -DOPTION_NAME=ON/OFF
.
option(USE_NCCL "Use NVidia NCCL with CUDA" OFF)
Por ejemplo, arriba se establece una opción USE_NCCL
y su valor predeterminado es OFF
la cadena en el medio como descripción.
Para ser actualizado, última actualización el 2023.6.23