现在我们就利用之前学习到的conan的使用方法,将chromium中的base库打包成一个conan包。

1. 准备源码

chromium本身是通过gn来编译的,这个目前conan并不支持。所以需要把它从chromium代码中抽离出来,这是一个复杂的工作。所幸的是,已有大神做了做方面工作:https://github.com/shaoyuan1943/chromium-base 。
拿到源码,我们当然需要在各个平台进行验证,看是否能成功编译。
从README中了解到:

  • 编译Windows版本,需直接使用sln工程文件进行编译;
  • 编译Linux版本,需使用作者写好的编译sh脚本。

在Linux上单独使用CMakeLists.txt进行编译是无法编译通过的,查看它的实现,发现里面由很多非预定义的变量。看了 build_base_linux.sh脚本后,确定该脚本主要功能就是设置这些变量:
 
因此,确定我们使用conan编译的方案:

  • windows上直接使用MSBuild进行编译;
  • Linux上使用cmake进行编译,但是要设置好一些变量。

2. 编写conanfile.py

经过反复测试,conanfile.py的内容如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*- from conans import ConanFile, MSBuild, CMake, tools class ChromiumbaseConan(ConanFile):
name = "chromium-base"
version = "1.0.1"
license = ""
author = "google"
url = "https://github.com/shaoyuan1943/chromium-base"
description = "Base library from chromium source code"
topics = ("chromium", "base")
settings = "os", "compiler", "build_type", "arch"
options = {"shared": [True, False]}
default_options = {"shared": True} def configure(self):
if self.settings.os == "Windows":
self.generators = "visual_studio", # Trailing comma, or ["visual_studio"]
else:
self.generators = "cmake", # Note the trailing comma def source(self):
self.run("git clone -b conan https://github.com/243286065/chromium-base.git")
if self.settings.os == "Linux":
# 解决本身的依赖问题
tools.replace_in_file("chromium-base/src/CMakeLists.txt", "project(base)",
'''project(base)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()''') # 按照要求修改CMakeLists.txt
tools.replace_in_file("chromium-base/src/CMakeLists.txt",
'''set(BASE_INCLUDE_PLATFORM_DIRECTORIES
/usr/local/include/glib-2.0
/usr/local/lib/glib-2.0/include # for glibconfig.h
)''', "")
# CMakeLists.txt默认是编译shared版本,需要根据配置自动选择
if self.options.shared == False:
tools.replace_in_file("chromium-base/src/CMakeLists.txt", "set(BASE_BUILD_CONFIGURATION_TYPE SHARED)",
'''set(BASE_BUILD_CONFIGURATION_TYPE)''') def requirements(self):
if self.settings.os == "Linux":
self.requires("glib/2.56.1@bincrafters/stable")
self.requires("libevent/2.1.10@bincrafters/stable") def build(self):
if self.settings.os == "Linux":
cmake = CMake(self)
cmake.definitions["CMAKE_BUILD_TYPE"] = self.settings.build_type
if self.settings.arch in ["x86_64", "x64"]:
cmake.definitions["BASE_ARCH_PLATFORM"] = "x64"
else:
cmake.definitions["BASE_ARCH_PLATFORM"] = "x86"
cmake.definitions["BASE_BUILD_PLATFORM"] = self.settings.os
cmake.configure(source_folder="chromium-base/src")
cmake.build() elif self.settings.os == "Windows":
msbuild = MSBuild(self)
msbuild.build("chromium-base/src/sln/base.sln", targets=["base"], build_type=self.settings.build_type) def package(self):
self.copy("*", dst="include/base", src="chromium-base/src/base")
self.copy("*.lib", dst="lib", keep_path=False)
self.copy("*.dll", dst="bin", keep_path=False)
self.copy("*.dylib*", dst="lib", keep_path=False)
self.copy("*.so", dst="lib", keep_path=False)
self.copy("*.a", dst="lib", keep_path=False) def package_info(self):
self.cpp_info.libs = ["chromium-base"]
  • configure 函数解决指定编译器的配置问题;
  • source 函数是准备源码,这里同样是从github上下载。对于Linux平台,提供替换字符串的方法,修改CMakeLists.txt文件,为编译做好准备。
  • requirements 是解决Linux上依赖glib的问题;
  • build 即进行编译,在Linux上需要设置好一些变量;Windows上需要指定编译目标工程;
  • package 即做打包工作,把库文件和头文件导出;
  • package_info : 声明包的信息。

window上由于是指定的sln文件,目前我还没想到怎么修改它是编译动态库还是静态库。

3. 打包

编写好conanfile.py后,就可以进行打包:

conan create . google/stable

打包成功后,上传到服务器:

conan upload chromium-base/1.0.1@google/stable -r develope --all


注意chromium-base依赖C++17,因此在Linux上重新编译包时,请带上 -s compiler.libcxx=libstdc++11 参数

