conan 入门(三十七):conan 2.x通过定义环境变量(environment)执行make编译只有Makefile的项目(erpcgen)

之前一篇博客《conan 入门(三十四):conan 2.x实现对只有Makefile的项目(erpcgen)的封装示例》介绍如何用AutotoolsToolchain,Autotools实现来编译只有Makefile的项目,因为Autotools.make,Autotools.install方法就是执行make来编译项目。
我原本是想用self.run来执行make进行编译的,因为去年编译erpcgen时,我就是用self.run来执行的(参见 《conan入门(二十六):使用make编译erpc/erpcgen(makefile)》),那时conan 版本还是1.x,现在conan版本升级到2.x,不再兼容,原来的方式不能使用了,我一直没有搞明白如何合在conan 2.x下创建正确的环境变量,导致一直编译不成功。所以才摸索出用AutotoolsToolchain,Autotools实现来编译只有Makefile的项目。
但显而易见,用Autotools执行Makefile是有些把问题复杂化了。
直到找到conan 的官方说明《The environment management》,我才明白如何为self.run执行命令创建环境变量
以下是《The environment management》一文中的简单示例:

from conan import ConanFile
from conan.tools.env import Environmentclass MyTestPkg(ConanFile):...def generate(self):env = Environment()env.define("foo", "var")# scope="build" is the defaultenvvars = env.vars(self, scope="build")# 生成环境变量定义脚本,根据执行环境不同脚本的后缀可以是bat|sh|ps1envvars.save_script("my_env")def build(self):# by default env="conanbuild"self.run("my_build_system.exe", env="conanbuild")

该示例中调用了EnvVars.save_script方法将定义的环境变量生成为指定的脚本my_env(根据执行环境不同脚本的后缀可以是bat|sh|ps1)。而这个my_env脚本会自动被在conan_build脚本中调用。
然后在self.run调用时env参数指定env="conanbuild"env="my_env"就可以正确定义环境变量了。(其实不指定env参数也是可以的,因为默认就是conanbuild)
这个参数的意义就是self.run在执行指定的命令前,先执行env指定的脚本(*.bat|sh|ps1),该脚本用于自动定义环境变量。

如下是在conan build_folder生成的my_env.sh脚本的示例

script_folder="C:\Users\10km0\.conan2\p\b\erpcgba2d8dfcc1f65\b"
echo "echo Restoring environment" > "$script_folder\deactivate_my_env.sh"
for v in FLEX BISON CXX INCLUDES BOOST_ROOT LDFLAGS
dois_defined="true"value=$(printenv $v) || is_defined="" || trueif [ -n "$value" ] || [ -n "$is_defined" ]thenecho export "$v='$value'" >> "$script_folder\deactivate_my_env.sh"elseecho unset $v >> "$script_folder\deactivate_my_env.sh"fi
doneexport foo="var"

如下是在conan build_folder生成的conanbuild.sh脚本示例,只是简单的执行my_env.sh,所以env参数为conanbuildmy_env效果是一样的

. "/c/users/10km0/.conan2/p/b/erpcgba2d8dfcc1f65/b/my_env.sh"

基于此,我们可以在修改之前博客《conan 入门(三十四):conan 2.x实现对只有Makefile的项目(erpcgen)的封装示例》中的conanfile-erpcgen.py,直接使用conan.tools.env.Environment定义环境变量,并使用self.run执行make编译项目
如下,主要的修改都在generate,package方法中

