1# Deprecated Builds
2
3Older documentation on build configs which are no longer supported.
4
5## Pre-requisites
6
7You'll need to have depot tools installed: https://www.chromium.org/developers/how-tos/install-depot-tools
8Refer to chromium instructions for each platform for other prerequisites.
9
10## Getting the Code
11
12Create a working directory, enter it, and run:
13
14    gclient config https://chromium.googlesource.com/libyuv/libyuv
15    gclient sync
16
17
18Then you'll get a .gclient file like:
19
20    solutions = [
21      { "name"        : "libyuv",
22        "url"         : "https://chromium.googlesource.com/libyuv/libyuv",
23        "deps_file"   : "DEPS",
24        "managed"     : True,
25        "custom_deps" : {
26        },
27        "safesync_url": "",
28      },
29    ];
30
31
32For iOS add `;target_os=['ios'];` to your OSX .gclient and run `GYP_DEFINES="OS=ios" gclient sync.`
33
34Browse the Git reprository: https://chromium.googlesource.com/libyuv/libyuv/+/master
35
36### Android
37For Android add `;target_os=['android'];` to your Linux .gclient
38
39
40    solutions = [
41      { "name"        : "libyuv",
42        "url"         : "https://chromium.googlesource.com/libyuv/libyuv",
43        "deps_file"   : "DEPS",
44        "managed"     : True,
45        "custom_deps" : {
46        },
47        "safesync_url": "",
48      },
49    ];
50    target_os = ["android", "unix"];
51
52Then run:
53
54    export GYP_DEFINES="OS=android"
55    gclient sync
56
57Caveat: Theres an error with Google Play services updates.  If you get the error "Your version of the Google Play services library is not up to date", run the following:
58
59    cd chromium/src
60    ./build/android/play_services/update.py download
61    cd ../..
62
63For Windows the gclient sync must be done from an Administrator command prompt.
64
65The sync will generate native build files for your environment using gyp (Windows: Visual Studio, OSX: XCode, Linux: make). This generation can also be forced manually: `gclient runhooks`
66
67To get just the source (not buildable):
68
69    git clone https://chromium.googlesource.com/libyuv/libyuv
70
71
72## Building the Library and Unittests
73
74### Windows
75
76    set GYP_DEFINES=target_arch=ia32
77    call python gyp_libyuv -fninja -G msvs_version=2013
78    ninja -j7 -C out\Release
79    ninja -j7 -C out\Debug
80
81    set GYP_DEFINES=target_arch=x64
82    call python gyp_libyuv -fninja -G msvs_version=2013
83    ninja -C out\Debug_x64
84    ninja -C out\Release_x64
85
86#### Building with clangcl
87    set GYP_DEFINES=clang=1 target_arch=ia32
88    call python tools\clang\scripts\update.py
89    call python gyp_libyuv -fninja libyuv_test.gyp
90    ninja -C out\Debug
91    ninja -C out\Release
92
93### OSX
94
95Clang 64 bit shown. Remove `clang=1` for GCC and change x64 to ia32 for 32 bit.
96
97    GYP_DEFINES="clang=1 target_arch=x64" ./gyp_libyuv
98    ninja -j7 -C out/Debug
99    ninja -j7 -C out/Release
100
101    GYP_DEFINES="clang=1 target_arch=ia32" ./gyp_libyuv
102    ninja -j7 -C out/Debug
103    ninja -j7 -C out/Release
104
105### iOS
106http://www.chromium.org/developers/how-tos/build-instructions-ios
107
108Add to .gclient last line: `target_os=['ios'];`
109
110armv7
111
112    GYP_DEFINES="OS=ios target_arch=armv7 target_subarch=arm32" GYP_CROSSCOMPILE=1 GYP_GENERATOR_FLAGS="output_dir=out_ios" ./gyp_libyuv
113    ninja -j7 -C out_ios/Debug-iphoneos libyuv_unittest
114    ninja -j7 -C out_ios/Release-iphoneos libyuv_unittest
115
116arm64
117
118    GYP_DEFINES="OS=ios target_arch=arm64 target_subarch=arm64" GYP_CROSSCOMPILE=1 GYP_GENERATOR_FLAGS="output_dir=out_ios" ./gyp_libyuv
119    ninja -j7 -C out_ios/Debug-iphoneos libyuv_unittest
120    ninja -j7 -C out_ios/Release-iphoneos libyuv_unittest
121
122both armv7 and arm64 (fat)
123
124    GYP_DEFINES="OS=ios target_arch=armv7 target_subarch=both" GYP_CROSSCOMPILE=1 GYP_GENERATOR_FLAGS="output_dir=out_ios" ./gyp_libyuv
125    ninja -j7 -C out_ios/Debug-iphoneos libyuv_unittest
126    ninja -j7 -C out_ios/Release-iphoneos libyuv_unittest
127
128simulator
129
130    GYP_DEFINES="OS=ios target_arch=ia32 target_subarch=arm32" GYP_CROSSCOMPILE=1 GYP_GENERATOR_FLAGS="output_dir=out_sim" ./gyp_libyuv
131    ninja -j7 -C out_sim/Debug-iphonesimulator libyuv_unittest
132    ninja -j7 -C out_sim/Release-iphonesimulator libyuv_unittest
133
134### Android
135https://code.google.com/p/chromium/wiki/AndroidBuildInstructions
136
137Add to .gclient last line: `target_os=['android'];`
138
139armv7
140
141    GYP_DEFINES="OS=android" GYP_CROSSCOMPILE=1 ./gyp_libyuv
142    ninja -j7 -C out/Debug yuv_unittest_apk
143    ninja -j7 -C out/Release yuv_unittest_apk
144
145arm64
146
147    GYP_DEFINES="OS=android target_arch=arm64 target_subarch=arm64" GYP_CROSSCOMPILE=1 ./gyp_libyuv
148    ninja -j7 -C out/Debug yuv_unittest_apk
149    ninja -j7 -C out/Release yuv_unittest_apk
150
151ia32
152
153    GYP_DEFINES="OS=android target_arch=ia32" GYP_CROSSCOMPILE=1 ./gyp_libyuv
154    ninja -j7 -C out/Debug yuv_unittest_apk
155    ninja -j7 -C out/Release yuv_unittest_apk
156
157    GYP_DEFINES="OS=android target_arch=ia32 android_full_debug=1" GYP_CROSSCOMPILE=1 ./gyp_libyuv
158    ninja -j7 -C out/Debug yuv_unittest_apk
159
160mipsel
161
162    GYP_DEFINES="OS=android target_arch=mipsel" GYP_CROSSCOMPILE=1 ./gyp_libyuv
163    ninja -j7 -C out/Debug yuv_unittest_apk
164    ninja -j7 -C out/Release yuv_unittest_apk
165
166arm32 disassembly:
167
168    third_party/android_ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-objdump -d out/Release/obj/source/libyuv.row_neon.o
169
170arm64 disassembly:
171
172    third_party/android_ndk/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objdump -d out/Release/obj/source/libyuv.row_neon64.o
173
174Running tests:
175
176    build/android/test_runner.py gtest -s libyuv_unittest -t 7200 --verbose --release --gtest_filter=*
177
178Running test as benchmark:
179
180    build/android/test_runner.py gtest -s libyuv_unittest -t 7200 --verbose --release --gtest_filter=* -a "--libyuv_width=1280 --libyuv_height=720 --libyuv_repeat=999 --libyuv_flags=-1"
181
182Running test with C code:
183
184    build/android/test_runner.py gtest -s libyuv_unittest -t 7200 --verbose --release --gtest_filter=* -a "--libyuv_width=1280 --libyuv_height=720 --libyuv_repeat=999 --libyuv_flags=1 --libyuv_cpu_info=1"
185
186#### Building with GN
187
188    gn gen out/Release "--args=is_debug=false target_cpu=\"x86\""
189    gn gen out/Debug "--args=is_debug=true target_cpu=\"x86\""
190    ninja -C out/Release
191    ninja -C out/Debug
192
193### Building Offical with GN
194
195    gn gen out/Official "--args=is_debug=false is_official_build=true is_chrome_branded=true"
196    ninja -C out/Official
197
198#### Building mips with GN
199
200mipsel
201    gn gen out/Default "--args=is_debug=false target_cpu=\"mipsel\" target_os = \"android\" mips_arch_variant = \"r6\" mips_use_msa = true is_component_build = true is_clang = false"
202    ninja -C out/Default
203
204mips64el
205    gn gen out/Default "--args=is_debug=false target_cpu=\"mips64el\" target_os = \"android\" mips_arch_variant = \"r6\" mips_use_msa = true is_component_build = true is_clang = false"
206    ninja -C out/Default
207
208### Linux
209
210    GYP_DEFINES="target_arch=x64" ./gyp_libyuv
211    ninja -j7 -C out/Debug
212    ninja -j7 -C out/Release
213
214    GYP_DEFINES="target_arch=ia32" ./gyp_libyuv
215    ninja -j7 -C out/Debug
216    ninja -j7 -C out/Release
217
218#### CentOS
219
220On CentOS 32 bit the following work around allows a sync:
221
222    export GYP_DEFINES="host_arch=ia32"
223    gclient sync
224
225### Windows Shared Library
226
227Modify libyuv.gyp from 'static_library' to 'shared_library', and add 'LIBYUV_BUILDING_SHARED_LIBRARY' to 'defines'.
228
229    gclient runhooks
230
231After this command follow the building the library instructions above.
232
233If you get a compile error for atlthunk.lib on Windows, read http://www.chromium.org/developers/how-tos/build-instructions-windows
234
235
236### Build targets
237
238    ninja -C out/Debug libyuv
239    ninja -C out/Debug libyuv_unittest
240    ninja -C out/Debug compare
241    ninja -C out/Debug yuvconvert
242    ninja -C out/Debug yuvconstants
243    ninja -C out/Debug psnr
244    ninja -C out/Debug cpuid
245
246
247## Building the Library with make
248
249### Linux
250
251    make -j7 V=1 -f linux.mk
252    make -j7 V=1 -f linux.mk clean
253    make -j7 V=1 -f linux.mk CXX=clang++
254
255## Building the Library with cmake
256
257Install cmake: http://www.cmake.org/
258
259Default debug build:
260
261    mkdir out
262    cd out
263    cmake ..
264    cmake --build .
265
266Release build/install
267
268    mkdir out
269    cd out
270    cmake -DCMAKE_INSTALL_PREFIX="/usr/lib" -DCMAKE_BUILD_TYPE="Release" ..
271    cmake --build . --config Release
272    sudo cmake --build . --target install --config Release
273
274### Windows 8 Phone
275
276Pre-requisite:
277
278* Install Visual Studio 2012 and Arm to your environment.<br>
279
280Then:
281
282    call "c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_arm\vcvarsx86_arm.bat"
283
284or with Visual Studio 2013:
285
286    call "c:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_arm\vcvarsx86_arm.bat"
287    nmake /f winarm.mk clean
288    nmake /f winarm.mk
289
290### Windows Shared Library
291
292Modify libyuv.gyp from 'static_library' to 'shared_library', and add 'LIBYUV_BUILDING_SHARED_LIBRARY' to 'defines'. Then run this.
293
294    gclient runhooks
295
296After this command follow the building the library instructions above.
297
298If you get a compile error for atlthunk.lib on Windows, read http://www.chromium.org/developers/how-tos/build-instructions-windows
299
300### 64 bit Windows
301
302    set GYP_DEFINES=target_arch=x64
303    gclient runhooks V=1
304
305### ARM Linux
306
307    export GYP_DEFINES="target_arch=arm"
308    export CROSSTOOL=`<path>`/arm-none-linux-gnueabi
309    export CXX=$CROSSTOOL-g++
310    export CC=$CROSSTOOL-gcc
311    export AR=$CROSSTOOL-ar
312    export AS=$CROSSTOOL-as
313    export RANLIB=$CROSSTOOL-ranlib
314    gclient runhooks
315
316## Running Unittests
317
318### Windows
319
320    out\Release\libyuv_unittest.exe --gtest_catch_exceptions=0 --gtest_filter="*"
321
322### OSX
323
324    out/Release/libyuv_unittest --gtest_filter="*"
325
326### Linux
327
328    out/Release/libyuv_unittest --gtest_filter="*"
329
330Replace --gtest_filter="*" with specific unittest to run.  May include wildcards. e.g.
331
332    out/Release/libyuv_unittest --gtest_filter=libyuvTest.I420ToARGB_Opt
333
334## CPU Emulator tools
335
336### Intel SDE (Software Development Emulator)
337
338Pre-requisite: Install IntelSDE for Windows: http://software.intel.com/en-us/articles/intel-software-development-emulator
339
340Then run:
341
342    c:\intelsde\sde -hsw -- out\release\libyuv_unittest.exe --gtest_filter=*
343
344
345## Memory tools
346
347### Running Dr Memory memcheck for Windows
348
349Pre-requisite: Install Dr Memory for Windows and add it to your path: http://www.drmemory.org/docs/page_install_windows.html
350
351    set GYP_DEFINES=build_for_tool=drmemory target_arch=ia32
352    call python gyp_libyuv -fninja -G msvs_version=2013
353    ninja -C out\Debug
354    drmemory out\Debug\libyuv_unittest.exe --gtest_catch_exceptions=0 --gtest_filter=*
355
356### Running UBSan
357
358See Chromium instructions for sanitizers: https://www.chromium.org/developers/testing/undefinedbehaviorsanitizer
359
360Sanitizers available: TSan, MSan, ASan, UBSan, LSan
361
362    GYP_DEFINES='ubsan=1' gclient runhooks
363    ninja -C out/Release
364
365### Running Valgrind memcheck
366
367Memory errors and race conditions can be found by running tests under special memory tools. [Valgrind] [1] is an instrumentation framework for building dynamic analysis tools. Various tests and profilers are built upon it to find memory handling errors and memory leaks, for instance.
368
369[1]: http://valgrind.org
370
371    solutions = [
372      { "name"        : "libyuv",
373        "url"         : "https://chromium.googlesource.com/libyuv/libyuv",
374        "deps_file"   : "DEPS",
375        "managed"     : True,
376        "custom_deps" : {
377           "libyuv/chromium/src/third_party/valgrind": "https://chromium.googlesource.com/chromium/deps/valgrind/binaries",
378        },
379        "safesync_url": "",
380      },
381    ]
382
383Then run:
384
385    GYP_DEFINES="clang=0 target_arch=x64 build_for_tool=memcheck" python gyp_libyuv
386    ninja -C out/Debug
387    valgrind out/Debug/libyuv_unittest
388
389
390For more information, see http://www.chromium.org/developers/how-tos/using-valgrind
391
392### Running Thread Sanitizer (TSan)
393
394    GYP_DEFINES="clang=0 target_arch=x64 build_for_tool=tsan" python gyp_libyuv
395    ninja -C out/Debug
396    valgrind out/Debug/libyuv_unittest
397
398For more info, see http://www.chromium.org/developers/how-tos/using-valgrind/threadsanitizer
399
400### Running Address Sanitizer (ASan)
401
402    GYP_DEFINES="clang=0 target_arch=x64 build_for_tool=asan" python gyp_libyuv
403    ninja -C out/Debug
404    valgrind out/Debug/libyuv_unittest
405
406For more info, see http://dev.chromium.org/developers/testing/addresssanitizer
407
408## Benchmarking
409
410The unittests can be used to benchmark.
411
412### Windows
413
414    set LIBYUV_WIDTH=1280
415    set LIBYUV_HEIGHT=720
416    set LIBYUV_REPEAT=999
417    set LIBYUV_FLAGS=-1
418    out\Release\libyuv_unittest.exe --gtest_filter=*I420ToARGB_Opt
419
420
421### Linux and Mac
422
423    LIBYUV_WIDTH=1280 LIBYUV_HEIGHT=720 LIBYUV_REPEAT=1000 out/Release/libyuv_unittest --gtest_filter=*I420ToARGB_Opt
424
425    libyuvTest.I420ToARGB_Opt (547 ms)
426
427Indicates 0.547 ms/frame for 1280 x 720.
428
429## Making a change
430
431    gclient sync
432    git checkout -b mycl -t origin/master
433    git pull
434    <edit files>
435    git add -u
436    git commit -m "my change"
437    git cl lint
438    git cl try
439    git cl upload -r a-reviewer@chomium.org -s
440    <once approved..>
441    git cl land
442