在对Caffe使用cmake方式编译安装时产生了对这个文件的好奇,打算做个注释理解,

参考:https://blog.csdn.net/fuzi2012/article/details/72454532

#一般工程都是从cmake_minimum_required开始的,表示系统cmake的最低版本号,如果版本号
#比这个2.8.7小,那么就无法cmake 通过
cmake_minimum_required(VERSION 2.8.7)
#这个cmake_policy没什么实际作用的,只是做版本向后兼容的提示,不多解释
if(POLICY CMP0046)cmake_policy(SET CMP0046 NEW)
endif()
if(POLICY CMP0054)cmake_policy(SET CMP0054 NEW)
endif()# ---[ Caffe project 每一个项目都会有一个工程名字,用project()来定义
project(Caffe C CXX)# ---[ Caffe version SET这个命令呢,就是设置变量的意思,简单用法 SET(<VAR> value) 复杂用法,看官方文档哦
set(CAFFE_TARGET_VERSION "1.0.0" CACHE STRING "Caffe logical version")
#设置caffe 的版本号
set(CAFFE_TARGET_SOVERSION "1.0.0" CACHE STRING "Caffe soname version")
#add_definitions 定义cmake define定义,类似于 C++ 里的#define CAFFE_VERSION 
#其实就是定义了个宏CAFFE_VERSION
#,这个定义这个变量,后面会用到if(CAFFE_VERSION) 来判断这个变量是否被定义
add_definitions(-DCAFFE_VERSION=${CAFFE_TARGET_VERSION})# ---[ Using cmake scripts and modules
#list命令是定义字符串数组,用于保存是一个或者多个变量的
#CMAKE_MODULE_PATH 这个变量是cmake内部预定义的环境变量,表示包含cmake 模块的路径,
#cmake 模块是一个cmake 脚本,用于查询安装在系统内或者本地的库 里面都是一些Findxxx.cmake,
#后面会出现用find_pakage()调用cmake模块;一般cmake 模块都会返回(这只是个约定)
#xx_FOUND 用于判断是否找到该xx库,xx_INCLUDE_DIR:include路径,xx__LIBRARY:libxxx.so等路径与名字
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)
#include()用于包含cmake脚本文件,类似于调用了该段宏展开
#ExternalProject 外部工程,还没有编译出库来的,需要现在下载编译,其脚本在External目录里
include(ExternalProject)
#GNUInstallDirs 这个变量跟系统的GNU界面有关系,我还不是很理解
include(GNUInstallDirs)
#cmake/Utils.cmake : 这个脚本里定义了很多Cmake 函数function ,
#每个函数或者每一个宏都有英文对应的解释,我就不多说了
include(cmake/Utils.cmake)
#cmake/Targets.cmake 以下这些函数,等我有时间在解释吧
include(cmake/Targets.cmake)
include(cmake/Misc.cmake)
include(cmake/Summary.cmake)
include(cmake/ConfigGen.cmake)# ---[ Options
#这里全部调用cmake/Utils.cmake 里自定义的函数caffe_option(),其实里头就是调用了cmake命令option()
#为工程添加可选开关,有默认值OFF 或者 ON 表示该定义开关,在工程编译前cmake 命令可以 cmake -DCPU_ONLY=ON 打开
caffe_option(CPU_ONLY  "Build Caffe without CUDA support" OFF) # TODO: rename to USE_CUDA
caffe_option(USE_CUDNN "Build Caffe with cuDNN library support" ON IF NOT CPU_ONLY)
# 这个NCCL是NVIDIA多卡通信模块
caffe_option(USE_NCCL "Build Caffe with NCCL library support" OFF)
# 编译共享库,即so文件
caffe_option(BUILD_SHARED_LIBS "Build shared libraries" ON)
# 指定python的使用版本为python2,编译caffe的python接口
caffe_option(BUILD_python "Build Python wrapper" ON)
set(python_version "2" CACHE STRING "Specify which Python version to use")
# 编译caffe的matlab接口(如果是UNIX或苹果系统则不编译)
caffe_option(BUILD_matlab "Build Matlab wrapper" OFF IF UNIX OR APPLE)
caffe_option(BUILD_docs   "Build documentation" ON IF UNIX OR APPLE)
caffe_option(BUILD_python_layer "Build the Caffe Python layer" ON)
# 编译opencv支持
caffe_option(USE_OPENCV "Build with OpenCV support" ON)
caffe_option(USE_LEVELDB "Build with levelDB" ON)
# LevelDb是能够处理十亿级别规模Key-Value型数据持久性存储的C++ 程序库
#选择Caffe的数据管理第三方库,两者都不打开 Caffe默认用的是LMDB,这两者均是嵌入式数据库管理系统编程库。
caffe_option(USE_LMDB "Build with lmdb" ON)
caffe_option(ALLOW_LMDB_NOLOCK "Allow MDB_NOLOCK when reading LMDB files (only if necessary)" OFF)
#OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C、C++和Fortran
caffe_option(USE_OPENMP "Link with OpenMP (when your BLAS wants OpenMP and you get linker errors)" OFF)# ---[ Dependencies
#cmake/Dependencies.cmake 这个文件也只是个cmake 脚本,只是这个的功能是实现了依赖库的加载
include(cmake/Dependencies.cmake)# ---[ Flags
if(UNIX OR APPLE)#CMAKE_CXX_FLAGS 这个变量也是cmake 预定义的变量,用于设定C++编译器的属性#-fPIC则表明使用地址无关代码。PIC:Position Independent Code# -Wall选项意思是编译后显示所有警告set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall")
endif()
#调用自定义函数 :这个函数里最关键是定义了Caffe_LINK这个变量,用于收集caffe 相关的库
caffe_set_caffe_link()if(USE_libstdcpp)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libstdc++")#message :用于答应cmake 日志,类似于C++ 的std::cout<<message("-- Warning: forcing libstdc++ (controlled by USE_libstdcpp option in cmake)")
endif()# ---[ Warnings
#调用自定义函数:根据平台或者环境变量打印警告信息
caffe_warnings_disable(CMAKE_CXX_FLAGS -Wno-sign-compare -Wno-uninitialized)# ---[ Config generation
#configure_file(<input> <output>[COPYONLY] [ESCAPE_QUOTES] [@ONLY])
#该文件设置配置文件信息,配置的方式是:以<input>(必须是个文件)中定义的变量替换<output>中的以${VAR}格式或@VAR@格式引用的任意变量,
#如同它们的值是由CMake确定的一样。 如果一个变量还未定义,它会被替换为空。
configure_file(cmake/Templates/caffe_config.h.in "${PROJECT_BINARY_DIR}/caffe_config.h")# ---[ Includes
#Caffe_INCLUDE_DIR :定义工程的include路径变量
set(Caffe_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include)
#Caffe_SRC_DIR :定义工程中的源码路径的变量
set(Caffe_SRC_DIR ${PROJECT_SOURCE_DIR}/src)
#include_directories:该命令为工程添加include路径,就是头文件的查询路径(就是告诉编译器头文件在哪)
include_directories(${PROJECT_BINARY_DIR})# ---[ Includes & defines for CUDA# cuda_compile() does not have per-call dependencies or include pathes
# (cuda_compile() has per-call flags, but we set them here too for clarity)
#
# list(REMOVE_ITEM ...) invocations remove PRIVATE and PUBLIC keywords from collected definitions and include pathes
if(HAVE_CUDA)# pass include pathes to cuda_include_directories()set(Caffe_ALL_INCLUDE_DIRS ${Caffe_INCLUDE_DIRS})list(REMOVE_ITEM Caffe_ALL_INCLUDE_DIRS PRIVATE PUBLIC)cuda_include_directories(${Caffe_INCLUDE_DIR} ${Caffe_SRC_DIR} ${Caffe_ALL_INCLUDE_DIRS})# add definitions to nvcc flags directlyset(Caffe_ALL_DEFINITIONS ${Caffe_DEFINITIONS})list(REMOVE_ITEM Caffe_ALL_DEFINITIONS PRIVATE PUBLIC)list(APPEND CUDA_NVCC_FLAGS ${Caffe_ALL_DEFINITIONS})
endif()# ---[ Subdirectories
#add_subdirectory :添加子目录,要求子目录里头必须要CMakeList.txt文件
add_subdirectory(src/gtest)
add_subdirectory(src/caffe)
add_subdirectory(tools)
add_subdirectory(examples)
add_subdirectory(python)
add_subdirectory(matlab)
add_subdirectory(docs)# ---[ Linter target
add_custom_target(lint COMMAND ${CMAKE_COMMAND} -P ${PROJECT_SOURCE_DIR}/cmake/lint.cmake)# ---[ pytest target
if(BUILD_python)add_custom_target(pytest COMMAND python${python_version} -m unittest discover -s caffe/test WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/python )add_dependencies(pytest pycaffe)
endif()# ---[ uninstall target
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Uninstall.cmake.in${CMAKE_CURRENT_BINARY_DIR}/cmake/Uninstall.cmakeIMMEDIATE @ONLY)add_custom_target(uninstallCOMMAND ${CMAKE_COMMAND} -P${CMAKE_CURRENT_BINARY_DIR}/cmake/Uninstall.cmake)# ---[ Configuration summary
caffe_print_configuration_summary()# ---[ Export configs generation
caffe_generate_export_configs()