from conan import ConanFile,tools
from conan.tools.env import VirtualBuildEnv,Environment
from conan.tools.microsoft.subsystems import unix_path
from conan.tools.files import copy
import os
import shutilclass ErpcgenConan(ConanFile):name = "erpcgen"version = "1.7.3-patch"# Optional metadatalicense = "BSD-2-Clause"author = "guyadong 10km0811@sohu.com"url = "https://gitee.com/l0km/erpcex"description = "erpcgen base NXP Embedded RPC"topics = ("embedded","erpc","nxp","erpcgen")package_type = "application"requires = "boost/[>=1.69.0]"# Binary configurationsettings = "os", "arch"# Sources are located in the same place as this recipe, copy them to the recipeexports_sources = "erpc/*"# 获取 C++编译器位置# 基于 boost的conanfile.py中的_cxx 方法剪裁# https://github.com/conan-io/conan-center-index/blob/master/recipes/boost/all/conanfile.py@propertydef _cxx(self):compilers_by_conf = self.conf.get("tools.build:compiler_executables", default={}, check_type=dict)cxx = compilers_by_conf.get("cpp") or VirtualBuildEnv(self).vars().get("CXX")if cxx:return cxxcompiler_version = str(self.settings_build.compiler.version)major = compiler_version.split(".", maxsplit=1)[0]if self.settings_build.compiler == "gcc":return shutil.which(f"g++-{compiler_version}") or shutil.which(f"g++-{major}") or shutil.which("g++") or ""return ""def config_options(self):if not self.settings_build.compiler == "gcc":# 只支持gcc编译,报错退出raise Exception("Only support gcc,plese use MinGw compiler for Windows")def build_requirements(self):if self.settings_build.os == "Windows":self.tool_requires("winflexbison/2.5.24")self.win_bash = Trueif not self.conf.get("tools.microsoft.bash:path", check_type=str):# Windows下需要在MSYS2环境编译self.tool_requires("msys2/cci.latest")else:self.tool_requires("flex/2.6.4")self.tool_requires("bison/3.7.6")def generate(self):env = Environment()if self.settings_build.os == "Windows":# erpcgen中使用环境变量FLEX定义flex,BISON定义bison,# 与winflexbison加载时定义的变量名不一样,所以这里要# 定义环境变量 FLEX=$LEX,BISON=$YACCenv.define('FLEX',self.dependencies.build["winflexbison"].buildenv_info.vars(self).get("LEX"))env.define('BISON',self.dependencies.build["winflexbison"].buildenv_info.vars(self).get("YACC"))include_path = unix_path(self,os.path.join(self.dependencies.build["winflexbison"].package_folder, "include"))# 使用外部定义的C++编译器,避免使用msys2内置的编译器,否则会因为编译版本不一致导致连接错误env.define('CXX',unix_path(self,self._cxx))else:# 定义环境变量 FLEX=$LEX,BISON=$BISON_ROOT/bin/bisonenv.define('FLEX',os.path.join(self.dependencies.build["flex"].package_folder,"bin", "flex"))env.define('BISON',self.dependencies.build["bison"].buildenv_info.vars(self).get("CONAN_BISON_ROOT") + "/bin/bison")include_path = os.path.join(self.dependencies.build["flex"].package_folder, "include")# 将 flex的include文件夹添加到INCLUDES环境变量,参见 erpc/erpcgen/Makefile中INCLUDES变量env.append('INCLUDES',include_path)# 指定boost位置boost_root = unix_path(self,self.dependencies["boost"].package_folder)    env.define('BOOST_ROOT',boost_root)env.append('LDFLAGS',"-L" + os.path.join(boost_root,"lib"))envvars = env.vars(self)envvars.save_script("my_env")# 输出环境变量self.output.info("Environment Variables:")for name, value in envvars.items():self.output.info(f"{name}={value}")def package(self):# VERBOSE=1 编译时输出命令self.run(f"VERBOSE=0 make -C erpc/erpcgen install PREFIX={unix_path(self,self.package_folder)}")if self.settings_build.os == "Windows":# 复制 erpcgen.exe 的依赖库到bin_cxx_bin = os.path.dirname(self._cxx);_dst = os.path.join(self.package_folder,"bin");copy(self,"libgcc*.dll",_cxx_bin,_dst)copy(self,"libwinpthread*.dll",_cxx_bin,_dst)copy(self,"libstdc++*.dll",_cxx_bin,_dst)

conanfile-erpcgen.py 使用示例:

conan create .\conanfile-erpcgen.py 

参考资料

《Creating environment files》
《Running with environment files》
《The environment management》

conan系列文章