4. 测试

在Ubuntu和Windows上测试通过。

项目地址:https://github.com/243286065/chromium-base/tree/conan

conan使用(五)--打包chromium-base的更多相关文章

  1. Chromium base库分割字符串SplitString

    前一段时间在工作过程中遇到一个场景需要将http response中的request header中的cookie字段取出并进行解析,但是手头没有解析cookie的工具类,同时cookie的表现就是个 ...

  2. conan使用(四)--打包二进制库

    前面总结过如何打包一个存头文件库,那种情况下非常简单,因为只需要将源文件拷贝就行了.现在来研究下如何打包一个正常情况下会生成动态库或静态库的包.参考文档:https://docs.conan.io/e ...

  3. conan使用(三)--打包只有头文件的库

    参考:https://docs.conan.io/en/latest/howtos/header_only.html?highlight=header%20only 对于只含头文件的库打包非常简单,以 ...

  4. Pyqt 打包资源文件

    用打包工具将做好的Pyqt程序打包成exe后发现引用的资源图片都显示不了? 是否遇到了和我一样的问题呢.google之后找到了方法,一种方法是在程序中引用外部资源,另外一种方法是将资源文件转换为py文 ...

  5. std::reverse_iterator::base

    google chromium base MRU_Cache 支持反向erase iterator Erase(iterator pos) {  deletor_(pos->second);  ...

  6. Flash Air 打包安卓 ane

    工具: 1.flash builder 2.adt打包工具 3.数字证书 一. 创建 jar 文件 1. 打开flash builder, 新建一个java 项目. 2.点击项目属性,选择Java构建 ...

  7. CEF中文教程(google chrome浏览器控件) -- Windows下编译Chromium

    CEF中文教程(google chrome浏览器控件) -- CEF简介 2013-04-10 16:48 42928人阅读 评论(4) 收藏 举报  分类: CEF(2)    目录(?)[+]   ...

  8. Chromium多线程模型设计和实现分析

    Chromium除了远近闻名的多进程架构之外,它的多线程模型也相当引人注目的.Chromium的多进程架构是为了解决网页的稳定性问题,而多线程模型则是为了解决网页的卡顿问题.为了达到这个目的,Chro ...

  9. HTML5定稿

    HTML5定稿了,终于有一种编程语言开发的程序可以在Android和IOS两种设备上运行了 本文转载自: http://www.cnblogs.com/tuyile006/p/4103634.html ...

随机推荐

  1. Java 种15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁等等…

    Java 中15种锁的介绍 1,在读很多并发文章中,会提及各种各样的锁,如公平锁,乐观锁,下面是对各种锁的总结归纳: 公平锁/非公平锁 可重入锁/不可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲 ...

  2. luoguP3017Brownie Slicing

    https://www.luogu.org/problem/P3017 题意 给你一个蛋糕,R行C列 ,每个点有巧克力碎屑(如下) 1 2 2 1 3 1 1 1 2 0 1 3 1 1 1 1 1 ...

  3. python的http包

    http包简介 http包提供了 HTTP协议的一些功能,主要模块有: http.client   --- 底层的 HTTP 协议的一些功能,可以为 urllib.request 模块所用 http. ...

  4. 【Eureka篇三】Eureka集群配置(5)

    1. 新建子模块microservicecloud-eureka-7002(后面简称7002) 和 microservicecloud-eureka-7003(后面简称为7003),packaging ...

  5. pwntools出现的一些问题

    pwntools用的好好的突然就不能用了总结了一些问题:ImportError:cannot import name ENUM_P_TYPE 解决方法为:将/usr/local/lib/python2 ...

  6. Python 中的时间处理包datetime和arrow

    Python 中的时间处理包datetime和arrow 在获取贝壳分的时候用到了时间处理函数,想要获取上个月时间包括年.月.日等 # 方法一: today = datetime.date.today ...

  7. 全国省市区 json sql 支付宝 2019年9月29日

    数据来源: https://docs.alipay.com/isv/10327 链接:https://pan.baidu.com/s/14cQCRzU6QxAvknDrQfhyUA 提取码:baaf ...

  8. 你需要知道的8个CSS带@的规则

    1:@charset(用来设置html文档字符编码的格式,比如我们常用的,charset='utf-8') 注:建议CSS文件最顶部都加上@charset "utf-8";,避免出 ...

  9. Vue.js 源码分析(三) 基础篇 模板渲染 el、emplate、render属性详解

    Vue有三个属性和模板有关,官网上是这样解释的: el ;提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标 template ;一个字符串模板作为 Vue 实例的标识使用.模板将会 ...

  10. 第二十二节:Asp.Net Core中使用托管服务实现后台任务

    1. 说明 BackgroundService 是用于实现长时间运行的 IHostedService 的基类,使用程序集:Microsoft.Extensions.Hosting. 2. 实现方式 继 ...