扩展阅读:

LevelDb:LevelDb介绍

OpenMP:OpenMP

gcc中-w -W 和-Wall选项:gcc中的-w -W和-Wall选项

cmake指令详解: cmake指令详解

BLAS库:BLAS库简介

BLAS库的实现  
向量和矩阵运算是数值计算的基础,BLAS库通常是一个软件计算效率的决定性因素。除了BLAS参考库以外,还有多种衍生版本和优化版本。这些BLAS库实现中,有些仅实现了其它编程语言的BLAS库接口,有些是基于BLAS参考库的Fortran语言代码翻译成其它编程语言,有些是通过二进制文件代码转化方法将BLAS参考库转换成其它变成语言代码,有些是在BLAS参考库的基础上,针对不同硬件(如CPU,GPU)架构特点做进一步优化[4][5]。

ATLAS BLAS[3] 
The ATLAS (Automatically Tuned Linear Algebra Software) project is an ongoing research effort focusing on applying empirical techniques in order to provide portable performance. At present, it provides C and Fortran77 interfaces to a portably efficient BLAS implementation, as well as a few routines from LAPACK.

OpenBLAS[4]

OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.

Intel® Math Kernel Library[5]

Intel® Math Kernel Library (Intel® MKL) accelerates math processing and neural network routines that increase application performance and reduce development time. Intel MKL includes highly vectorized and threaded Linear Algebra, Fast Fourier Transforms (FFT), Neural Network, Vector Math and Statistics functions. The easiest way to take advantage of all of that processing power is to use a carefully optimized math library. Even the best compiler can’t compete with the level of performance possible from a hand-optimized library. If your application already relies on the BLAS or LAPACK functionality, simply re-link with Intel MKL to get better performance on Intel and compatible architectures.

