conan使用(五)--打包chromium-base
现在我们就利用之前学习到的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的更多相关文章
- Chromium base库分割字符串SplitString
		
前一段时间在工作过程中遇到一个场景需要将http response中的request header中的cookie字段取出并进行解析,但是手头没有解析cookie的工具类,同时cookie的表现就是个 ...
 - conan使用(四)--打包二进制库
		
前面总结过如何打包一个存头文件库,那种情况下非常简单,因为只需要将源文件拷贝就行了.现在来研究下如何打包一个正常情况下会生成动态库或静态库的包.参考文档:https://docs.conan.io/e ...
 - conan使用(三)--打包只有头文件的库
		
参考:https://docs.conan.io/en/latest/howtos/header_only.html?highlight=header%20only 对于只含头文件的库打包非常简单,以 ...
 - Pyqt 打包资源文件
		
用打包工具将做好的Pyqt程序打包成exe后发现引用的资源图片都显示不了? 是否遇到了和我一样的问题呢.google之后找到了方法,一种方法是在程序中引用外部资源,另外一种方法是将资源文件转换为py文 ...
 - std::reverse_iterator::base
		
google chromium base MRU_Cache 支持反向erase iterator Erase(iterator pos) { deletor_(pos->second); ...
 - Flash Air 打包安卓 ane
		
工具: 1.flash builder 2.adt打包工具 3.数字证书 一. 创建 jar 文件 1. 打开flash builder, 新建一个java 项目. 2.点击项目属性,选择Java构建 ...
 - CEF中文教程(google chrome浏览器控件) -- Windows下编译Chromium
		
CEF中文教程(google chrome浏览器控件) -- CEF简介 2013-04-10 16:48 42928人阅读 评论(4) 收藏 举报 分类: CEF(2) 目录(?)[+] ...
 - Chromium多线程模型设计和实现分析
		
Chromium除了远近闻名的多进程架构之外,它的多线程模型也相当引人注目的.Chromium的多进程架构是为了解决网页的稳定性问题,而多线程模型则是为了解决网页的卡顿问题.为了达到这个目的,Chro ...
 - HTML5定稿
		
HTML5定稿了,终于有一种编程语言开发的程序可以在Android和IOS两种设备上运行了 本文转载自: http://www.cnblogs.com/tuyile006/p/4103634.html ...
 
随机推荐
- HashMap底层实现及原理
			
注意:文章的内容基于JDK1.7进行分析.1.8做的改动文章末尾进行讲解. 一.先来熟悉一下我们常用的HashMap: 1.HashSet和HashMap概述 对于HashSst及其子类而 ...
 - 浅谈JS递归
			
简单理解就是函数内部不断调用自身 直接上代码: function dg(num){ ){ ; }else{ ) } } console.log(dg()) 最后输出值为21,记住加限制条件退出递归,不 ...
 - c# 第33节 类的封装--访问修饰符
			
本节内容: 1:封装的简介 2:封装怎么实现 3:访问修饰符 1:封装的简介 2:封装怎么实现 3:访问修饰符 4:访问修饰符注意点
 - c# 第20节 一维数据的冒泡排序
			
本节内容: 1:冒泡排序说明: 2:冒泡排序实现: 3:冒泡排序的时间复杂度 1:冒泡排序说明: 冒泡排序也是最简单最基本的排序方法之一.冒泡排序的思想很简单,就是以此比较相邻的元素大小,将小的前移, ...
 - 富文本编辑器Simditor
			
文档地址:https://simditor.tower.im/docs/doc-usage.html 父组件: options: { placeHolder: 'this is placeHolder ...
 - [C7] Andrew Ng - Sequence Models
			
About this Course This course will teach you how to build models for natural language, audio, and ot ...
 - C++ class 外的 ++ 重载,左++,右++,重载示例。
			
#include <iostream> // overloading "operator ++ " outside class // ++ 是一元操作符 /////// ...
 - jQuery中的CSS(四)
			
1. css(name|pro|[,val|fn]), 访问匹配元素的样式属性 jQuery 1.8中,当你使用CSS属性在css()或animate()中,我们将根据浏览器自动加上前缀(在适当的时候 ...
 - Ubuntu中如何使得程序在后台运行
			
Ubuntu中如何使得程序在后台运行 一.前言 在Ubuntu中有的程序启动需要执行改程序./bin目录下的文件,并且启动之后这个shell就不能使用和关闭了,非常的麻烦,因此就有了相应的命令来解决这 ...
 - LeetCode 225:用队列实现栈 Implement Stack using Queues
			
题目: 使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 Implement th ...