rizin/subprojects/packagefiles/blake3/meson.build
amibranch 8e6b764fb5
build: Improved meson-build to use rizin as subproject (#4684)
* Setting GNU99/C99 standard for subprojects
* Remove use of `add_global_arguments`
* Added extern "C" linkage specification to some public headers of rizin
* Changed the meson_git_wrapper.py-script to explicitly specify the output-path
* Made the RIZIN_BUILD_PATH conditional in the integration-test meson-build

Co-authored-by: amibranch <amibranch@users.noreply.github.com>
2024-10-29 23:59:42 +08:00

167 lines
5.1 KiB
Meson

project('blake3', 'c',
version: '1.3.1',
license: 'CC0-1.0',
meson_version: '>=0.55.0',
default_options: [
'c_std=c99',
]
)
cc = meson.get_compiler('c')
# handle blake3 dependency
blake3_files = [
'c' / 'blake3_portable.c',
'c' / 'blake3_dispatch.c',
'c' / 'blake3.c',
]
# Meson simd module is not used on purpose because it is unstable and not supported in muon
blake3_simd = []
simd_avx2 = '''
#if defined(_MSC_VER)
#include <intrin.h>
#endif
#include <immintrin.h>
int main (int argc, char *argv[]) { __m256i add0 = _mm256_set_epi32(7, 6, 5, 4, 3, 2, 1, 0); return 0; }
'''
simd_avx512vl = '''
#if defined(_MSC_VER)
#include <intrin.h>
#endif
#include <immintrin.h>
int main (int argc, char *argv[]) { __m128i v = _mm_ror_epi32(_mm_set_epi32(3, 2, 1, 0), 5); return 0; }
'''
simd_sse2 = '''
#if defined(_MSC_VER)
#include <intrin.h>
#endif
#include <immintrin.h>
int main (int argc, char *argv[]) { __m128i add0 = _mm_set_epi32(3, 2, 1, 0); return 0; }
'''
simd_sse41 = '''
#if defined(_MSC_VER)
#include <intrin.h>
#endif
#include <immintrin.h>
int main (int argc, char *argv[]) { __m128i add0 = _mm_set_epi32(3, 2, 1, 0); return 0; }
'''
simd_neon = '''
#include <immintrin.h>
#include <arm_neon.h>
uint32x4_t set1_128(uint32_t x) { return vld1q_dup_u32(&x); }
int main (int argc, char *argv[]) { uint32x4_t three = set1_128(3); return 0; }
'''
# msvc can't just compile assembly so we use the intrins directly
# https://github.com/mesonbuild/meson/issues/9889
win_msvc_asm = [
['c' / 'blake3_avx2.c', '-DBLAKE3_NO_AVX2', 'avx2', simd_avx2, ['/arch:AVX2']],
['c' / 'blake3_avx512.c', '-DBLAKE3_NO_AVX512', 'avx512vl', simd_avx512vl, ['/arch:AVX512']],
['c' / 'blake3_sse2.c', '-DBLAKE3_NO_SSE2', 'sse2', simd_sse2, []], # sse2 extensions are enabled by default
['c' / 'blake3_sse41.c', '-DBLAKE3_NO_SSE41', 'sse41', simd_sse41, []], # sse41 extensions are enabled by default
]
win_gnu_asm = [
['c' / 'blake3_avx2_x86-64_windows_gnu.S', '-DBLAKE3_NO_AVX2', 'avx2', simd_avx2, ['-mavx2']],
['c' / 'blake3_avx512_x86-64_windows_gnu.S', '-DBLAKE3_NO_AVX512', 'avx512vl', simd_avx512vl, ['-mavx512f', '-mavx512vl']],
['c' / 'blake3_sse2_x86-64_windows_gnu.S', '-DBLAKE3_NO_SSE2', 'sse2', simd_sse2, ['-msse2']],
['c' / 'blake3_sse41_x86-64_windows_gnu.S', '-DBLAKE3_NO_SSE41', 'sse41', simd_sse41, ['-msse4.1']],
]
unix_asm = [
['c' / 'blake3_avx2_x86-64_unix.S', '-DBLAKE3_NO_AVX2', 'avx2', simd_avx2, ['-mavx2']],
['c' / 'blake3_avx512_x86-64_unix.S', '-DBLAKE3_NO_AVX512', 'avx512vl', simd_avx512vl, ['-mavx512f', '-mavx512vl']],
['c' / 'blake3_sse2_x86-64_unix.S', '-DBLAKE3_NO_SSE2', 'sse2', simd_sse2, ['-msse2']],
['c' / 'blake3_sse41_x86-64_unix.S', '-DBLAKE3_NO_SSE41', 'sse41', simd_sse41, ['-msse4.1']],
]
is_x64 = target_machine.cpu_family() == 'x86_64'
is_arm = target_machine.cpu_family() == 'aarch64'
has_intrins = cc.has_header('immintrin.h')
has_simd = false
if has_intrins and is_arm
has_simd = true
has_neon = cc.compiles(simd_neon, args: [], name: 'neon')
if has_neon
blake3_files += 'c' / 'blake3_neon.c'
add_project_arguments('-DBLAKE3_USE_NEON=1', language: 'c')
else
add_project_arguments('-DBLAKE3_USE_NEON=0', language: 'c')
endif
elif has_intrins and is_x64
has_simd = true
if target_machine.system() == 'windows'
if cc.get_id() == 'msvc'
blake3_simd = win_msvc_asm
else # gcc or clang
blake3_simd = win_gnu_asm
endif
elif cc.compiles(files('unix_syntax_check.S')[0], args: [], name: 'asm_syntax') # unix only, check if the compiler supports the used asm syntax
blake3_simd = unix_asm
else
has_simd = false
endif
add_project_arguments('-DBLAKE3_USE_NEON=0', language: 'c')
endif
if not has_simd
# since we do not support SIMD we just use the portable code.
blake3_flags = [
'-DBLAKE3_NO_SSE2',
'-DBLAKE3_NO_SSE41',
'-DBLAKE3_NO_AVX2',
'-DBLAKE3_NO_AVX512',
'-DBLAKE3_USE_NEON=0',
]
foreach flag : blake3_flags
add_project_arguments(flag, language: 'c')
endforeach
endif
blake3_lib_defs = []
foreach it : blake3_simd
disable_flag = it[1]
name = it[2]
code = it[3]
args = it[4]
has_extension = cc.compiles(code, args: args, name: name)
if has_extension
blake3_lib_defs += [it]
else
add_project_arguments(disable_flag, language: 'c')
endif
endforeach
# This must not happen inside the loop above because add_project_arguments() calls must precede any
# build target declaration.
blake3_libs = []
foreach it : blake3_lib_defs
# https://github.com/mesonbuild/meson/issues/1367
# Individual static libraries are needed to avoid passing the simd flags to the C files,
# which would make functions like memset() use potentially unsupported instructions at runtime.
blake3_libs += static_library('blake3_' + it[2], it[0], c_args: it[4])
endforeach
blake3_inc = [
include_directories(['c'])
]
blake3 = static_library('blake3', blake3_files,
dependencies: [],
link_with: blake3_libs,
include_directories: blake3_inc,
implicit_include_directories: false
)
blake3_dep = declare_dependency(
link_with: blake3,
include_directories: blake3_inc
)