Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / libvpx / BUILD.gn
1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 import("//build/config/arm.gni")
6 import("//build/config/android/config.gni")
7 import("//third_party/libvpx/libvpx_srcs.gni")
8 import("//third_party/yasm/yasm_assemble.gni")
9
10 if (is_posix && !is_mac) {
11   os_category = "linux"
12 } else {
13   os_category = os
14 }
15
16 # Sets the architecture name for building libvpx.
17 if (cpu_arch == "x86") {
18   cpu_arch_full = "ia32"
19 } else if (cpu_arch == "x64") {
20   if (is_msan) {
21     cpu_arch_full = "generic"
22   } else {
23     cpu_arch_full = "x64"
24   }
25 } else if (cpu_arch == "arm") {
26   if (arm_use_neon) {
27     cpu_arch_full = "arm-neon"
28   } else if (is_android) {
29     cpu_arch_full = "arm-neon-cpu-detect"
30   } else {
31     cpu_arch_full = "arm"
32   }
33 } else {
34   cpu_arch_full = cpu_arch
35 }
36
37 config("libvpx_config") {
38   include_dirs = [
39     "//third_party/libvpx/source/config",
40     "//third_party/libvpx/source/config/$os_category/$cpu_arch_full",
41     "//third_party/libvpx/source/libvpx",
42     "$root_gen_dir/third_party/libvpx", # Provides vpx_rtcd.h.
43   ]
44   cflags = [ "-Wno-unused-function", "-Wno-sign-compare" ]
45 }
46
47 # This config is applied to targets that depend on libvpx.
48 config("libvpx_external_config") {
49   include_dirs = [
50     "//third_party/libvpx/source/libvpx",
51   ]
52 }
53
54 executable("libvpx_obj_int_extract") {
55   sources = [
56     "//third_party/libvpx/source/libvpx/build/make/obj_int_extract.c"
57   ]
58   configs += [ ":libvpx_config" ]
59   if (is_android_webview_build) {
60     defines += [ "FORCE_PARSE_ELF" ]
61     include_dirs += [ "//third_party/libvpx/include" ]
62   }
63 }
64
65 # A library whose object files contain integers to be extracted.
66 static_library("libvpx_asm_offsets") {
67   sources = [
68     "//third_party/libvpx/source/libvpx/vp8/encoder/vp8_asm_enc_offsets.c",
69     "//third_party/libvpx/source/libvpx/vpx_scale/vpx_scale_asm_offsets.c"
70   ]
71   configs += [ ":libvpx_config" ]
72   if (is_clang) {
73     cflags = [ "-Wno-unused-function" ]
74   }
75 }
76
77 # This works only on POSIX to extract integer values from an object file.
78 template("obj_int_extract") {
79   action(target_name) {
80     script = "//third_party/libvpx/obj_int_extract.py"
81     bin_label = "//third_party/libvpx($host_toolchain)"
82
83     args = [
84       "-e",
85       "./" + rebase_path(get_label_info(bin_label, "root_out_dir") +
86                          "/libvpx_obj_int_extract",
87                          root_build_dir)
88     ]
89
90     if (cpu_arch == "arm") {
91       args += [ "-f", "gas" ]
92     } else {
93       args += [ "-f", "rvds" ]
94     }
95
96     args += [
97       "-b",
98       rebase_path(get_label_info(":libvpx_asm_offsets", "target_out_dir")) +
99           "/" + invoker.src_dir + "/libvpx_asm_offsets." +
100           invoker.obj_file_root + ".o"
101     ]
102     out_file = "$target_gen_dir/" + invoker.obj_file_root + ".asm"
103     args += [ "-o", rebase_path(out_file) ]
104     outputs = [ out_file ]
105     deps = [
106       ":libvpx_asm_offsets",
107       ":libvpx_obj_int_extract($host_toolchain)"
108     ]
109   }
110 }
111
112 obj_int_extract("gen_asm_offsets_vp8") {
113   src_dir = "source/libvpx/vp8/encoder"
114   obj_file_root = "vp8_asm_enc_offsets"
115 }
116
117 obj_int_extract("gen_asm_offsets_scale") {
118   src_dir = "source/libvpx/vpx_scale"
119   obj_file_root = "vpx_scale_asm_offsets"
120 }
121
122 if (cpu_arch == "x86" || cpu_arch == "x64") {
123   yasm_assemble("libvpx_yasm") {
124     if (cpu_arch == "x86") {
125       sources = libvpx_srcs_x86_assembly
126     } else if (cpu_arch == "x64") {
127       sources = libvpx_srcs_x86_64_assembly
128     }
129
130     defines = [ "CHROMIUM" ]
131     include_dirs = [
132       "//third_party/libvpx/source/config/$os_category/$cpu_arch_full",
133       "//third_party/libvpx/source/config",
134      "//third_party/libvpx/source/libvpx",
135       target_gen_dir
136     ]
137     deps = [
138       ":gen_asm_offsets_vp8",
139       ":gen_asm_offsets_scale",
140     ]
141   }
142 }
143
144 static_library("libvpx_intrinsics_mmx") {
145   configs += [ ":libvpx_config" ]
146   cflags = [ "-mmmx" ]
147   if (cpu_arch == "x86") {
148     sources = libvpx_srcs_x86_mmx
149   } else if (cpu_arch == "x64") {
150     sources = libvpx_srcs_x86_64_mmx
151   }
152 }
153
154 static_library("libvpx_intrinsics_sse2") {
155   configs += [ ":libvpx_config" ]
156   cflags = [ "-msse2" ]
157   if (cpu_arch == "x86") {
158     sources = libvpx_srcs_x86_sse2
159   } else if (cpu_arch == "x64") {
160     sources = libvpx_srcs_x86_64_sse2
161   }
162 }
163
164 static_library("libvpx_intrinsics_ssse3") {
165   configs += [ ":libvpx_config" ]
166   cflags = [ "-mssse3" ]
167   if (cpu_arch == "x86") {
168     sources = libvpx_srcs_x86_ssse3
169   } else if (cpu_arch == "x64") {
170     sources = libvpx_srcs_x86_64_ssse3
171   }
172 }
173
174 static_library("libvpx_intrinsics_sse4_1") {
175   configs += [ ":libvpx_config" ]
176   cflags = [ "-msse4.1" ]
177   if (cpu_arch == "x86") {
178     sources = libvpx_srcs_x86_sse4_1
179   } else if (cpu_arch == "x64") {
180     sources = libvpx_srcs_x86_64_sse4_1
181   }
182 }
183
184 if (cpu_arch_full == "arm-neon-cpu-detect") {
185   static_library("libvpx_intrinsics_neon") {
186     configs -= [ "//build/config/compiler:compiler_arm_fpu" ]
187     configs += [ ":libvpx_config" ]
188     cflags = [ "-mfpu=neon" ]
189     sources = libvpx_srcs_arm_neon_cpu_detect_neon
190   }
191 }
192
193 # Converts ARM assembly files to GAS style.
194 if (cpu_arch == "arm") {
195   action_foreach("convert_arm_assembly") {
196     script = "//third_party/libvpx/run_perl.py"
197     if (cpu_arch_full == "arm-neon") {
198       sources = libvpx_srcs_arm_neon_assembly
199     } else if (cpu_arch_full == "arm-neon-cpu-detect") {
200       sources = libvpx_srcs_arm_neon_cpu_detect_assembly
201     } else {
202       sources = libvpx_srcs_arm_assembly
203     }
204     outputs = [ "$target_gen_dir/{{source_name_part}}.S" ]
205     args = [
206       "-s",
207       rebase_path("//third_party/libvpx/source/libvpx/build/make/ads2gas.pl",
208                   root_build_dir),
209       "-i", "{{source}}",
210       "-o", rebase_path("$target_gen_dir/{{source_name_part}}.S")
211     ]
212   }
213
214   static_library("libvpx_assembly_arm") {
215     sources = get_target_outputs(":convert_arm_assembly")
216     configs -= [ "//build/config/compiler:compiler_arm_fpu" ]
217     configs += [ ":libvpx_config" ]
218     if (cpu_arch_full == "arm-neon" ||
219         cpu_arch_full == "arm-neon-cpu-detect") {
220       cflags = [ "-mfpu=neon" ]
221     }
222     deps = [
223       ":convert_arm_assembly",
224       ":gen_asm_offsets_vp8",
225       ":gen_asm_offsets_scale",
226     ]
227   }
228 }
229
230 static_library("libvpx") {
231   if (!is_debug && is_win && is_official_build) {
232     configs -= [ "//build/config/compiler:optimize" ]
233     configs += [ "//build/config/compiler:optimize_max" ]
234   }
235
236   if (cpu_arch == "x86") {
237     sources = libvpx_srcs_x86
238   } else if (cpu_arch == "x64") {
239     if (is_msan) {
240       sources = libvpx_srcs_generic
241     } else {
242       sources = libvpx_srcs_x86_64
243     }
244   } else if (cpu_arch == "mipsel") {
245     sources = libvpx_srcs_generic
246   } else if (cpu_arch == "arm") {
247     if (arm_use_neon) {
248       sources = libvpx_srcs_arm_neon
249     } else if (is_android) {
250       sources = libvpx_srcs_arm_neon_cpu_detect
251     } else {
252       sources = libvpx_srcs_arm
253     }
254   } else if (cpu_arch == "arm64") {
255     sources = libvpx_srcs_arm64
256   }
257   configs += [ ":libvpx_config" ]
258   deps = []
259   if (cpu_arch == "x86" || (cpu_arch == "x64" && !is_msan)) {
260     deps += [
261       ":libvpx_yasm",
262       ":libvpx_intrinsics_mmx",
263       ":libvpx_intrinsics_sse2",
264       ":libvpx_intrinsics_ssse3",
265       ":libvpx_intrinsics_sse4_1",
266     ]
267   }
268   if (cpu_arch_full == "arm-neon-cpu-detect") {
269     deps += [ ":libvpx_intrinsics_neon" ]
270   }
271   if (is_android) {
272     deps += [ "//third_party/android_tools:cpu_features" ]
273   }
274   if (cpu_arch == "arm") {
275     deps += [ ":libvpx_assembly_arm" ]
276   }
277
278   public_configs = [ ":libvpx_external_config" ]
279 }