首页 > 其他分享 >cmake 函数编译第三方库

cmake 函数编译第三方库

时间:2023-04-07 20:23:13浏览次数:38  
标签:set CMAKE NAME Argument library LIBRARIES 编译 cmake 第三方

function(find_external_project_add)
set(options BUILD_SHARED_LIBRARY)
set(oneValueArgs NAME)
set(multiValueArgs DEPENDS EXPORT_LIBRARIES CONFIGURE_COMMANDS EXTRA_LINKS)
cmake_parse_arguments(Argument "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

message(STATUS "==> Preparing add external project: ${CMAKE_SOURCE_DIR}/package/${Argument_NAME}")
message(STATUS " depends: ${Argument_DEPENDS}")
message(STATUS " libraries: ${Argument_EXPORT_LIBRARIES}")
message(STATUS " configs: ${Argument_CONFIGURE_COMMANDS}")

get_property(${Argument_NAME}_FOUND GLOBAL PROPERTY ${Argument_NAME}_FOUND_PROPERTY)
get_property(${Argument_NAME}_INCLUDE_DIRS GLOBAL PROPERTY ${Argument_NAME}_INCLUDE_DIRS_PROPERTY)
get_property(${Argument_NAME}_LIBRARIES GLOBAL PROPERTY ${Argument_NAME}_LIBRARIES_PROPERTY)
get_property(${Argument_NAME}_EXTRA_LINKS GLOBAL PROPERTY ${Argument_NAME}_EXTRA_LINKS)

if (${Argument_NAME}_FOUND)
message(STATUS "==> External project ${CMAKE_SOURCE_DIR}/package/${Argument_NAME} has existed!, exported libraries: ${${Argument_NAME}_LIBRARIES}")
set(${Argument_NAME}_FOUND ${${Argument_NAME}_FOUND} PARENT_SCOPE)
set(${Argument_NAME}_INCLUDE_DIRS ${${Argument_NAME}_INCLUDE_DIRS} PARENT_SCOPE)
set(${Argument_NAME}_LIBRARIES ${${Argument_NAME}_LIBRARIES} ${${Argument_NAME}_EXTRA_LINKS} PARENT_SCOPE)
else ()
if (Argument_EXPORT_LIBRARIES)
if (Argument_BUILD_SHARED_LIBRARY)
if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
set(LIBRARY_SUFFIX "dylib")
else()
set(LIBRARY_SUFFIX "so")
endif()
else ()
set(LIBRARY_SUFFIX "a")
endif()

message(STATUS "==> Handling exported libraries for \"${CMAKE_SYSTEM_NAME}\" platform")
set(new_library_paths "")
foreach (library_path IN LISTS Argument_EXPORT_LIBRARIES)
message(STATUS "==> Handling library: ${library_path}")
string(REGEX REPLACE "(.*)[.]so" "\\1" temp_library_path ${library_path})
string(REGEX REPLACE "(.*)[.]dylib" "\\1" temp_library_path ${library_path})
string(REGEX REPLACE "(.*)[.]a" "\\1" temp_library_path ${library_path})
string(JOIN "." new_library_path ${temp_library_path} ${LIBRARY_SUFFIX})
message(STATUS " >> ${new_library_path}")
list(APPEND new_library_paths ${new_library_path})
endforeach()
set(Argument_EXPORT_LIBRARIES ${new_library_paths})
message(STATUS "==> Exported libraries: ${Argument_EXPORT_LIBRARIES}")
endif()

message(STATUS "==> Added external project ${CMAKE_SOURCE_DIR}/package/${Argument_NAME}")
include(ExternalProject)

set(CMAKE_CONFIGURE_COMMAND
cmake
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
-DCMAKE_INSTALL_INCLUDEDIR=${CMAKE_INSTALL_INCLUDEDIR}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCUSTOM_CMAKE_SYSTEM_NAME=${CUSTOM_CMAKE_SYSTEM_NAME}
-DCUSTOM_CMAKE_XML_NAME=${CUSTOM_CMAKE_XML_NAME}
-DUSE_SYSTEM_SSL=${USE_SYSTEM_SSL}
-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
${CMAKE_SOURCE_DIR}/package/${Argument_NAME}
${Argument_CONFIGURE_COMMANDS}
)

foreach (depend IN LISTS Argument_DEPENDS)
find_package(${depend} REQUIRED)
endforeach()

ExternalProject_Add(
${Argument_NAME}
PREFIX ${CMAKE_INSTALL_PREFIX}/../package/${Argument_NAME}
TMP_DIR ${CMAKE_INSTALL_PREFIX}/../package/${Argument_NAME}
SOURCE_DIR ${CMAKE_SOURCE_DIR}/package/${Argument_NAME}
DEPENDS ${Argument_DEPENDS}
CONFIGURE_COMMAND ${CMAKE_CONFIGURE_COMMAND}
BUILD_COMMAND make
BUILD_ALWAYS 1
INSTALL_COMMAND make install
)

set_property(GLOBAL PROPERTY ${Argument_NAME}_FOUND_PROPERTY ON)
set_property(GLOBAL PROPERTY ${Argument_NAME}_INCLUDE_DIRS_PROPERTY "${CMAKE_INSTALL_PREFIX}/include")
set_property(GLOBAL PROPERTY ${Argument_NAME}_LIBRARIES_PROPERTY "${Argument_EXPORT_LIBRARIES}")
set_property(GLOBAL PROPERTY ${Argument_NAME}_EXTRA_LINKS_PROPERTY "${Argument_EXTRA_LINKS}")

set(${Argument_NAME}_FOUND TRUE PARENT_SCOPE )
set(${Argument_NAME}_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/include PARENT_SCOPE )
if (Argument_EXPORT_LIBRARIES)
set(${Argument_NAME}_LIBRARIES ${Argument_EXPORT_LIBRARIES} ${Argument_EXTRA_LINKS} PARENT_SCOPE )
endif ()
endif ()

endfunction()

标签:set,CMAKE,NAME,Argument,library,LIBRARIES,编译,cmake,第三方
From: https://www.cnblogs.com/show-hand/p/17297246.html

相关文章

  • 用docker作为嵌入式编译环境
    https://www.shangyexin.com/2020/01/20/docker_ubuntu_compile/https://wiki.t-firefly.com/Firefly-RK3288/linux_compile.html方法二:使用Docker......
  • Qt5.15编译Oracle 19c驱动
     一、下载Oracle 19c驱动,需要下载两个包,注意分x86和x64x86下载地址:InstantClientforWindows32-bit(oracle.com) ① instantclient-basic-nt-19.18.0.0.0dbru.zip ② instantclient-sdk-nt-19.18.0.0.0dbru.zipx64下载地址:InstantClientforMicrosoftWindows(x......
  • spring导入第三方资源对应的配置类
      importcom.alibaba.druid.pool.DruidDataSource;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.PropertySource;@PropertySource("classpa......
  • flask之request源码和第三方模块wtforms
    目录请求上下文分析(源码:request原理)1.导出项目的依赖2.函数和方法3.threading下的local对象4.偏函数5.flask整个生命执行流程---flask1.1.41版本为例wtforms---了解请求上下文分析(源码:request原理)1.导出项目的依赖以前导出项目的依赖:pipfreeze>requirements.txt......
  • LabVIEW调用第三方exe软件或操作操作控制第三方软件界面的控件,如操控烧录软件等
    LabVIEW调用第三方exe软件或操作操作控制第三方软件界面的控件,如操控烧录软件等除了模拟鼠标和键盘来实现之后,还可以考虑另外一种方式,使用窗口句柄来直接操作程序如下面图片实例,操作串口助手,修改串口和波特率,并写入数据和读取数据这种方式可以避免电脑的分辨率变化和位置移动等......
  • 对于条件编译 #ifndef __LED_H的理解
    一、下划线“__”属于编程风格的内容,对程序没有影响。不用下划线也可以,用几个下划线也由个人习惯二、其实本质是一个宏名。由此我们可以防止发生重复定义或声明假设你的头文件名为led.h,根据习惯,我们声明一个宏__LED_H对应这个头文件,在头文件中开始的地方和结尾的地方加上对__LED......
  • Ubuntu 编译安装WireShark
    下载源码wgethttps://gitlab.com/wireshark/wireshark/-/archive/v3.6.12/wireshark-v3.6.12.zip你可以选择想要的版本,一般低一个最新版本比较好,资料多直接编译924ls925unzipwireshark-v3.6.12.zip926cdwireshark-v3.6.12/929clear930ls93......
  • 【技术教程】在EasyCVR平台中打开第三方桌面端应用的实现过程
    EasyCVR视频融合平台基于云边端协同架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,可支持多协议接入,包括市场主流标准协议与厂家私有协议及SDK,如:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、宇视SDK等(具体见下图)。平台能在复杂的网络环境中,将分散的各......
  • 【技术教程】在EasyCVR平台中打开第三方桌面端应用的实现过程
    EasyCVR视频融合平台基于云边端协同架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,可支持多协议接入,包括市场主流标准协议与厂家私有协议及SDK,如:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、宇视SDK等(具体见下图)。平台能在复杂的网络环境中,将分散的各类......
  • cmake使用eigen库
    Eigen是一个C++开源线性代数库:提供矩阵的线性代数运算。注:Eigen是一个只有头文件的库cmake使用eigen库find_package(Eigen3)INCLUDE_DIRECTORIES(${EIGEN3_INCLUDE_DIR})程序中使用eigen库,引用各功能头文件#include<Eigen/core> ......