現在我們就利用之前學習到的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上測試通過。
