分类目录归档:软件技巧

给conan2增加live555

目录结构

./
├── all
   ├── conandata.yml
   ├── conanfile.py
   └── patches
       └── 0001-fix-build-error-without-c++20.patch
├── build.sh
└── config.yml

文件内容

conanfile.py

from conan import ConanFile
from conan.tools.build import cross_building
from conan.tools.gnu import Autotools, AutotoolsDeps, AutotoolsToolchain
from conan.tools.layout import basic_layout
from conan.tools.env import VirtualBuildEnv
from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, replace_in_file, save
from conan.tools.microsoft import is_msvc
import os

required_conan_version = ">=2.0"


class live555Conan(ConanFile):
    name = "live555"

    # Optional metadata
    license = "LGPL"
    homepage = "http://live555.com/liveMedia/"
    description = "libraries for standards-based RTP/RTCP/RTSP/SIP multimedia streaming, suitable for embedded and/or low-cost streaming applications"
    url = "https://github.com/conan-io/conan-center-index"
    topics = ("RTP", "RTCP", "RTSP", "SIP")

    # Binary configuration
    settings = "os", "arch", "compiler", "build_type"
    options = {
        "shared": [True, False],
        "fPIC": [True, False],
    }
    default_options = {
        "shared": False,
        "fPIC": True,
    }

    # Sources are located in the same place as this recipe, copy them to the recipe
    def export_sources(self):
        export_conandata_patches(self)

    def config_options(self):
        if self.settings.os == "Windows":
            self.options.rm_safe("fPIC")

    def configure(self):
        print("-- configure() --")
        if self.options.shared:
            self.options.rm_safe("fPIC")
        self.settings.rm_safe("compiler.cppstd")
        self.settings.rm_safe("compiler.libcxx")

    def layout(self):
        basic_layout(self)
        # set build folder to source folder in order to execute make in build()
        self.folders.build = self.source_folder
        # set generators folder to source folder in order to generate Makefile in generate()
        self.folders.generators = self.source_folder

    def requirements(self):
        print("-- requirements() --")
        self.requires("openssl/[>=1.1 <4]@thirdparty/stable")

    # download source and copy to build forlder
    def source(self):
        print("-- source() --")
        get(self, **self.conan_data["sources"][self.version], strip_root=True)
        apply_conandata_patches(self)

    def generate(self):
        print("-- generate() --")
        components = ["UsageEnvironment", "BasicUsageEnvironment", "groupsock", "liveMedia"]
        for component in components:
            self.run(f"chmod +w {component}/Makefile.tail")
            replace_in_file(self, f"{component}/Makefile.tail", f"$(DESTDIR)$(PREFIX)/include/{component}", "$(DESTDIR)$(PREFIX)/include/")
        if cross_building(self):
            # add write permission for each config files
            self.run("chmod +w config.*")
            # for cross compile
            replace_in_file(self, "config.armlinux", "CROSS_COMPILE?=		arm-elf-", "CROSS_COMPILE= $(CROSS_COMPILE_PREFIX)")
            replace_in_file(self, "config.armlinux", "CPLUSPLUS_FLAGS =	$(COMPILE_OPTS) -Wall -DBSD=1", "CPLUSPLUS_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) -Wall -DBSD=1")
            replace_in_file(self, "config.armlinux", "LIBS_FOR_CONSOLE_APPLICATION = -lssl -lcrypto", "LIBS_FOR_CONSOLE_APPLICATION = $(LDFLAGS) -lssl -lcrypto -lz -ldl -lpthread -lrt")
            save(self, "config.armlinux", "PREFIX = ", True)

        if self.settings.arch == "x86_64":
            self.run("./genMakefiles linux-64bit")
        elif self.settings.arch == "armv8":
            self.run("./genMakefiles armlinux")
        else:
            print(f"UNKNOWN arch:{self.settings.arch}")
            return
        env = VirtualBuildEnv(self)
        env.generate()
        tc = AutotoolsToolchain(self)
        tc.generate()
        td = AutotoolsDeps(self)
        td.generate()

    def build(self):
        print("-- build() --")
        # add execute permission for generated scripts
        self.run("chmod +x conan*.sh deactivate*.sh")
        self.run("./conanbuild.sh")
        autotools = Autotools(self)
        autotools.make()
        self.run("./deactivate_conanbuild.sh")

    def package(self):
        print("-- package() --")
        print("source_folder:", self.source_folder)
        print("package_folder:", self.package_folder)
        copy(self, "COPYING*", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
        self.run("./conanbuild.sh")
        autotools = Autotools(self)
        autotools.install()
        self.run("./deactivate_conanbuild.sh")

    @property
    def _live555_components(self):
        components = [
            {"target": "UsageEnvironment",       "lib": "UsageEnvironment",      "requires": []},
            {"target": "BasicUsageEnvironment",  "lib": "BasicUsageEnvironment", "requires": []},
            {"target": "groupsock",              "lib": "groupsock",             "requires": []},
            {"target": "liveMedia",              "lib": "liveMedia",             "requires": []},
        ]
        return components

    def package_info(self):
        version = self.version.split(".")
        version = "".join(version) if self.settings.os == "Windows" else ""
        debug = "d" if self.settings.build_type == "Debug" and is_msvc(self) else ""

        def get_lib_name(module):
            return module

        def add_components(components):
            for component in components:
                conan_component = component["target"]
                cmake_target = component["target"]
                cmake_component = component["lib"]
                lib_name = get_lib_name(component["lib"])
                requires = component["requires"]
                # TODO: we should also define COMPONENTS names of each target for find_package() but not possible yet in CMakeDeps
                #       see https://github.com/conan-io/conan/issues/10258
                self.cpp_info.components[conan_component].set_property("cmake_target_name", cmake_target)
                self.cpp_info.components[conan_component].libs = [lib_name]
                self.cpp_info.components[conan_component].requires = requires
                if self.settings.os in ["Linux", "FreeBSD"]:
                    self.cpp_info.components[conan_component].system_libs = ["dl", "m", "pthread", "rt"]
 
        self.cpp_info.set_property("cmake_file_name", "live555")
        add_components(self._live555_components)

conandata.yml

sources:
  "2023.07.24":
    url: "http://live555.com/liveMedia/public/live.2023.07.24.tar.gz"
    sha1: "a56b6a79072d37f63d5e36828185e5efff7c99f8"
patches:
  "2023.07.24":
    - patch_file: "patches/0001-fix-build-error-without-c++20.patch"
      patch_description: "fix build error while cross build without c++20 support"
      patch_type: "portability"

build.sh

#!/bin/bash
set -e
package_name=live555
package_version=2023.07.24
# libjpeg
conan create all/conanfile.py --name ${package_name} --version ${package_version} --user thirdparty --channel stable
conan upload -r conan-local --force --confirm ${package_name}/${package_version}@thirdparty/stable

WSL2安装Ubuntu22.04后中文GUI显示方块的问题

安装中文包

sudo apt install language-pack-zh-hans
sudo dpkg-reconfigure locales #这一步要选择en_US.UTF-8和zh_CN.UTF-8, 并且en_US.UTF-8为默认语言
sudo apt install fontconfig

配置windows字体

创建 /etc/fonts/local.conf 文件并添加以下内容

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>

刷新字体缓存

fc-cache -f -v

重启WSL

wsl --shutdown

Ubuntu20.04从源码安装opencv

准备编译环境

sudo apt install build-essential cmake git pkg-config libgtk-3-dev \
    libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
    libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev \
    gfortran openexr libatlas-base-dev python3-dev python3-numpy \
    libtbb2 libtbb-dev libdc1394-22-dev libopenexr-dev \
    libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev mlocate

下载

https://github.com/opencv/opencv/releases

编译

tar xzvf opencv-4.6.0.tar.gz
cd opencv-4.6.0
mkdir build
cd build
cmake -D OPENCV_GENERATE_PKGCONFIG=ON ..
make -j8
sudo make install

常见错误

编译安装完成后使用pkg-config提示找不到opencv的错误

pkg-config --modversion opencv
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found

原因是编译时缺少参数 -D OPENCV_GENERATE_PKGCONFIG=ON

重新安装后,更新一下数据库

sudo updatedb

再来试试

pkg-config --modversion opencv4
4.6.0

Ubuntu20.04 如何降级php

Ubuntu20.04默认安装的php版本是7.4,如果想要降级到7.3,7.2需要进行如下操作

安装英语语言包

sudo apt-get install -y language-pack-en-base

安装ondrej/php源

export LC_ALL=en_US.UTF-8 && export LANG=en_US.UTF-8 && sudo apt-get install -y software-properties-common && sudo add-apt-repository -y ppa:ondrej/php

安装需要的php版本吧

sudo apt-get install php7.3

参考资料

群晖通过Docker部署GitLab Runner

准备:

  • 在群晖docker共享文件夹下新建gitlab-runner目录
  • 在gitlab-runner目录下新建config目录

通过终端进入群晖

sudo docker run -d --name gitlab-runner --restart always \
-v /volume1/docker/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
-p 8093:8093 \
gitlab/gitlab-runner:latest

注册Runner

在群晖终端输入

sudo docker run --rm -it \
-v /volume1/docker/gitlab-runner/config:/etc/gitlab-runner \
gitlab/gitlab-runner \
register

根据提示,输入gitlab访问url以及注册令牌,完成注册