from conan import ConanFile from conan.tools.meson import Meson, MesonToolchain from conan.tools.env import VirtualBuildEnv from conan.tools.layout import basic_layout from conan.tools.files import get, copy, rmdir, patch, chdir, rm from conan.errors import ConanInvalidConfiguration from conan.tools.scm import Version from conan.tools.microsoft import msvc_runtime_flag import glob import os import shutil class GStRtspServerConan(ConanFile): package_type = "library" name = "gst-rtsp-server" description = "GStreamer is a development framework for creating applications like media players, video editors, " \ "streaming media broadcasters and so on" topics = ("gstreamer", "multimedia", "video", "audio", "broadcasting", "framework", "media") url = "https://github.com/conan-io/conan-center-index" homepage = "https://gstreamer.freedesktop.org/" license = "GPL-2.0-only" settings = "os", "arch", "compiler", "build_type" options = { "shared": [True, False], "fPIC": [True, False], "with_examples": [True, False], } default_options = { "shared": False, "fPIC": True, "with_examples": False } exports_sources = ["patches/*.patch"] generators = "PkgConfigDeps" @property def _is_msvc(self): return self.settings.compiler == "msvc" def validate(self): if self.options.shared != self.dependencies["gstreamer"].options.get_safe("shared") or \ self.options.shared != self.dependencies["glib"].options.get_safe("shared") or \ self.options.shared != self.dependencies["gst-plugins-base"].options.get_safe("shared"): # https://gitlab.freedesktop.org/gstreamer/gst-build/-/issues/133 raise ConanInvalidConfiguration("GLib, GStreamer and GstPlugins must be either all shared, or all static") if Version(self.version) >= "1.18.2" and\ self.settings.compiler == "gcc" and\ Version(self.settings.compiler.version) < "5": raise ConanInvalidConfiguration( "gst-plugins-good %s does not support gcc older than 5" % self.version ) if self.options.shared and str(msvc_runtime_flag(self)).startswith("MT"): raise ConanInvalidConfiguration('shared build with static runtime is not supported due to the FlsAlloc limit') def configure(self): if self.options.shared: del self.options.fPIC del self.settings.compiler.libcxx del self.settings.compiler.cppstd self.options['gstreamer'].shared = self.options.shared self.options['gst-plugins-base'].shared = self.options.shared def config_options(self): if self.settings.os == 'Windows': del self.options.fPIC def requirements(self): self.requires("glib/2.74.0@#4") self.requires("gstreamer/1.19.1") self.requires("gst-plugins-base/1.19.1") def build_requirements(self): self.tool_requires("meson/0.62.2") self.tool_requires("pkgconf/1.7.4") if self.settings.os == 'Windows': self.tool_requires("winflexbison/2.5.24") else: self.tool_requires("bison/3.7.6") self.tool_requires("flex/2.6.4") def layout(self): basic_layout(self, src_folder="src") def source(self): get(self, **self.conan_data["sources"][self.version], strip_root=True) def generate(self): tool_chain = MesonToolchain(self) def add_flag(name, value): if name in defs: tool_chain.project_options[name] += " " + value else: tool_chain.project_options[name] = value def add_compiler_flag(value): add_flag("c_args", value) add_flag("cpp_args", value) def add_linker_flag(value): add_flag("c_link_args", value) add_flag("cpp_link_args", value) if self.settings.compiler == "msvc": add_linker_flag("-lws2_32") add_compiler_flag("-%s" % self.settings.compiler.runtime) if int(str(self.settings.compiler.version)) < 14: add_compiler_flag("-Dsnprintf=_snprintf") if self.settings.get_safe("compiler.runtime"): tool_chain.project_options["b_vscrt"] = str(self.settings.compiler.runtime).lower() if self.version > "1.18.4": tool_chain.project_options["tests"] = "disabled" if self.options.with_examples: tool_chain.project_options["examples"] = "enabled" tool_chain.generate() env = VirtualBuildEnv(self) env.generate(scope="build") def build(self): for p in self.conan_data.get("patches", {}).get(self.version, []): patch(self, **p) meson = Meson(self) meson.configure() meson.build() def _fix_library_names(self, path): # regression in 1.16 if self.settings.compiler == "msvc": with chdir(self, path): for filename_old in glob.glob("*.a"): filename_new = filename_old[3:-2] + ".lib" self.output.info("rename %s into %s" % (filename_old, filename_new)) shutil.move(filename_old, filename_new) def package(self): copy(self, "COPYING", dst="licenses", src=self.source_folder) meson = Meson(self) meson.install() self._fix_library_names(os.path.join(self.package_folder, "lib")) self._fix_library_names(os.path.join(self.package_folder, "lib", "gstreamer-1.0")) rmdir(self, os.path.join(self.package_folder, "share")) rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig")) rmdir(self, os.path.join(self.package_folder, "lib", "gstreamer-1.0", "pkgconfig")) rm(self, "*.pdb", self.package_folder) def package_info(self): #plugins = ["libgstrtspclientsink"] gst_include_path = os.path.join(self.package_folder, "include", "gstreamer-1.0") self.cpp_info.components["gstreamer-rtsp-server-1.0"].names["pkg_config"] = "gstreamer-rtsp-server-1.0" self.cpp_info.components["gstreamer-rtsp-server-1.0"].set_property("pkg_config_name", "gstreamer-rtsp-server-1.0") self.cpp_info.components["gstreamer-rtsp-server-1.0"].libs = ["gstrtspserver-1.0"] self.cpp_info.components["gstreamer-rtsp-server-1.0"].requires = ["gstreamer::gstreamer-base-1.0", "gstreamer::gstreamer-net-1.0", "glib::gio-2.0", "gst-plugins-base::gstreamer-rtp-1.0" ,"gst-plugins-base::gstreamer-rtsp-1.0", "gst-plugins-base::gstreamer-video-1.0", "gst-plugins-base::gstreamer-sdp-1.0", "gst-plugins-base::gstreamer-app-1.0"] self.cpp_info.components["gstreamer-rtsp-server-1.0"].includedirs = [gst_include_path] gst_plugin_path = os.path.join(self.package_folder, "lib", "gstreamer-1.0") if self.options.shared: self.runenv_info.prepend_path("GST_PLUGIN_PATH", gst_plugin_path) self.env_info.GST_PLUGIN_PATH.append(gst_plugin_path) self.cpp_info.includedirs = ["include", os.path.join("include", "gstreamer-1.0")]