c2a669a9f0
Many contributors (me included) did not fully understand what CCFLAGS, CXXFLAGS and CPPFLAGS refer to exactly, and were thus not using them in the way they are intended to be. As per the SCons manual: https://www.scons.org/doc/HTML/scons-user/apa.html - CCFLAGS: General options that are passed to the C and C++ compilers. - CFLAGS: General options that are passed to the C compiler (C only; not C++). - CXXFLAGS: General options that are passed to the C++ compiler. By default, this includes the value of $CCFLAGS, so that setting $CCFLAGS affects both C and C++ compilation. - CPPFLAGS: User-specified C preprocessor options. These will be included in any command that uses the C preprocessor, including not just compilation of C and C++ source files [...], but also [...] Fortran [...] and [...] assembly language source file[s]. TL;DR: Compiler options go to CCFLAGS, unless they must be restricted to either C (CFLAGS) or C++ (CXXFLAGS). Preprocessor defines go to CPPFLAGS.
396 lines
13 KiB
Python
396 lines
13 KiB
Python
#!/usr/bin/env python
|
|
|
|
Import('env')
|
|
Import('env_modules')
|
|
|
|
# Thirdparty sources
|
|
|
|
libvpx_dir = "#thirdparty/libvpx/"
|
|
|
|
libvpx_sources = [
|
|
"vp8/vp8_dx_iface.c",
|
|
|
|
"vp8/common/generic/systemdependent.c",
|
|
|
|
"vp8/common/alloccommon.c",
|
|
"vp8/common/blockd.c",
|
|
"vp8/common/copy_c.c",
|
|
"vp8/common/debugmodes.c",
|
|
"vp8/common/dequantize.c",
|
|
"vp8/common/entropy.c",
|
|
"vp8/common/entropymode.c",
|
|
"vp8/common/entropymv.c",
|
|
"vp8/common/extend.c",
|
|
"vp8/common/filter.c",
|
|
"vp8/common/findnearmv.c",
|
|
"vp8/common/idct_blk.c",
|
|
"vp8/common/idctllm.c",
|
|
"vp8/common/loopfilter_filters.c",
|
|
"vp8/common/mbpitch.c",
|
|
"vp8/common/modecont.c",
|
|
"vp8/common/quant_common.c",
|
|
"vp8/common/reconinter.c",
|
|
"vp8/common/reconintra.c",
|
|
"vp8/common/reconintra4x4.c",
|
|
"vp8/common/rtcd.c",
|
|
"vp8/common/setupintrarecon.c",
|
|
"vp8/common/swapyv12buffer.c",
|
|
"vp8/common/treecoder.c",
|
|
"vp8/common/vp8_loopfilter.c",
|
|
|
|
"vp8/decoder/dboolhuff.c",
|
|
"vp8/decoder/decodeframe.c",
|
|
"vp8/decoder/decodemv.c",
|
|
"vp8/decoder/detokenize.c",
|
|
"vp8/decoder/onyxd_if.c",
|
|
|
|
|
|
"vp9/vp9_dx_iface.c",
|
|
|
|
"vp9/common/vp9_alloccommon.c",
|
|
"vp9/common/vp9_blockd.c",
|
|
"vp9/common/vp9_common_data.c",
|
|
"vp9/common/vp9_debugmodes.c",
|
|
"vp9/common/vp9_entropy.c",
|
|
"vp9/common/vp9_entropymode.c",
|
|
"vp9/common/vp9_entropymv.c",
|
|
"vp9/common/vp9_filter.c",
|
|
"vp9/common/vp9_frame_buffers.c",
|
|
"vp9/common/vp9_idct.c",
|
|
"vp9/common/vp9_loopfilter.c",
|
|
"vp9/common/vp9_mvref_common.c",
|
|
"vp9/common/vp9_pred_common.c",
|
|
"vp9/common/vp9_quant_common.c",
|
|
"vp9/common/vp9_reconinter.c",
|
|
"vp9/common/vp9_reconintra.c",
|
|
"vp9/common/vp9_rtcd.c",
|
|
"vp9/common/vp9_scale.c",
|
|
"vp9/common/vp9_scan.c",
|
|
"vp9/common/vp9_seg_common.c",
|
|
"vp9/common/vp9_thread_common.c",
|
|
"vp9/common/vp9_tile_common.c",
|
|
|
|
"vp9/decoder/vp9_decodeframe.c",
|
|
"vp9/decoder/vp9_decodemv.c",
|
|
"vp9/decoder/vp9_decoder.c",
|
|
"vp9/decoder/vp9_detokenize.c",
|
|
"vp9/decoder/vp9_dsubexp.c",
|
|
"vp9/decoder/vp9_dthread.c",
|
|
|
|
|
|
"vpx/src/vpx_codec.c",
|
|
"vpx/src/vpx_decoder.c",
|
|
"vpx/src/vpx_image.c",
|
|
"vpx/src/vpx_psnr.c",
|
|
|
|
|
|
"vpx_dsp/bitreader.c",
|
|
"vpx_dsp/bitreader_buffer.c",
|
|
"vpx_dsp/intrapred.c",
|
|
"vpx_dsp/inv_txfm.c",
|
|
"vpx_dsp/loopfilter.c",
|
|
"vpx_dsp/prob.c",
|
|
"vpx_dsp/vpx_convolve.c",
|
|
"vpx_dsp/vpx_dsp_rtcd.c",
|
|
|
|
|
|
"vpx_mem/vpx_mem.c",
|
|
|
|
|
|
"vpx_scale/vpx_scale_rtcd.c",
|
|
|
|
"vpx_scale/generic/yv12config.c",
|
|
"vpx_scale/generic/yv12extend.c",
|
|
|
|
|
|
"vpx_util/vpx_thread.c"
|
|
]
|
|
|
|
libvpx_sources_mt = [
|
|
"vp8/decoder/threading.c",
|
|
]
|
|
|
|
libvpx_sources_intrin_x86 = [
|
|
"vp8/common/x86/filter_x86.c",
|
|
"vp8/common/x86/loopfilter_x86.c",
|
|
"vp8/common/x86/vp8_asm_stubs.c",
|
|
|
|
|
|
"vpx_dsp/x86/vpx_asm_stubs.c"
|
|
]
|
|
libvpx_sources_intrin_x86_mmx = [
|
|
"vp8/common/x86/idct_blk_mmx.c",
|
|
]
|
|
libvpx_sources_intrin_x86_sse2 = [
|
|
"vp8/common/x86/idct_blk_sse2.c",
|
|
|
|
|
|
"vp9/common/x86/vp9_idct_intrin_sse2.c",
|
|
|
|
|
|
"vpx_dsp/x86/inv_txfm_sse2.c",
|
|
"vpx_dsp/x86/loopfilter_sse2.c",
|
|
]
|
|
libvpx_sources_intrin_x86_ssse3 = [
|
|
"vpx_dsp/x86/vpx_subpixel_8t_intrin_ssse3.c"
|
|
]
|
|
libvpx_sources_intrin_x86_avx2 = [
|
|
"vpx_dsp/x86/loopfilter_avx2.c",
|
|
"vpx_dsp/x86/vpx_subpixel_8t_intrin_avx2.c"
|
|
]
|
|
libvpx_sources_x86asm = [
|
|
"vp8/common/x86/copy_sse2.asm",
|
|
"vp8/common/x86/copy_sse3.asm",
|
|
"vp8/common/x86/dequantize_mmx.asm",
|
|
"vp8/common/x86/idctllm_mmx.asm",
|
|
"vp8/common/x86/idctllm_sse2.asm",
|
|
"vp8/common/x86/iwalsh_mmx.asm",
|
|
"vp8/common/x86/iwalsh_sse2.asm",
|
|
"vp8/common/x86/loopfilter_sse2.asm",
|
|
"vp8/common/x86/recon_mmx.asm",
|
|
"vp8/common/x86/recon_sse2.asm",
|
|
"vp8/common/x86/subpixel_mmx.asm",
|
|
"vp8/common/x86/subpixel_sse2.asm",
|
|
"vp8/common/x86/subpixel_ssse3.asm",
|
|
"vp8/common/x86/vp8_loopfilter_mmx.asm",
|
|
|
|
|
|
"vpx_dsp/x86/intrapred_sse2.asm",
|
|
"vpx_dsp/x86/intrapred_ssse3.asm",
|
|
"vpx_dsp/x86/inv_wht_sse2.asm",
|
|
"vpx_dsp/x86/vpx_convolve_copy_sse2.asm",
|
|
"vpx_dsp/x86/vpx_subpixel_8t_sse2.asm",
|
|
"vpx_dsp/x86/vpx_subpixel_8t_ssse3.asm",
|
|
"vpx_dsp/x86/vpx_subpixel_bilinear_sse2.asm",
|
|
"vpx_dsp/x86/vpx_subpixel_bilinear_ssse3.asm",
|
|
|
|
|
|
"vpx_ports/emms.asm"
|
|
]
|
|
libvpx_sources_x86_64asm = [
|
|
"vp8/common/x86/loopfilter_block_sse2_x86_64.asm",
|
|
|
|
|
|
"vpx_dsp/x86/inv_txfm_ssse3_x86_64.asm"
|
|
]
|
|
|
|
libvpx_sources_arm = [
|
|
"vpx_ports/arm_cpudetect.c",
|
|
|
|
|
|
"vp8/common/arm/loopfilter_arm.c",
|
|
]
|
|
libvpx_sources_arm_neon = [
|
|
"vp8/common/arm/neon/bilinearpredict_neon.c",
|
|
"vp8/common/arm/neon/copymem_neon.c",
|
|
"vp8/common/arm/neon/dc_only_idct_add_neon.c",
|
|
"vp8/common/arm/neon/dequant_idct_neon.c",
|
|
"vp8/common/arm/neon/dequantizeb_neon.c",
|
|
"vp8/common/arm/neon/idct_blk_neon.c",
|
|
"vp8/common/arm/neon/idct_dequant_0_2x_neon.c",
|
|
"vp8/common/arm/neon/idct_dequant_full_2x_neon.c",
|
|
"vp8/common/arm/neon/iwalsh_neon.c",
|
|
"vp8/common/arm/neon/loopfiltersimplehorizontaledge_neon.c",
|
|
"vp8/common/arm/neon/loopfiltersimpleverticaledge_neon.c",
|
|
"vp8/common/arm/neon/mbloopfilter_neon.c",
|
|
"vp8/common/arm/neon/shortidct4x4llm_neon.c",
|
|
"vp8/common/arm/neon/sixtappredict_neon.c",
|
|
"vp8/common/arm/neon/vp8_loopfilter_neon.c",
|
|
|
|
|
|
"vp9/common/arm/neon/vp9_iht4x4_add_neon.c",
|
|
"vp9/common/arm/neon/vp9_iht8x8_add_neon.c",
|
|
|
|
|
|
"vpx_dsp/arm/idct16x16_1_add_neon.c",
|
|
"vpx_dsp/arm/idct16x16_add_neon.c",
|
|
"vpx_dsp/arm/idct16x16_neon.c",
|
|
"vpx_dsp/arm/idct32x32_1_add_neon.c",
|
|
"vpx_dsp/arm/idct32x32_add_neon.c",
|
|
"vpx_dsp/arm/idct4x4_1_add_neon.c",
|
|
"vpx_dsp/arm/idct4x4_add_neon.c",
|
|
"vpx_dsp/arm/idct8x8_1_add_neon.c",
|
|
"vpx_dsp/arm/idct8x8_add_neon.c",
|
|
"vpx_dsp/arm/intrapred_neon.c",
|
|
"vpx_dsp/arm/loopfilter_16_neon.c",
|
|
"vpx_dsp/arm/loopfilter_4_neon.c",
|
|
"vpx_dsp/arm/loopfilter_8_neon.c",
|
|
"vpx_dsp/arm/loopfilter_neon.c",
|
|
"vpx_dsp/arm/vpx_convolve8_avg_neon.c",
|
|
"vpx_dsp/arm/vpx_convolve8_neon.c",
|
|
"vpx_dsp/arm/vpx_convolve_avg_neon.c",
|
|
"vpx_dsp/arm/vpx_convolve_copy_neon.c",
|
|
"vpx_dsp/arm/vpx_convolve_neon.c"
|
|
]
|
|
libvpx_sources_arm_neon_gas = [
|
|
"vpx_dsp/arm/gas/intrapred_neon_asm.s",
|
|
"vpx_dsp/arm/gas/loopfilter_mb_neon.s",
|
|
"vpx_dsp/arm/gas/save_reg_neon.s"
|
|
]
|
|
libvpx_sources_arm_neon_armasm_ms = [
|
|
"vpx_dsp/arm/armasm_ms/intrapred_neon_asm.asm",
|
|
"vpx_dsp/arm/armasm_ms/loopfilter_mb_neon.asm",
|
|
"vpx_dsp/arm/armasm_ms/save_reg_neon.asm"
|
|
]
|
|
libvpx_sources_arm_neon_gas_apple = [
|
|
"vpx_dsp/arm/gas_apple/intrapred_neon_asm.s",
|
|
"vpx_dsp/arm/gas_apple/loopfilter_mb_neon.s",
|
|
"vpx_dsp/arm/gas_apple/save_reg_neon.s"
|
|
]
|
|
|
|
libvpx_sources = [libvpx_dir + file for file in libvpx_sources]
|
|
libvpx_sources_mt = [libvpx_dir + file for file in libvpx_sources_mt]
|
|
libvpx_sources_intrin_x86 = [libvpx_dir + file for file in libvpx_sources_intrin_x86]
|
|
libvpx_sources_intrin_x86_mmx = [libvpx_dir + file for file in libvpx_sources_intrin_x86_mmx]
|
|
libvpx_sources_intrin_x86_sse2 = [libvpx_dir + file for file in libvpx_sources_intrin_x86_sse2]
|
|
libvpx_sources_intrin_x86_ssse3 = [libvpx_dir + file for file in libvpx_sources_intrin_x86_ssse3]
|
|
libvpx_sources_intrin_x86_avx2 = [libvpx_dir + file for file in libvpx_sources_intrin_x86_avx2]
|
|
libvpx_sources_x86asm = [libvpx_dir + file for file in libvpx_sources_x86asm]
|
|
libvpx_sources_x86_64asm = [libvpx_dir + file for file in libvpx_sources_x86_64asm]
|
|
libvpx_sources_arm = [libvpx_dir + file for file in libvpx_sources_arm]
|
|
libvpx_sources_arm_neon = [libvpx_dir + file for file in libvpx_sources_arm_neon]
|
|
libvpx_sources_arm_neon_gas = [libvpx_dir + file for file in libvpx_sources_arm_neon_gas]
|
|
libvpx_sources_arm_neon_armasm_ms = [libvpx_dir + file for file in libvpx_sources_arm_neon_armasm_ms]
|
|
libvpx_sources_arm_neon_gas_apple = [libvpx_dir + file for file in libvpx_sources_arm_neon_gas_apple]
|
|
|
|
|
|
env_libvpx = env_modules.Clone()
|
|
env_libvpx.disable_warnings()
|
|
env_libvpx.Append(CPPPATH=[libvpx_dir])
|
|
|
|
webm_multithread = env["platform"] != 'javascript'
|
|
|
|
cpu_bits = env["bits"]
|
|
webm_cpu_x86 = False
|
|
webm_cpu_arm = False
|
|
if env["platform"] == 'uwp':
|
|
if 'arm' in env["PROGSUFFIX"]:
|
|
webm_cpu_arm = True
|
|
else:
|
|
webm_cpu_x86 = True
|
|
else:
|
|
import platform
|
|
is_x11_or_server_arm = ((env["platform"] == 'x11' or env["platform"] == 'server') and (platform.machine().startswith('arm') or platform.machine().startswith('aarch')))
|
|
is_ios_x86 = (env["platform"] == 'iphone' and ("arch" in env and env["arch"].startswith('x86')))
|
|
is_android_x86 = (env["platform"] == 'android' and env["android_arch"].startswith('x86'))
|
|
if is_android_x86:
|
|
cpu_bits = '32' if env["android_arch"] == 'x86' else '64'
|
|
webm_cpu_x86 = not is_x11_or_server_arm and (cpu_bits == '32' or cpu_bits == '64') and (env["platform"] == 'windows' or env["platform"] == 'x11' or env["platform"] == 'osx' or env["platform"] == 'haiku' or is_android_x86 or is_ios_x86)
|
|
webm_cpu_arm = is_x11_or_server_arm or (not is_ios_x86 and env["platform"] == 'iphone') or (not is_android_x86 and env["platform"] == 'android')
|
|
|
|
if webm_cpu_x86:
|
|
import subprocess
|
|
import os
|
|
|
|
yasm_paths = [
|
|
"yasm",
|
|
"../../../yasm",
|
|
]
|
|
|
|
yasm_found = False
|
|
|
|
devnull = open(os.devnull)
|
|
for yasm_path in yasm_paths:
|
|
try:
|
|
yasm_found = True
|
|
subprocess.Popen([yasm_path, "--version"], stdout=devnull, stderr=devnull).communicate()
|
|
except:
|
|
yasm_found = False
|
|
if yasm_found:
|
|
break
|
|
|
|
if not yasm_found:
|
|
webm_cpu_x86 = False
|
|
print("YASM is necessary for WebM SIMD optimizations.")
|
|
|
|
webm_simd_optimizations = False
|
|
|
|
if webm_cpu_x86:
|
|
if env["platform"] == 'windows' or env["platform"] == 'uwp':
|
|
env_libvpx["ASFORMAT"] = 'win'
|
|
elif env["platform"] == 'osx' or env["platform"] == "iphone":
|
|
env_libvpx["ASFORMAT"] = 'macho'
|
|
else:
|
|
env_libvpx["ASFORMAT"] = 'elf'
|
|
env_libvpx["ASFORMAT"] += cpu_bits
|
|
|
|
env_libvpx["AS"] = 'yasm'
|
|
env_libvpx["ASFLAGS"] = '-I' + libvpx_dir[1:] + ' -f $ASFORMAT -D $ASCPU'
|
|
env_libvpx["ASCOM"] = '$AS $ASFLAGS -o $TARGET $SOURCES'
|
|
|
|
if cpu_bits == '32':
|
|
env_libvpx["ASCPU"] = 'X86_32'
|
|
elif cpu_bits == '64':
|
|
env_libvpx["ASCPU"] = 'X86_64'
|
|
|
|
env_libvpx.Append(CPPFLAGS=['-DWEBM_X86ASM'])
|
|
|
|
webm_simd_optimizations = True
|
|
|
|
if webm_cpu_arm:
|
|
if env["platform"] == 'iphone':
|
|
env_libvpx["ASFLAGS"] = '-arch armv7'
|
|
elif env["platform"] == 'android' and env["android_arch"] == 'armv7' or env["platform"] == 'x11' or env["platform"] == 'server':
|
|
env_libvpx["ASFLAGS"] = '-mfpu=neon'
|
|
elif env["platform"] == 'uwp':
|
|
env_libvpx["AS"] = 'armasm'
|
|
env_libvpx["ASFLAGS"] = ''
|
|
env_libvpx["ASCOM"] = '$AS $ASFLAGS -o $TARGET $SOURCES'
|
|
|
|
env_libvpx.Append(CPPFLAGS=['-DWEBM_ARMASM'])
|
|
|
|
webm_simd_optimizations = True
|
|
|
|
if webm_simd_optimizations == False:
|
|
print("WebM SIMD optimizations are disabled. Check if your CPU architecture, CPU bits or platform are supported!")
|
|
|
|
env_libvpx.add_source_files(env.modules_sources, libvpx_sources)
|
|
|
|
if webm_multithread:
|
|
env_libvpx.add_source_files(env.modules_sources, libvpx_sources_mt)
|
|
|
|
if webm_cpu_x86:
|
|
is_clang_or_gcc = ('gcc' in os.path.basename(env["CC"])) or ('clang' in os.path.basename(env["CC"])) or ("osxcross" in env)
|
|
|
|
env_libvpx_mmx = env_libvpx.Clone()
|
|
if cpu_bits == '32' and is_clang_or_gcc:
|
|
env_libvpx_mmx.Append(CCFLAGS=['-mmmx'])
|
|
env_libvpx_mmx.add_source_files(env.modules_sources, libvpx_sources_intrin_x86_mmx)
|
|
|
|
env_libvpx_sse2 = env_libvpx.Clone()
|
|
if cpu_bits == '32' and is_clang_or_gcc:
|
|
env_libvpx_sse2.Append(CCFLAGS=['-msse2'])
|
|
env_libvpx_sse2.add_source_files(env.modules_sources, libvpx_sources_intrin_x86_sse2)
|
|
|
|
env_libvpx_ssse3 = env_libvpx.Clone()
|
|
if is_clang_or_gcc:
|
|
env_libvpx_ssse3.Append(CCFLAGS=['-mssse3'])
|
|
env_libvpx_ssse3.add_source_files(env.modules_sources, libvpx_sources_intrin_x86_ssse3)
|
|
|
|
env_libvpx_avx2 = env_libvpx.Clone()
|
|
if is_clang_or_gcc:
|
|
env_libvpx_avx2.Append(CCFLAGS=['-mavx2'])
|
|
env_libvpx_avx2.add_source_files(env.modules_sources, libvpx_sources_intrin_x86_avx2)
|
|
|
|
env_libvpx.add_source_files(env.modules_sources, libvpx_sources_intrin_x86)
|
|
|
|
env_libvpx.add_source_files(env.modules_sources, libvpx_sources_x86asm)
|
|
if cpu_bits == '64':
|
|
env_libvpx.add_source_files(env.modules_sources, libvpx_sources_x86_64asm)
|
|
elif webm_cpu_arm:
|
|
env_libvpx.add_source_files(env.modules_sources, libvpx_sources_arm)
|
|
if env["platform"] == 'android':
|
|
env_libvpx.Append(CPPPATH=[libvpx_dir + "third_party/android"])
|
|
env_libvpx.add_source_files(env.modules_sources, [libvpx_dir + "third_party/android/cpu-features.c"])
|
|
|
|
env_libvpx_neon = env_libvpx.Clone()
|
|
if env["platform"] == 'android' and env["android_arch"] == 'armv6':
|
|
env_libvpx_neon.Append(CCFLAGS=['-mfpu=neon'])
|
|
env_libvpx_neon.add_source_files(env.modules_sources, libvpx_sources_arm_neon)
|
|
|
|
if env["platform"] == 'uwp':
|
|
env_libvpx.add_source_files(env.modules_sources, libvpx_sources_arm_neon_armasm_ms)
|
|
elif env["platform"] == 'iphone':
|
|
env_libvpx.add_source_files(env.modules_sources, libvpx_sources_arm_neon_gas_apple)
|
|
elif (is_x11_or_server_arm and cpu_bits == '32') or (env["platform"] == 'android' and not env["android_arch"] == 'arm64v8'):
|
|
env_libvpx.add_source_files(env.modules_sources, libvpx_sources_arm_neon_gas)
|