Jinja2 di dunia C ++, bagian tiga. "Sekarang kamu berada di Conan"

gambarLebih dari satu setengah tahun telah berlalu sejak publikasi bagian sebelumnya , banyak fitur diimplementasikan, beberapa rilis dibuat, tetapi ini tidak akan dibahas. Peristiwa penting terjadi beberapa hari yang lalu dalam kehidupan perpustakaan: ditambahkan ke repositori conan utama (conan-center-index). Tentang bagaimana ini terjadi, apa yang harus dilakukan untuk ini, dan apa yang umumnya perlu dilakukan untuk menambahkan perpustakaan Anda di sana, dan kami akan berbicara di bawah potongan.


JFrog melakukan yang terbaik yang mereka bisa


gambarSebagai permulaan, beberapa kata tentang apa itu conan (alias conan, alias conan.io) dan conan-center-index. Conan adalah paket yang berorientasi pada C ++ dan manajer dependensi (yang lain, tetapi semakin populer dengan cepat). Cukup mudah untuk menginstal, mengkonfigurasi, dan memiliki beberapa kelebihan yang tidak diragukan:


  1. Itu tidak terikat pada sistem bangunan, kompiler atau sistem operasi tertentu;
  2. Dapat menggunakan sistem repositori terdistribusi;
  3. Menggunakan artifactory memungkinkan Anda untuk menggunakan repositori proyek / tim lokal (pribadi);
  4. Ini mendukung pengiriman dependensi baik dalam bentuk biner (sudah dirakit) dan perakitannya secara lokal dari sumber untuk profil tertentu;
  5. Relatif mudah untuk dikonfigurasi dan digunakan.

, , , . , , (conan profile) , , . ! on-site- - . -, . , , . ( ).


, . bincrafters β€” , . bincrafters ( ) : .


, conan.io conan-center-index. β€” -, . (, β€” ) pull request . β€” ( , ) . : jinja2cpp/1.1.0


Nothing to do all day but stay in bed


gambar - , conan.io , , , . . , , β€” , conan-, . . , bincrafters : https://github.com/bincrafters/templates.


, . , bintray ( ) β€” . : 130. conan-index ( ) 130 . , Jinja2C++. :


  • (Windows/Linux)
  • (x86/x64)
  • ( MSVC β€” , gcc β€” ABI )
  • (debug/release)
  • (shared/static)

, , , CI . appveyor, travis, Github Actions , β€” -, , . ? ? ? … .


Errors flying over your head


β„–1: , , ( ) β€” , .
β„–2: , , .
β„–3: , -, .



, . , , CI , : "Debug CI build", CI .


, . , - , . β€” . , . , , ( conan-index bincrafters). , , , , , . , - ( ), . - , issue.


: Jinja2C++ GitHub Actions 30- Linux, 48- Windows, 16 appveyor 5 . : conan-center-index .


If you want to survive, get out of bed!


, . ? :


  1. , . windows, linux, . CI . .
  2. (, . .) . conan index . .
  3. Early Access Programm conan index, . , . issue . : https://github.com/conan-io/conan-center-index/issues/4
  4. . . , - . , , , , , ( β€” ). .
  5. conan-center-index. PR conan.io team.

conan-center-index , : https://github.com/conan-io/conan-center-index/wiki , , - .


You've got your orders better shoot on sight


, . github-, , . , Jinja2C++. β€” . :


.
+-- recipes
|   +-- jinja2cpp
|       +-- config.yml
|       +-- 1.1.0
|           +-- CMakeLists.txt
|           +-- conanfile.py
|           +-- conandata.yml
|           +-- test_package
|               +-- CMakeLists.txt
|               +-- conanfile.py

:


config.yml


β€” , :


---
versions:
  "1.1.0":
    folder: 1.1.0 

, , , all, config.yml β€” ( β€” ).


1.1.0


, . . . . (conanfile.py), (conandata.yml) test_package, β€” . , , .


1.1.0/conanfile.py


. β€” , .


1.1.0/conandata.yml


. , . . , master' . conan-center-index . :


sources:
  "1.1.0":
    url: https://github.com/jinja2cpp/Jinja2Cpp/archive/1.1.0.tar.gz
    sha256: 3d321a144f3774702d3a6252e3a6370cdaff9c96d8761d850bb79cdb45b372c5

- .


1.1.0/CMakeFile.txt


, . , conan', CMake- :


cmake_minimum_required(VERSION 3.4.3)
project(cmake_wrapper)

include(conanbuildinfo.cmake)
conan_basic_setup()

unset (BUILD_SHARED_LIBS CACHE)
if (NOT CMAKE_BUILD_TYPE)
    set (CMAKE_BUILD_TYPE ${JINJA2CPP_CONAN_BUILD_TYPE})
endif ()

add_subdirectory(source_subfolder)