《conan入门(一):conan 及 JFrog Artifactory 安装》
《conan入门(二):conan 服务配置-密码管理及策略》
《conan入门(三):上传预编译的库(artifact)》
《conan入门(四):conan 引用第三方库示例》
《conan入门(五):conan 交叉编译引用第三方库示例》
《conan入门(六):conanfile.txt conanfile.py的区别》
《conan入门(七):将自己的项目生成conan包》
《conan入门(八):交叉编译自己的conan包项目》
《conan入门(九):NDK交叉编译自己的conan包项目塈profile的定义》
《conan入门(十):Windows下Android NDK交叉编译Boost》
《conan入门(十一):Linux下Android NDK交叉编译Boost》
《conan入门(十二):Windows NDK 编译 boost报错:CMake was unable to find a build program … MinGW Makefile》
《conan入门(十三):conan info 命令的基本用法》
《conan入门(十四):conan new 命令的新特性–模板功能(–template)》
《conan入门(十五):AttributeError: ‘CMake‘ object has no attribute ‘definitions‘》
《conan入门(十六):profile template功能实现不同平台下profile的统一》
《conan入门(十七):支持android NDK (armv7,armv8,x86,x86_64)交叉编译的统一profile jinja2模板》
《conan入门(十八):Cannot recognize the Windows subsystem, install MSYS2/cygwin or specify a build_require》
《conan入门(十九):封装第三方开源库cpp_redis示例》
《conan入门(二十):封装只包含头文件(header_only)的库示例》
《conan入门(二十一):解决MinGW编译Openssl的编译错误:crypto/dso/dso_win32.c》
《conan入门(二十二):编译 openssl要求python 3.7以上版本》
《conan入门(二十三):Windows下MinGW编译libcurl》
《conan入门(二十四):通过CONAN_DISABLE_CHECK_COMPILER禁用编译器检查》
《conan入门(二十五):imports将包安装到本地项目或其他指定位置》
《conan入门(二十七):因profile [env]字段废弃导致的boost/1.81.0 在aarch64-linux-gnu下交叉编译失败》
《conan入门(二十八):解决conan 1.60.0下 arch64-linux-gnu交叉编译openssl/3.1.2报错问题》
《conan入门(二十九):对阿里mnn进行Conan封装塈conans.CMake和conan.tools.cmake.CMake的区别》
《conan入门(三十):对腾讯ncnn进行Conan封装》
《conan入门(三十一):在命令行(shell)中从profile中读取配置参数》
《conan 入门(三十二):package_info中配置禁用CMakeDeps生成使用项目自己生成的config.cmake》
《conan 入门(三十三):requirements()指定header的可见性(transitive_headers)》
《conan 入门(三十四):conan 2.x实现对只有Makefile的项目(erpcgen)的封装示例》
《conan 入门(三十五):在conanfile.py中获取C++编译器完整路径的方法》
《conan入门(三十六):在set_version方法中从pom.xml中读取版本号实现动态版本定义》
《conan 入门(三十七):conan 2.x通过定义环境变量(environment)执行make编译只有Makefile的项目(erpcgen)》
《conan 入门(三十八):conan二进制包的兼容性及自定义package_id的方式》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 读取Word表格到DataSet

目录 功能需求 Office 数据源的一些映射关系 范例运行环境 配置Office DCOM 关键代码 组件库引入 ​核心代码 杀掉进程 总结 功能需求 在应用项目里,多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求,但某些情况下,也存…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十七:演示功能模块相关功能实现

一、本章内容 本章实现常见业务功能,包括文章管理、商品管理、订单管理、会员管理等功能。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载 二、界面预览 三、开发视频 3.1 B站视频地址:

Jenkins 自动设置镜像版本号

使用Jenkins环境变量当作镜像版本号 这样version变量就是版本号,在镜像构建的过程中可以使用 docker build 之后,如果有自己的镜像库,肯定要docker push 一下 至于部署的步骤,一般需要stop并删除原有的容器.我这里用的是docker-compose。同样…

如何使用 pnpm 实现前端 Monorepo项目管理

前言 随着软件开发项目变得越来越庞大和复杂,如何有效管理和维护代码库成为了一个重要的问题。一种流行的解决方案是 Monorepo,也就是在一个版本控制系统中管理所有的项目代码。 什么是 Monorepo Monorepo 是一种项目代码管理方式,指单个仓…

PHP-8.1.0-dev 后门命令执行漏洞复现_zerodiumvar_dump

0x00漏洞描述 PHP 8.1.0-dev 版本在2021年3月28日被植入后门,但是后门很快被发现并清除。当服务器存在该后门时,攻击者可以通过发送User-Agentt头来执行任意代码。 0x01影响范围 PHP 8.1.0-dev 0x02环境搭建 1、本次环境搭建使用vulhub中的docker环…

加速 SQL 查询的 9 种方法

SQL 是开发和查询数据库的主要语言,但它有一些怪癖。在我的上一篇文章中,我分享了 7 个需要避免的 SQL 错误。现在,让我们来看看编写更快的 SQL 查询的 9 个最佳实践。 更快 SQL 查询的 9 个最佳实践 仅检索您需要的列 使用 CASE 而不是 UP…

PPT中加入页码

PPT中加入页码 文章目录 简单版本样式更改 简单版本 PPT中插入页码,基础的就是在“插入”选项卡中单机“幻灯片编号”即可 样式更改 然而,就像我们做幻灯片不满足于白底黑字一样,页码也总不能是默认的样式。 比如,在页码下面…

2023年全国省市区县行政区划矢量数据(含10段线)