cuBLAS[6]

The NVIDIA CUDA Basic Linear Algebra Subroutines (cuBLAS) library is a GPU-accelerated version of the complete standard BLAS library that delivers 6x to 17x faster performance than the latest MKL BLAS.

clBLAS[7]

This repository houses the code for the OpenCL™ BLAS portion of clMath. The complete set of BLAS level 1, 2 & 3 routines is implemented.

BLIS[10]

BLIS is a portable software framework for instantiating high-performance BLAS-like dense linear algebra libraries. The framework was designed to isolate essential kernels of computation that, when optimized, enable optimized implementations of most of its commonly used and computationally intensive operations. Select kernels have been optimized for the AMD EPYCTM processor family. The optimizations are done for single and double precision routines.

caffe学习之——CMakeList.txt内容详解相关推荐

  1. [网络安全学习篇2]:IP详解及简单的DOS命令(千峰网络安全视频笔记 2 day)

    引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足:对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以 ...

  2. SQL Server DBA工作内容详解

    原文:SQL Server DBA工作内容详解 在Microsoft SQL Server 2008系统中,数据库管理员(Database Administration,简称为DBA)是最重要的角色. ...

  3. java 检查bytebuf长度_Java学习笔记16-Netty缓冲区ByteBuf详解

    Java学习笔记16-Netty缓冲区ByteBuf详解 Netty自己的ByteBuf ByteBuf是为解决ByteBuffer的问题和满足网络应用程序开发人员的日常需求而设计的. JDK Byt ...

  4. spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)

    spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...

  5. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  6. 【学习笔记】线段树详解(全)

    [学习笔记]线段树详解(全) 和三个同学一起搞了接近两个月的线段树,头都要炸了T_T,趁心态尚未凉之前赶快把东西记下来... [目录] [基础]作者:\((Silent\)_\(EAG)\) [懒标记 ...

  7. 【STM32】标准库与HAL库对照学习教程八--串口通信详解

    [STM32]标准库与HAL库对照学习教程八--串口通信详解 一.前言 二.准备工作 三.通信的基本概念 1.通信方式 2.串行通信与并行通信 (1)串行通信 (2)并行通信 3.异步通信与同步通信 ...

  8. C51汇编语言寻址方式,单片机学习:51单片机寻址方式详解

    原标题:单片机学习:51单片机寻址方式详解 51单片机是对所有兼容Intel 8031指令系统的单片机的统称.该系列单片机的始祖是Intel 8031单片机,后来随着Flash rom 技术的发展,8 ...

  9. Laravel学习笔记汇总——Collection方法详解

    ## Laravel学习笔记汇总--Collection方法详解 本文参考:https:// laravel.com/docs/8.x/collections // 返回整个底层的数组 collect ...

最新文章

  1. 【网络流24题】飞行员配对方案问题
  2. js base64 解码
  3. windows2003前言
  4. 互联网大脑,城市大脑的“大脑”究竟什么含义?
  5. LINUX下面NetworkManager和network冲突的问题
  6. 小波变换和motion信号处理(三)(转)
  7. UVa 1626 (输出方案) Brackets sequence
  8. 如何调整反光镜和座椅的位置 为您支招
  9. 如何玩转 WebGL 并行计算
  10. js中将时间字符串转换为时间戳
  11. 级联MobileNet-V2实现CelebA人脸关键点检测(附训练源码)
  12. Java使用RSA加密解密及签名校验
  13. 安全企业 Stormshield 披露数据泄露事件 源代码被盗
  14. 学习笔记:SSH端口转发的三种方式
  15. 注册坚果云无法连接服务器,坚果云无法连接服务器怎么办?
  16. 米家接入HomeKit系列四:HomeBridge搭建、配置与接入米家设备
  17. python筛选股票5日线以上_[python]沪深龙虎榜数据进一步处理,计算日后5日的涨跌幅...
  18. 【李刚-21天通关Python】第一章:Python入门与字符串
  19. 【Arduino基础】蜂鸣器发声实验
  20. (转)从零实现3D图像引擎:(11)苍井空做客讲解3D变换矩阵的推导

热门文章

  1. 计算机老是卡顿怎么解决,电脑反应太慢怎么处理_电脑卡顿什么原因-win7之家
  2. 某某酒店维修工作记录------弱电篇
  3. CSBJ综述:微生物组数据挖掘方法的挑战与机遇
  4. 【Tushare转存SQL】可转债数据(待续)
  5. ios 历年wwdc
  6. 用vba创建图表分析上市公司财报
  7. 中级职称计算机论文发表要求吗,中级职称论文发表的字数要求是多少?
  8. 想问题思路总是不清晰,这个好用的脑图工具推荐给你
  9. 从零开始实现一个量化回测系统(一)
  10. 模拟线上应用cpu100%解决方法