рдЬрд┐рдирдЬрд╛ 2 рд╕реА ++ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рднрд╛рдЧ рддреАрдиред "рдЕрдм рдЖрдк рдХреЙрдирди рдореЗрдВ рд╣реИрдВ"

рдЫрд╡рд┐рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рдбреЗрдврд╝ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВ, рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЧреБрдЪреНрдЫрд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХрдИ рд░рд┐рд▓реАрдЬрд╝ рдХрд┐рдП рдЧрдП рдереЗ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреАред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЬреАрд╡рди рдореЗрдВ рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдирд╛ рдШрдЯреА рдереА: рдЗрд╕реЗ рдореБрдЦреНрдп рдХреЙрдирди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (рдХреЙрдирди-рд╕реЗрдВрдЯрд░-рдЗрдВрдбреЗрдХреНрд╕) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ ред рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рд╡рд╣рд╛рдВ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рдо рдХрдЯ рдХреЗ рддрд╣рдд рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред


JFrog рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ


рдЫрд╡рд┐рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЙрдирди (рдЙрд░реНрдл рдХреЙрдирди, рдЙрд░реНрдл тАЛтАЛрдХреЙрдирди.рдЖрдИрдУ) рдФрд░ рдХреЙрдирди-рд╕реЗрдВрдЯрд░-рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред рдХреЙрдирди рдПрдХ C ++ - рдЙрдиреНрдореБрдЦ рдкреИрдХреЗрдЬ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрдХ рд╣реИ (рдПрдХ рдФрд░, рд▓реЗрдХрд┐рди рддреЗрдЬреА рд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдореЗрдВ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ)ред рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдХрдИ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдлрд╛рдпрджреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:


  1. рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо, рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдмрдВрдзрд╛ рдирд╣реАрдВ рд╣реИ;
  2. рдПрдХ рд╡рд┐рддрд░рд┐рдд рднрдВрдбрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
  3. рдЖрд░реНрдЯрд┐рдлрд╝реИрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рд╕реНрдерд╛рдиреАрдп (рдирд┐рдЬреА) рдкреНрд░реЛрдЬреЗрдХреНрдЯ / рдЯреАрдо рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рддреИрдирд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
  4. рдпрд╣ рдмрд╛рдЗрдирд░реА (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдХрдЯреНрдареЗ) рдлреЙрд░реНрдо рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╡рд┐рддрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЙрдирдХреА рд╡рд┐рдзрд╛рдирд╕рднрд╛;
  5. рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЙрдирди рдХреЗ рд╕рд╛рде, рдЖрдк рдмрд╕ рдЙрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдлрд┐рд░ рд╡рд╣ рдЦреБрдж рд╕рдм рдХреБрдЫ рдХрд░рддрд╛ рд╣реИред рдФрд░, рдмрд╢рд░реНрддреЗ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рдХреЙрдирди рдкреНрд░реЛрдлрд╛рдЗрд▓) рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╕ рдЕрдирд▓реЛрдб, рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВред рдЬрд╛рджреВ! рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреА рд╕рд╛рдЗрдЯ рдкрд░ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЛ рдХрд╣реАрдВ рдЭреВрда рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд╣реАрдВ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╣реИрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд (рдпрд╛ рдЯреАрдо) рдХрд╛ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдФрд░ рдЕрдВрддрд╣реАрди рд╕реЗрдЯред


, . bincrafters тАФ , . bincrafters ( ) : .


, conan.io conan-center-index. тАФ -, . (, тАФ ) pull request . тАФ ( , ) . : jinja2cpp/1.1.0


Nothing to do all day but stay in bed


рдЫрд╡рд┐ - , 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


рд▓реЗрдЦ рдХреЗ рдкрд╛рда рдореЗрдВ, рд╕реНрдЯреЗрдЯрд╕ рдХреНрд╡реЛ рдХреЗ рдЧреАрдд "рдпреВ рдлрд╝реЙрд░ рдЖрд░реНрдореА рдирд╛рдЙ" рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЙрдкрд╢реАрд░реНрд╖рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛


All Articles