2,570,068 Versions Indexed
libx264/cci.20220602
x264 is a free software library and application for encoding video streams into the H.264/MPEG-4 AVC compression format
GPL-2.0
License
cci.20220602
Version
11,724
Downloads
Loading...
Loading...
1
from conan import ConanFile
2
from conan.tools.apple import is_apple_os
3
from conan.tools.build import cross_building
4
from conan.tools.files import get, rename, rmdir
5
from conans import tools, AutoToolsBuildEnvironment
6
import contextlib
7
import os
8
9
required_conan_version = ">=1.51.3"
10
11
12
class LibX264Conan(ConanFile):
13
name = "libx264"
14
url = "https://github.com/conan-io/conan-center-index"
15
homepage = "https://www.videolan.org/developers/x264.html"
16
description = "x264 is a free software library and application for encoding video streams into the " \
17
"H.264/MPEG-4 AVC compression format"
18
topics = ("libx264", "video", "encoding")
19
license = "GPL-2.0"
20
21
settings = "os", "arch", "compiler", "build_type"
22
options = {
23
"shared": [True, False],
24
"fPIC": [True, False],
25
"bit_depth": [8, 10, "all"],
26
}
27
default_options = {
28
"shared": False,
29
"fPIC": True,
30
"bit_depth": "all",
31
}
32
33
_autotools = None
34
_override_env = {}
35
36
@property
37
def _is_msvc(self):
38
return str(self.settings.compiler) in ["Visual Studio", "msvc"]
39
40
@property
41
def _source_subfolder(self):
42
return "source_subfolder"
43
44
@property
45
def _settings_build(self):
46
return getattr(self, "settings_build", self.settings)
47
48
def config_options(self):
49
if self.settings.os == "Windows":
50
del self.options.fPIC
51
52
def configure(self):
53
if self.options.shared:
54
del self.options.fPIC
55
del self.settings.compiler.libcxx
56
del self.settings.compiler.cppstd
57
58
@property
59
def _with_nasm(self):
60
return self.settings.arch in ("x86", "x86_64")
61
62
def build_requirements(self):
63
if self._with_nasm:
64
self.build_requires("nasm/2.15.05")
65
if self._settings_build.os == "Windows" and not tools.get_env("CONAN_BASH_PATH"):
66
self.build_requires("msys2/cci.latest")
67
68
def source(self):
69
get(self, **self.conan_data["sources"][self.version],
70
destination=self._source_subfolder, strip_root=True)
71
72
@contextlib.contextmanager
73
def _build_context(self):
74
with tools.vcvars(self) if self._is_msvc else tools.no_op():
75
yield
76
77
@property
78
def env(self):
79
ret = super(LibX264Conan, self).env
80
ret.update(self._override_env)
81
return ret
82
83
def _configure_autotools(self):
84
if self._autotools:
85
return self._autotools
86
self._autotools = AutoToolsBuildEnvironment(self, win_bash=tools.os_info.is_windows)
87
self._autotools.libs = []
88
extra_asflags = []
89
extra_cflags = []
90
extra_ldflags = []
91
args = [
92
"--bit-depth=%s" % str(self.options.bit_depth),
93
"--disable-cli",
94
"--prefix={}".format(tools.unix_path(self.package_folder)),
95
]
96
if self.options.shared:
97
args.append("--enable-shared")
98
else:
99
args.append("--enable-static")
100
if self.options.get_safe("fPIC", self.settings.os != "Windows"):
101
args.append("--enable-pic")
102
if self.settings.build_type == "Debug":
103
args.append("--enable-debug")
104
if is_apple_os(self) and self.settings.arch == "armv8":
105
# bitstream-a.S:29:18: error: unknown token in expression
106
extra_asflags.append("-arch arm64")
107
extra_ldflags.append("-arch arm64")
108
args.append("--host=aarch64-apple-darwin")
109
if self.settings.os != "Macos":
110
deployment_target_flag = tools.apple_deployment_target_flag(
111
self.settings.os,
112
self.settings.get_safe("os.version"),
113
self.settings.get_safe("os.sdk"),
114
self.settings.get_safe("os.subsystem"),
115
self.settings.get_safe("arch")
116
)
117
platform_flags = ["-isysroot", tools.XCRun(self.settings).sdk_path, deployment_target_flag]
118
extra_asflags.extend(platform_flags)
119
extra_cflags.extend(platform_flags)
120
extra_ldflags.extend(platform_flags)
121
122
if self._with_nasm:
123
# FIXME: get using user_build_info
124
self._override_env["AS"] = os.path.join(self.dependencies.build["nasm"].package_folder, "bin", "nasm{}".format(".exe" if tools.os_info.is_windows else "")).replace("\\", "/")
125
if cross_building(self):
126
if self.settings.os == "Android":
127
# the as of ndk does not work well for building libx264
128
self._override_env["AS"] = os.environ["CC"]
129
ndk_root = tools.unix_path(os.environ["NDK_ROOT"])
130
arch = {
131
"armv7": "arm",
132
"armv8": "aarch64",
133
"x86": "i686",
134
"x86_64": "x86_64",
135
}.get(str(self.settings.arch))
136
abi = "androideabi" if self.settings.arch == "armv7" else "android"
137
args.append("--cross-prefix={}".format("{}/bin/{}-linux-{}-".format(ndk_root, arch, abi)))
138
if self._is_msvc:
139
self._override_env["CC"] = "cl -nologo"
140
extra_cflags.extend(self._autotools.flags)
141
if not (self.settings.compiler == "Visual Studio" and tools.Version(self.settings.compiler.version) < "12"):
142
extra_cflags.append("-FS")
143
build_canonical_name = None
144
host_canonical_name = None
145
if self._is_msvc or self.settings.os in ["iOS", "watchOS", "tvOS"]:
146
# autotools does not know about the msvc and Apple embedded OS canonical name(s)
147
build_canonical_name = False
148
host_canonical_name = False
149
if extra_asflags:
150
args.append("--extra-asflags={}".format(" ".join(extra_asflags)))
151
if extra_cflags:
152
args.append("--extra-cflags={}".format(" ".join(extra_cflags)))
153
if extra_ldflags:
154
args.append("--extra-ldflags={}".format(" ".join(extra_ldflags)))
155
self._autotools.configure(args=args, vars=self._override_env, configure_dir=self._source_subfolder, build=build_canonical_name, host=host_canonical_name)
156
return self._autotools
157
158
def build(self):
159
with self._build_context():
160
# relocatable shared lib on macOS
161
tools.replace_in_file(os.path.join(self._source_subfolder, "configure"),
162
"-install_name \\$(DESTDIR)\\$(libdir)/",
163
"-install_name @rpath/")
164
autotools = self._configure_autotools()
165
autotools.make()
166
167
def package(self):
168
self.copy(pattern="COPYING", src=self._source_subfolder, dst="licenses")
169
with self._build_context():
170
autotools = self._configure_autotools()
171
autotools.install()
172
rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
173
if self._is_msvc:
174
ext = ".dll.lib" if self.options.shared else ".lib"
175
rename(self, os.path.join(self.package_folder, "lib", "libx264{}".format(ext)),
176
os.path.join(self.package_folder, "lib", "x264.lib"))
177
178
def package_info(self):
179
self.cpp_info.set_property("pkg_config_name", "x264")
180
self.cpp_info.libs = ["x264"]
181
if self._is_msvc and self.options.shared:
182
self.cpp_info.defines.append("X264_API_IMPORTS")
183
if self.settings.os in ("FreeBSD", "Linux"):
184
self.cpp_info.system_libs.extend(["dl", "pthread", "m"])
185
elif self.settings.os == "Android":
186
self.cpp_info.system_libs.extend(["dl", "m"])
187
188
# TODO: to remove in conan v2 once pkg_config generator removed
189
self.cpp_info.names["pkg_config"] = "x264"
190
191