? cmake- (conanbuildinfo.cmake), , . , , , , PIC . ( ) CMake- , conan , . β€” -. , - . β€” , msbuild.exe.


1.1.0/test_package


. (conanfile.py) (CMakeLists.txt) (main.cpp), - . , "Hello World!".


1.1.0/test_package/conanfile.py


. , -. :


from conans import ConanFile, CMake, tools
import os

class Jinja2CppTestPackage(ConanFile):
    settings = "os", "arch", "compiler", "build_type"
    generators = "cmake", "cmake_find_package"

    def build(self):
        cmake = CMake(self)
        compiler = self.settings.get_safe("compiler")
        if compiler == 'Visual Studio':
            runtime = self.settings.get_safe("compiler.runtime")
            cmake.definitions["MSVC_RUNTIME_TYPE"] = '/' + runtime

        cmake.configure()
        cmake.build()

    def test(self):
        if not tools.cross_building(self.settings):
            ext = ".exe" if self.settings.os == "Windows" else ""
            bin_path = os.path.join("bin", "jinja2cpp-test-package" + ext)
            self.run(bin_path, run_environment=True)

, . β€” ( build) ( test). β€” . , MSVC. β€” . , . CMake β€” cmake cmake_find_package. β€” .


1.1.0/test_package/CMakeLists.txt


:


cmake_minimum_required(VERSION 2.8.0)
project(Jinja2CppTestPackage)

set(CMAKE_CXX_STANDARD 14)