2023年,中国地图面貌发生了重大变化,领土面积由960万平方公里扩大到1045万平方公里,九段线改为了十段线。 因此在使用地图的时候,特别是做全国的地图的时候,一定需要最新的行政界限,今天就将最新的省市县行…

http请求超时 ,用PHP如何解决的?

当进行HTTP请求时,有时候可能会遇到请求超时的情况。为了解决这个问题,你可以考虑以下几个方面: 设置脚本的最大执行时间: 在PHP中,可以使用set_time_limit函数来设置脚本的最大执行时间。该函数接受一个以秒为单位的整…

串口发送控制命令,实现一些外设LED 风扇 马达

main.c #include "uart4.h"int main(){char a;char buf[128];uart4_config();while (1){/* //接收一个字符数据agetchar();//发送接收的字符1putchar(a1);putchar(\r);putchar(\n); */gets(buf); // 读取字符串//puts(buf); // 输出字符串if(strcmp(buf,"l…

linux无法访问共享目录,ls hgfs失败

刚在新买的华为电脑上安装ubuntu20,共享文件出现各种问题: dlubuntu:/mnt$ ls ls: cannot access hgfs: Permission denied hgfs 解决方法: 1.首先输入vmware-hgfsclient,看看是否共享文件夹已经建立,没有的话去参考…

在Vue3中使用qrcode库实现二维码生成

本文主要介绍在Vue3中使用qrcode库实现二维码生成的方法。 目录 一、基础用法实现二、toDataURL()方法三、toCanvas()方法四、create()方法五、QRCodeRenderersOptions()方法 在Vue3中实现二维码生成需要使用第三方库来处理生成二维码的逻辑。常用的库有 qrcode和 vue-qrcode…

支付平台在选择服务器租用时要注意什么?

如果要建设一个支付平台的话要进行服务器租用,一旦涉及到钱的方面就必须要顾虑到多方面,这样才能保证安全性,今天小编就给大家讲一讲要注意什么呢? 1、带宽:带宽是业务稳定性的直接因素,只有带宽充足,这样…

kafka发送大消息

1 kafka消息压缩 kafka关于消息压缩的定义(来源于官网): 此为 Kafka 中端到端的块压缩功能。如果启用,数据将由 producer 压缩,以压缩格式写入服务器,并由 consumer 解压缩。压缩将提高 consumer 的吞吐量…

使用 pytest.ini 文件控制输出 log 日志

一、前置说明 pytest.ini 文件中可以配置参数来控制 pytest 的运行行为,其存放路径要求与 conftest.py 一样。 项目根目录project_root/ ├── pytest.ini ├── tests/ │ └── test_demo.py以test开头的测试子目录project_root/ ├── tests/ │ ├── pytest.in…

c# OpenCvSharp透视矫正六步实现透视矫正(八)

透视矫正,引用文档拍照扫描,相片矫正这块。 读取图像Cv2.ImRead();预处理(灰度化,高斯滤波、边缘检测)轮廓检测(获取到最大轮廓)获取最大面积轮廓的四个顶点标识最小矩形坐标透视矫正显示 完整代码 // 1、…

Linux系统安装及管理

目录 一、Linux应用程序基础 1.1应用程序与系统命令的关系 1.2典型应用程序的目录结构 1.3常见的软件包装类型 二、RPM软件包管理 1.RPM是什么? 2.RPM命令的格式 2,1查看已安装的软件包格式 2.2查看未安装的软件包 3.RPM安装包从哪里来? 4.挂…

web前端项目-七彩夜空烟花【附源码】

web前端项目-七彩动态夜空烟花【附源码】 本项目仅使用了HTML,代码简单,实现效果绚丽,且本项目代码直接运行即可实现,无需图片素材,接下来让我们一起实现一场美丽的烟花秀叭 运行效果:鼠标点击和移动可控制…

理解SpringMVC的工作流程

组件 前置控制器 DispatcherServlet。 映射控制器 HandlerMapping。 处理器 Controller。 模型和视图 ModelAndView。 视图解析器 ViewResolver。 工作流程 spring mvc 先将请求发送给 DispatcherServlet。 DispatcherServlet 查询一个或多个 HandlerMapping,找到…

vc 用MySQL Connector/C++

1 下载 MySQL :: Download Connector/C 2 vc配置 添加路径 2.1 右击项目 -> 属性 2.2 配置属性-> vc目录 -> 包含目录 -> 添加 D:\mysql-connector-c-8.2.0-winx64\include\jdbc 具体目录在mysql-connector-c的文件夹中搜索 mysql_driver.h文件 然后把这个文件…