conanfile.py

            # -*- coding: utf-8 -*-
from conans import ConanFile, CMake, tools
from conans.tools import SystemPackageTool
import os
import shutil


class OpenCVConan(ConanFile):
    name = "opencv"
    version = "2.4.13.5"
    license = "LGPL"
    homepage = "https://github.com/opencv/opencv"
    description = "OpenCV (Open Source Computer Vision Library)"
    url = "https://github.com/conan-community/conan-opencv"
    author = "Conan Community"
    settings = "os", "compiler", "build_type", "arch"
    options = {"shared": [True, False],
               "fPIC": [True, False],
               "jpeg": [True, False],
               "png": [True, False],
               "tiff": [True, False],
               "jasper": [True, False],
               "openexr": [True, False]}
    default_options = {'shared': False,
                       "fPIC": True,
                       "jpeg": True,
                       "png": True,
                       "tiff": True,
                       "jasper": True,
                       "openexr": True}
    generators = "cmake"
    _source_subfolder = "sources"

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

    def requirements(self):
        self.requires.add('zlib/1.2.11@conan/stable')
        if self.options.jpeg:
            self.requires.add('libjpeg/9c@bincrafters/stable')
        if self.options.png:
            self.requires.add('libpng/1.6.34@bincrafters/stable')
        if self.options.tiff:
            self.requires.add('libtiff/4.0.8@bincrafters/stable')
        if self.options.jasper:
            self.requires.add('jasper/2.0.14@conan/stable')
        if self.options.openexr:
            self.requires.add('openexr/2.3.0@conan/stable')

    def source(self):
        sha256 = "5fd00b20bb5eb9a9ddfca9318d173d74d0ebe06fefa30a29d9105299e4fd73ec"
        tools.get("{}/archive/{}.zip".format(self.homepage, self.version), sha256=sha256)
        os.rename("opencv-%s" % self.version, self._source_subfolder)

    def system_requirements(self):
        if self.settings.os == 'Linux' and tools.os_info.is_linux:
            if tools.os_info.with_apt:
                installer = SystemPackageTool()
                arch_suffix = ''
                if self.settings.arch == 'x86':
                    arch_suffix = ':i386'
                elif self.settings.arch == 'x86_64':
                    arch_suffix = ":amd64"
                packages = ["libgtk2.0-dev%s" % arch_suffix]
                for package in packages:
                    installer.install(package)

    def _patch_opencv(self):
        cmake_file = os.path.join(self._source_subfolder, "CMakeLists.txt")
        tools.replace_in_file(cmake_file, "project(OpenCV CXX C)",
                        """project(OpenCV CXX C)
                           include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
                           conan_basic_setup()""")
        shutil.rmtree(os.path.join(self._source_subfolder, '3rdparty'))
        # allow to find conan-supplied OpenEXR
        if self.options.openexr:
            find_openexr = os.path.join(self._source_subfolder, 'cmake', 'OpenCVFindOpenEXR.cmake')
            tools.replace_in_file(find_openexr,
                                  r'SET(OPENEXR_ROOT "C:/Deploy" CACHE STRING "Path to the OpenEXR \"Deploy\" folder")',
                                  '')
            tools.replace_in_file(find_openexr, r'set(OPENEXR_ROOT "")', '')
            tools.replace_in_file(find_openexr, 'SET(OPENEXR_LIBSEARCH_SUFFIXES x64/Release x64 x64/Debug)', '')
            tools.replace_in_file(find_openexr, 'SET(OPENEXR_LIBSEARCH_SUFFIXES Win32/Release Win32 Win32/Debug)', '')

            def openexr_library_names(name):
                # OpenEXR library may have different names, depends on namespace versioning, static, debug, etc.
                reference = str(self.requires["openexr"])
                version_name = reference.split("@")[0]
                version = version_name.split("/")[1]
                version_tokens = version.split('.')
                major, minor = version_tokens[0], version_tokens[1]
                suffix = '%s_%s' % (major, minor)
                names = ['%s-%s' % (name, suffix),
                         '%s-%s_s' % (name, suffix),
                         '%s-%s_d' % (name, suffix),
                         '%s-%s_s_d' % (name, suffix),
                         '%s' % name,
                         '%s_s' % name,
                         '%s_d' % name,
                         '%s_s_d' % name]
                return ' '.join(names)

            for lib in ['Half', 'Iex', 'Imath', 'IlmImf', 'IlmThread']:
                tools.replace_in_file(find_openexr, 'NAMES %s' % lib, 'NAMES %s' % openexr_library_names(lib))

    def _configure_cmake(self):
        cmake = CMake(self)
        cmake.definitions["BUILD_EXAMPLES"] = False
        cmake.definitions["BUILD_DOCS"] = False
        cmake.definitions["BUILD_TESTS"] = False
        cmake.definitions["BUILD_opencv_apps"] = False
        cmake.definitions['BUILD_opencv_java'] = False
        cmake.definitions["BUILD_ZLIB"] = False
        cmake.definitions["BUILD_JPEG"] = False
        cmake.definitions["BUILD_PNG"] = False
        cmake.definitions["BUILD_TIFF"] = False
        cmake.definitions["BUILD_JASPER"] = False
        cmake.definitions["BUILD_OPENEXR"] = False

        cmake.definitions['WITH_CUDA'] = False
        cmake.definitions['WITH_CUFFT'] = False
        cmake.definitions['WITH_CUBLAS'] = False
        cmake.definitions['WITH_NVCUVID'] = False
        cmake.definitions['WITH_FFMPEG'] = False
        cmake.definitions["WITH_GSTREAMER"] = False
        cmake.definitions["WITH_OPENCL"] = False

        cmake.definitions['WITH_JPEG'] = self.options.jpeg
        cmake.definitions['WITH_PNG'] = self.options.png
        cmake.definitions['WITH_TIFF'] = self.options.tiff
        cmake.definitions['WITH_JASPER'] = self.options.jasper
        cmake.definitions['WITH_OPENEXR'] = self.options.openexr

        if self.settings.compiler == "Visual Studio":
            cmake.definitions["BUILD_WITH_STATIC_CRT"] = "MT" in str(self.settings.compiler.runtime)
        cmake.configure(source_folder=self._source_subfolder)

        return cmake

    def build(self):
        self._patch_opencv()
        cmake = self._configure_cmake()
        cmake.build()

    opencv_libs = ["contrib",
                   "stitching",
                   "nonfree",
                   "superres",
                   "ts",
                   "videostab",
                   "gpu",
                   "photo",
                   "objdetect",
                   "legacy",
                   "video",
                   "ml",
                   "calib3d",
                   "features2d",
                   "highgui",
                   "imgproc",
                   "flann",
                   "core"]

    def package(self):
        cmake = self._configure_cmake()
        cmake.install()
        cmake.patch_config_paths()

    def _add_libraries_from_pc(self, library):
        pkg_config = tools.PkgConfig(library)
        libs = [lib[2:] for lib in pkg_config.libs_only_l]  # cut -l prefix
        lib_paths = [lib[2:] for lib in pkg_config.libs_only_L]  # cut -L prefix
        self.cpp_info.libs.extend(libs)
        self.cpp_info.libdirs.extend(lib_paths)
        self.cpp_info.sharedlinkflags.extend(pkg_config.libs_only_other)
        self.cpp_info.exelinkflags.extend(pkg_config.libs_only_other)

    def package_info(self):
        version = self.version.split(".")[:-1]  # last version number is not used
        version = "".join(version) if self.settings.os == "Windows" else ""
        debug = "d" if self.settings.build_type == "Debug" and self.settings.compiler == "Visual Studio" else ""
        for lib in self.opencv_libs:
            self.cpp_info.libs.append("opencv_%s%s%s" % (lib, version, debug))

        if self.settings.compiler == 'Visual Studio':
            libdir = 'lib' if self.options.shared else 'staticlib'
            arch = {'x86': 'x86',
                    'x86_64': 'x64'}.get(str(self.settings.arch))
            if self.settings.compiler.version == '12':
                libdir = os.path.join(self.package_folder, arch, 'vc12', libdir)
                bindir = os.path.join(self.package_folder, arch, 'vc12', 'bin')
            elif self.settings.compiler.version == '14':
                libdir = os.path.join(self.package_folder, arch, 'vc14', libdir)
                bindir = os.path.join(self.package_folder, arch, 'vc14', 'bin')
            else:
                libdir = os.path.join(self.package_folder, libdir)
                bindir = os.path.join(self.package_folder, 'bin')
            self.cpp_info.bindirs.append(bindir)
            self.cpp_info.libdirs.append(libdir)

        if self.settings.os == "Linux":
            self._add_libraries_from_pc('gtk+-2.0')
            self.cpp_info.libs.extend(["rt", "pthread", "m", "dl"])
        elif self.settings.os == "Macos":
            frameworks = ["Cocoa"]
            for framework in frameworks:
                self.cpp_info.exelinkflags.append("-framework %s" % framework)
            self.cpp_info.sharedlinkflags = self.cpp_info.exelinkflags