include (${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()

find_package(jinja2cpp REQUIRED)

if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
    if (CMAKE_BUILD_TYPE MATCHES "Debug" AND MSVC_RUNTIME_TYPE)
        set (MSVC_RUNTIME_TYPE "${MSVC_RUNTIME_TYPE}d")
    endif ()

    set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${MSVC_RUNTIME_TYPE}")
    set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${MSVC_RUNTIME_TYPE}")
    set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${MSVC_RUNTIME_TYPE}")
    set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/PROFILE")

    message (STATUS "Build type: ${CMAKE_BUILD_TYPE}")
    message (STATUS "USE MSVC RUNTIME: ${MSVC_RUNTIME_TYPE}")

endif()

add_executable(jinja2cpp-test-package main.cpp)
target_link_libraries(jinja2cpp-test-package PRIVATE jinja2cpp::jinja2cpp)

cmake, , conanbuildinfo.cmake, cmake_find_package β€” find', conan- . : β€” case-sensitive, (, ) . .


, , , .


1.1.0/test_package/main.cpp


, , conan- :


#include <jinja2cpp/template.h>
#include <iostream>

int main()
{
    std::string source = R"(
{{ ("Hello", 'world') | join }}!!!
{{ ("Hello", 'world') | join(', ') }}!!!
{{ ("Hello", 'world') | join(d = '; ') }}!!!
{{ ("Hello", 'world') | join(d = '; ') | lower }}!!!)";

    jinja2::Template tpl;
    tpl.Load(source);

    std::string result = tpl.RenderAsString(jinja2::ValuesMap()).value();
    std::cout << result << "\n";
} 

! smoke-, . β€” "!", !


Your finger's on the keyboard


, . , , . β€” -, PEP8. β€” , , , . :


import os
from conans import ConanFile, CMake, tools
from conans.errors import ConanInvalidConfiguration

class Jinja2cppConan(ConanFile):
# global settings and metainfo

    def config_options(self):
#...

    def configure(self):
#...

    def source(self):
#...

    def build(self):
#...

    def package(self):
#...

    def package_info(self):
#...

conan. :


  • config_options β€”
  • configure β€”
  • source β€”
  • build β€”
  • package β€” ( install, )
  • package_info β€” ,

, . Jinja2C++, CMake-, .



    name = "jinja2cpp"
    license = "MIT"
    homepage = "https://jinja2cpp.dev/"
    url = "https://github.com/conan-io/conan-center-index"
    description = "Jinja2 C++ (and for C++) almost full-conformance template engine implementation"
    topics = ("conan", "cpp14", "cpp17", "jinja2", "string templates", "templates engine")
    exports_sources = ["CMakeLists.txt"]
    generators = "cmake", "cmake_find_package"
    settings = "os", "compiler", "build_type", "arch"
    options = {
        "shared": [True, False], "fPIC": [True, False]
    }
    default_options = {'shared': False, "fPIC": True}
    requires = (
        "variant-lite/1.2.2",
        "expected-lite/0.3.0",
        "optional-lite/3.2.0",
        "string-view-lite/1.3.0",
        "boost/1.72.0",
        "fmt/6.1.2",
        "rapidjson/1.1.0"
    )

    _source_subfolder = "source_subfolder"
    _build_subfolder = "build_subfolder"
    _cpp_std = 14

(name, license, homepage, url, description, topics), (generators, settings, options, default_options), (requires) , (_source_subfloder, _build_subfolder _cpp_std).


, conan-center-index:


  • , community, ( author);
  • url conan-center-index;
  • β€” homepage;
  • static, shared-. -fPIC. hook-;
  • β€” ( ), , conan-center-index.

config_options


, :


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

Windows fPIC β€” . .


config


. , . .


    def configure(self):
        if self.options.shared:
            del self.options.fPIC

        cppstd = self.settings.get_safe("compiler.cppstd")
        if cppstd:
            cppstd_pattern = re.compile(r'^(gnu)?(?P<cppstd>\d+)$')
            m = cppstd_pattern.match(cppstd)
            cppstd_profile = int(m.group("cppstd"))
            if cppstd_profile < 14:
                raise ConanInvalidConfiguration("Minimum C++ Standard required is 14 (provided '{}')".format(cppstd))
            else:
                self._cpp_std = cppstd_profile

β€” shared- fPIC , (14). - , . : ConanInvalidConfiguration β€” . , , .


source


:


    def source(self):
        tools.get(**self.conan_data["sources"][self.version])
        extracted_dir = "Jinja2Cpp-" + self.version
        os.rename(extracted_dir, self._source_subfolder)

"" .


build


. , . . CMake :


    def build(self):
        cmake = CMake(self)
        cmake.definitions["JINJA2CPP_BUILD_TESTS"] = False
        cmake.definitions["JINJA2CPP_STRICT_WARNINGS"] = False
        cmake.definitions["JINJA2CPP_BUILD_SHARED"] = self.options.shared
        cmake.definitions["JINJA2CPP_DEPS_MODE"] = "conan-build"
        cmake.definitions["JINJA2CPP_CXX_STANDARD"] = self._cpp_std
        # Conan cmake generator omits the build_type flag for MSVC multiconfiguration CMake,
        # but provide build-type-specific runtime type flag. For now, Jinja2C++ build scripts
        # need to know the build type is being built in order to setup internal flags correctly
        cmake.definitions["JINJA2CPP_CONAN_BUILD_TYPE"] = self.settings.build_type
        compiler = self.settings.get_safe("compiler")
        if compiler == 'Visual Studio':
            # Runtime type configuration for Jinja2C++ should be strictly '/MT' or '/MD'
            runtime = self.settings.get_safe("compiler.runtime")            
            if runtime == 'MTd':
                runtime = 'MT'
            if runtime == 'MDd':
                runtime = 'MD'
            cmake.definitions["JINJA2CPP_MSVC_RUNTIME_TYPE"] = '/' + runtime

        cmake.configure(build_folder=self._build_subfolder)
        cmake.build()

, , cmake' . CMake- , Jinja2C++, .


package


, . , :


    def package(self):
        self.copy("LICENSE", dst="licenses", src=self._source_subfolder)
        self.copy("*.h", dst="include", src=os.path.join(self._source_subfolder, "include"))
        self.copy("*.hpp", dst="include", src=os.path.join(self._source_subfolder, "include"))
        self.copy("*.lib", dst="lib", keep_path=False)
        self.copy("*.dll", dst="bin", keep_path=False)
        self.copy("*.so", dst="lib", keep_path=False)
        self.copy("*.so.*", dst="lib", keep_path=False)
        self.copy("*.dylib", dst="lib", keep_path=False)
        self.copy("*.a", dst="lib", keep_path=False)

β€” install-. , β€” . , , :


  • . .
  • .cmake- ( ) . .

β€” , , install'.


package_info


, : , , , . . , , . :


    def package_info(self):
        self.cpp_info.libs = ["jinja2cpp"]

. define' , .


The sergeant calls (stand up and fight!)


β€” . . . , ( PR): . , :


> conan create . jinja2cpp/1.1.0@

( jinja2cpp/1.1.0 β€” )


, . conan- . . . , , . … .


, ( ) . Windows-, Linux-. Windows β€” shared . Linux… Linux β€” . - -, conan . : https://hub.docker.com/u/conanio GitHub Actions.


:


[settings]
arch=x86_64
arch_build=x86_64
build_type=Release
compiler=Visual Studio
compiler.runtime=MD
compiler.version=15
os=Windows
os_build=Windows
[options]
jinja2cpp:shared=False
[env]

[build_requires]

. :


> conan create . jinja2cpp/1.1.0@ -p profile_md.txt

profile_md.txt β€” .


: ( β€” , , ) . , , . , pull request' conan-center-index . , , , . β€” conan'. , , Visual Studio . , , .


You'll be the hero of the neighbourhood


, conan-center-index , , , , , . , , C++ . conan β€” , , . , , , . , β€” .


:


conan-center-index
Issue EAP
Jinja2C++
conan-center


Dalam teks artikel, baris dari lagu β€œYou in the army now” oleh Status Quo digunakan sebagai subtitle


All Articles