1338bf337Smrg# Copyright © 2018 Intel Corporation 2338bf337Smrg 3338bf337Smrg# Permission is hereby granted, free of charge, to any person obtaining a copy 4338bf337Smrg# of this software and associated documentation files (the "Software"), to deal 5338bf337Smrg# in the Software without restriction, including without limitation the rights 6338bf337Smrg# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7338bf337Smrg# copies of the Software, and to permit persons to whom the Software is 8338bf337Smrg# furnished to do so, subject to the following conditions: 9338bf337Smrg 10338bf337Smrg# The above copyright notice and this permission notice shall be included in 11338bf337Smrg# all copies or substantial portions of the Software. 12338bf337Smrg 13338bf337Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14338bf337Smrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15338bf337Smrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16338bf337Smrg# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17338bf337Smrg# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18338bf337Smrg# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19338bf337Smrg# SOFTWARE. 20338bf337Smrg 21338bf337Smrgproject( 22338bf337Smrg 'pixman', 23338bf337Smrg ['c'], 2414b11b2bSmrg version : '0.46.4', 25338bf337Smrg license : 'MIT', 2614b11b2bSmrg meson_version : '>= 1.3.0', 2714b11b2bSmrg default_options : ['c_std=gnu99,c99', 'buildtype=debugoptimized'], 28338bf337Smrg) 29338bf337Smrg 30338bf337Smrgconfig = configuration_data() 31338bf337Smrgcc = meson.get_compiler('c') 32338bf337Smrgnull_dep = dependency('', required : false) 33338bf337Smrg 34338bf337Smrgadd_project_arguments( 35338bf337Smrg cc.get_supported_arguments([ 36338bf337Smrg '-Wdeclaration-after-statement', 37338bf337Smrg '-fno-strict-aliasing', 38338bf337Smrg '-fvisibility=hidden', 3914b11b2bSmrg '-Wundef', 4014b11b2bSmrg # -ftrapping-math is the default for gcc, but -fno-trapping-math is the 4114b11b2bSmrg # default for clang. The FLOAT_IS_ZERO macro is used to guard against 4214b11b2bSmrg # floating-point exceptions, however with -fno-trapping-math, the compiler 4314b11b2bSmrg # can reorder floating-point operations so that they occur before the guard. 4414b11b2bSmrg # Note, this function is ignored in clang < 10.0.0. 4514b11b2bSmrg '-ftrapping-math' 46338bf337Smrg ]), 47338bf337Smrg language : ['c'] 48338bf337Smrg) 49338bf337Smrg 50338bf337Smrg# GCC and Clang both ignore -Wno options that they don't recognize, so test for 51338bf337Smrg# -W<opt>, then add -Wno-<opt> if it's ignored 52338bf337Smrgforeach opt : ['unused-local-typedefs'] 53338bf337Smrg if cc.has_argument('-W' + opt) 54338bf337Smrg add_project_arguments(['-Wno-' + opt], language : ['c']) 55338bf337Smrg endif 56338bf337Smrgendforeach 57338bf337Smrg 58338bf337Smrguse_loongson_mmi = get_option('loongson-mmi') 59338bf337Smrghave_loongson_mmi = false 6014b11b2bSmrgloongson_mmi_flags = ['-mloongson-mmi'] 61338bf337Smrgif not use_loongson_mmi.disabled() 62338bf337Smrg if host_machine.cpu_family() == 'mips64' and cc.compiles(''' 63338bf337Smrg #ifndef __mips_loongson_vector_rev 64338bf337Smrg #error "Loongson Multimedia Instructions are only available on Loongson" 65338bf337Smrg #endif 66338bf337Smrg #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4)) 67338bf337Smrg #error "Need GCC >= 4.4 for Loongson MMI compilation" 68338bf337Smrg #endif 69338bf337Smrg #include "pixman/loongson-mmintrin.h" 70338bf337Smrg int main () { 71338bf337Smrg union { 72338bf337Smrg __m64 v; 73338bf337Smrg char c[8]; 74338bf337Smrg } a = { .c = {1, 2, 3, 4, 5, 6, 7, 8} }; 75338bf337Smrg int b = 4; 76338bf337Smrg __m64 c = _mm_srli_pi16 (a.v, b); 77338bf337Smrg return 0; 78338bf337Smrg }''', 79338bf337Smrg args : loongson_mmi_flags, 80f8cc1056Smrg include_directories : include_directories('.'), 81338bf337Smrg name : 'Loongson MMI Intrinsic Support') 82338bf337Smrg have_loongson_mmi = true 83338bf337Smrg endif 84338bf337Smrgendif 85338bf337Smrg 86338bf337Smrgif have_loongson_mmi 87338bf337Smrg config.set10('USE_LOONGSON_MMI', true) 88338bf337Smrgelif use_loongson_mmi.enabled() 89338bf337Smrg error('Loongson MMI Support unavailable, but required') 90338bf337Smrgendif 91338bf337Smrg 92338bf337Smrguse_mmx = get_option('mmx') 93338bf337Smrghave_mmx = false 9414b11b2bSmrgmmx_flags = [] 9514b11b2bSmrg 9614b11b2bSmrgif cc.get_id() == 'msvc' 9714b11b2bSmrg mmx_flags = ['/w14710', '/w14714', '/wd4244'] 9814b11b2bSmrgelif cc.get_id() == 'sun' 9914b11b2bSmrg mmx_flags = ['-xarch=sse'] 10014b11b2bSmrgelse 10114b11b2bSmrg mmx_flags = ['-mmmx', '-Winline'] 10214b11b2bSmrgendif 103338bf337Smrgif not use_mmx.disabled() 10414b11b2bSmrg if host_machine.cpu_family() == 'x86_64' or cc.get_id() == 'msvc' 105338bf337Smrg have_mmx = true 106338bf337Smrg elif host_machine.cpu_family() == 'x86' and cc.compiles(''' 107338bf337Smrg #include <mmintrin.h> 108338bf337Smrg #include <stdint.h> 109338bf337Smrg 110338bf337Smrg /* Check support for block expressions */ 111338bf337Smrg #define _mm_shuffle_pi16(A, N) \ 112338bf337Smrg ({ \ 113338bf337Smrg __m64 ret; \ 114338bf337Smrg \ 115338bf337Smrg /* Some versions of clang will choke on K */ \ 116338bf337Smrg asm ("pshufw %2, %1, %0\n\t" \ 117338bf337Smrg : "=y" (ret) \ 118338bf337Smrg : "y" (A), "K" ((const int8_t)N) \ 119338bf337Smrg ); \ 120338bf337Smrg \ 121338bf337Smrg ret; \ 122338bf337Smrg }) 123338bf337Smrg 124338bf337Smrg int main () { 125338bf337Smrg __m64 v = _mm_cvtsi32_si64 (1); 126338bf337Smrg __m64 w; 127338bf337Smrg 128338bf337Smrg w = _mm_shuffle_pi16(v, 5); 129338bf337Smrg 130338bf337Smrg /* Some versions of clang will choke on this */ 131338bf337Smrg asm ("pmulhuw %1, %0\n\t" 132338bf337Smrg : "+y" (w) 133338bf337Smrg : "y" (v) 134338bf337Smrg ); 135338bf337Smrg 136338bf337Smrg return _mm_cvtsi64_si32 (v); 137338bf337Smrg }''', 138338bf337Smrg args : mmx_flags, 139338bf337Smrg name : 'MMX Intrinsic Support') 140338bf337Smrg have_mmx = true 141338bf337Smrg endif 142338bf337Smrgendif 143338bf337Smrg 144338bf337Smrgif have_mmx 14514b11b2bSmrg # Inline assembly do not work on X64 MSVC, so we use 14614b11b2bSmrg # compatibility intrinsics there 14714b11b2bSmrg if cc.get_id() != 'msvc' or host_machine.cpu_family() != 'x86_64' 14814b11b2bSmrg config.set10('USE_X86_MMX', true) 14914b11b2bSmrg endif 150338bf337Smrgelif use_mmx.enabled() 151338bf337Smrg error('MMX Support unavailable, but required') 152338bf337Smrgendif 153338bf337Smrg 154338bf337Smrguse_sse2 = get_option('sse2') 155338bf337Smrghave_sse2 = false 15614b11b2bSmrgsse2_flags = [] 15714b11b2bSmrgif cc.get_id() == 'sun' 15814b11b2bSmrg sse2_flags = ['-xarch=sse2'] 15914b11b2bSmrgelif cc.get_id() != 'msvc' 16014b11b2bSmrg sse2_flags = ['-msse2', '-Winline'] 16114b11b2bSmrgendif 162338bf337Smrgif not use_sse2.disabled() 163338bf337Smrg if host_machine.cpu_family() == 'x86' 164338bf337Smrg if cc.compiles(''' 165338bf337Smrg #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)) 166338bf337Smrg # if !defined(__amd64__) && !defined(__x86_64__) 167338bf337Smrg # error "Need GCC >= 4.2 for SSE2 intrinsics on x86" 168338bf337Smrg # endif 169338bf337Smrg #endif 170338bf337Smrg #include <mmintrin.h> 171338bf337Smrg #include <xmmintrin.h> 172338bf337Smrg #include <emmintrin.h> 173338bf337Smrg int param; 174338bf337Smrg int main () { 175338bf337Smrg __m128i a = _mm_set1_epi32 (param), b = _mm_set1_epi32 (param + 1), c; 176338bf337Smrg c = _mm_xor_si128 (a, b); 177338bf337Smrg return _mm_cvtsi128_si32(c); 178338bf337Smrg }''', 179338bf337Smrg args : sse2_flags, 180338bf337Smrg name : 'SSE2 Intrinsic Support') 181338bf337Smrg have_sse2 = true 182338bf337Smrg endif 183338bf337Smrg elif host_machine.cpu_family() == 'x86_64' 184338bf337Smrg have_sse2 = true 185338bf337Smrg endif 186338bf337Smrgendif 187338bf337Smrg 188338bf337Smrgif have_sse2 189338bf337Smrg config.set10('USE_SSE2', true) 190338bf337Smrgelif use_sse2.enabled() 191338bf337Smrg error('sse2 Support unavailable, but required') 192338bf337Smrgendif 193338bf337Smrg 194338bf337Smrguse_ssse3 = get_option('ssse3') 195338bf337Smrghave_ssse3 = false 19614b11b2bSmrgssse3_flags = [] 19714b11b2bSmrgif cc.get_id() != 'msvc' 19814b11b2bSmrg ssse3_flags = ['-mssse3', '-Winline'] 19914b11b2bSmrgendif 20014b11b2bSmrg 20114b11b2bSmrg# x64 pre-2010 MSVC compilers crashes when building the ssse3 code 20214b11b2bSmrgif not use_ssse3.disabled() and not (cc.get_id() == 'msvc' and cc.version().version_compare('<16') and host_machine.cpu_family() == 'x86_64') 203338bf337Smrg if host_machine.cpu_family().startswith('x86') 204338bf337Smrg if cc.compiles(''' 205338bf337Smrg #include <mmintrin.h> 206338bf337Smrg #include <xmmintrin.h> 207338bf337Smrg #include <emmintrin.h> 208338bf337Smrg int param; 209338bf337Smrg int main () { 210338bf337Smrg __m128i a = _mm_set1_epi32 (param), b = _mm_set1_epi32 (param + 1), c; 211338bf337Smrg c = _mm_xor_si128 (a, b); 212338bf337Smrg return _mm_cvtsi128_si32(c); 213338bf337Smrg }''', 214338bf337Smrg args : ssse3_flags, 215338bf337Smrg name : 'SSSE3 Intrinsic Support') 216338bf337Smrg have_ssse3 = true 217338bf337Smrg endif 218338bf337Smrg endif 219338bf337Smrgendif 220338bf337Smrg 221338bf337Smrgif have_ssse3 222338bf337Smrg config.set10('USE_SSSE3', true) 223338bf337Smrgelif use_ssse3.enabled() 224338bf337Smrg error('ssse3 Support unavailable, but required') 225338bf337Smrgendif 226338bf337Smrg 227338bf337Smrguse_vmx = get_option('vmx') 228338bf337Smrghave_vmx = false 229338bf337Smrgvmx_flags = ['-maltivec', '-mabi=altivec'] 230338bf337Smrgif not use_vmx.disabled() 231338bf337Smrg if host_machine.cpu_family().startswith('ppc') 232338bf337Smrg if cc.compiles(''' 233338bf337Smrg #include <altivec.h> 234338bf337Smrg int main () { 235338bf337Smrg vector unsigned int v = vec_splat_u32 (1); 236338bf337Smrg v = vec_sub (v, v); 237338bf337Smrg return 0; 238338bf337Smrg }''', 239338bf337Smrg args : vmx_flags, 240338bf337Smrg name : 'VMX/Altivec Intrinsic Support') 241338bf337Smrg have_vmx = true 242338bf337Smrg endif 243338bf337Smrg endif 244338bf337Smrgendif 245338bf337Smrg 24614b11b2bSmrgif cc.compiles(''' 24714b11b2bSmrg __asm__ ( 24814b11b2bSmrg ".func meson_test" 24914b11b2bSmrg ".endfunc" 25014b11b2bSmrg );''', 25114b11b2bSmrg name : 'test for ASM .func directive') 25214b11b2bSmrg config.set('ASM_HAVE_FUNC_DIRECTIVE', 1) 25314b11b2bSmrgendif 25414b11b2bSmrg 25514b11b2bSmrgif cc.compiles(''' 25614b11b2bSmrg __asm__ ( 25714b11b2bSmrg ".syntax unified\n" 25814b11b2bSmrg );''', 25914b11b2bSmrg name : 'test for ASM .syntax unified directive') 26014b11b2bSmrg config.set('ASM_HAVE_SYNTAX_UNIFIED', 1) 26114b11b2bSmrgendif 26214b11b2bSmrg 26314b11b2bSmrgif cc.links(''' 26414b11b2bSmrg #include <stdint.h> 26514b11b2bSmrg 26614b11b2bSmrg __asm__ ( 26714b11b2bSmrg " .global _testlabel\n" 26814b11b2bSmrg "_testlabel:\n" 26914b11b2bSmrg ); 27014b11b2bSmrg 27114b11b2bSmrg int testlabel(); 27214b11b2bSmrg int main(int argc, char* argv[]) { 27314b11b2bSmrg return testlabel(); 27414b11b2bSmrg }''', 27514b11b2bSmrg name : 'test for ASM leading underscore') 27614b11b2bSmrg config.set('ASM_LEADING_UNDERSCORE', 1) 27714b11b2bSmrgendif 27814b11b2bSmrg 27914b11b2bSmrg 28014b11b2bSmrg 281338bf337Smrgif have_vmx 282338bf337Smrg config.set10('USE_VMX', true) 283338bf337Smrgelif use_vmx.enabled() 284338bf337Smrg error('vmx Support unavailable, but required') 285338bf337Smrgendif 286338bf337Smrg 287338bf337Smrguse_armv6_simd = get_option('arm-simd') 288338bf337Smrghave_armv6_simd = false 289338bf337Smrgif not use_armv6_simd.disabled() 290338bf337Smrg if host_machine.cpu_family() == 'arm' 291f8cc1056Smrg if cc.compiles(files('arm-simd-test.S'), name : 'ARMv6 SIMD Intrinsic Support') 292338bf337Smrg have_armv6_simd = true 293338bf337Smrg endif 294338bf337Smrg endif 295338bf337Smrgendif 296338bf337Smrg 297338bf337Smrgif have_armv6_simd 298338bf337Smrg config.set10('USE_ARM_SIMD', true) 299338bf337Smrgelif use_armv6_simd.enabled() 300338bf337Smrg error('ARMv6 SIMD Support unavailable, but required') 301338bf337Smrgendif 302338bf337Smrg 303338bf337Smrguse_neon = get_option('neon') 304338bf337Smrghave_neon = false 305338bf337Smrgif not use_neon.disabled() 306338bf337Smrg if host_machine.cpu_family() == 'arm' 307f8cc1056Smrg if cc.compiles(files('neon-test.S'), name : 'NEON Intrinsic Support') 308338bf337Smrg have_neon = true 309338bf337Smrg endif 310338bf337Smrg endif 311338bf337Smrgendif 312338bf337Smrg 313338bf337Smrgif have_neon 314338bf337Smrg config.set10('USE_ARM_NEON', true) 315338bf337Smrgelif use_neon.enabled() 316338bf337Smrg error('NEON Support unavailable, but required') 317338bf337Smrgendif 318338bf337Smrg 31914b11b2bSmrguse_a64neon = get_option('a64-neon') 32014b11b2bSmrghave_a64neon = false 32114b11b2bSmrgif not use_a64neon.disabled() 32214b11b2bSmrg if host_machine.cpu_family() == 'aarch64' 32314b11b2bSmrg if cc.compiles(files('a64-neon-test.S'), name : 'NEON A64 Intrinsic Support') 32414b11b2bSmrg have_a64neon = true 325338bf337Smrg endif 326338bf337Smrg endif 327338bf337Smrgendif 328338bf337Smrg 32914b11b2bSmrgif have_a64neon 33014b11b2bSmrg config.set10('USE_ARM_A64_NEON', true) 33114b11b2bSmrgelif use_a64neon.enabled() 33214b11b2bSmrg error('A64 NEON Support unavailable, but required') 333338bf337Smrgendif 334338bf337Smrg 335338bf337Smrguse_mips_dspr2 = get_option('mips-dspr2') 336338bf337Smrghave_mips_dspr2 = false 337338bf337Smrgmips_dspr2_flags = ['-mdspr2'] 338338bf337Smrgif not use_mips_dspr2.disabled() 33914b11b2bSmrg if host_machine.cpu_family().startswith('mips') 340338bf337Smrg if cc.compiles(''' 341338bf337Smrg #if !(defined(__mips__) && __mips_isa_rev >= 2) 342338bf337Smrg #error MIPS DSPr2 is currently only available on MIPS32r2 platforms. 343338bf337Smrg #endif 344338bf337Smrg int 345338bf337Smrg main () 346338bf337Smrg { 347338bf337Smrg int c = 0, a = 0, b = 0; 348338bf337Smrg __asm__ __volatile__ ( 349338bf337Smrg "precr.qb.ph %[c], %[a], %[b] \n\t" 350338bf337Smrg : [c] "=r" (c) 351338bf337Smrg : [a] "r" (a), [b] "r" (b) 352338bf337Smrg ); 353338bf337Smrg return c; 354338bf337Smrg }''', 35514b11b2bSmrg args : mips_dspr2_flags, 356338bf337Smrg name : 'DSPr2 Intrinsic Support') 357338bf337Smrg have_mips_dspr2 = true 358338bf337Smrg endif 359338bf337Smrg endif 360338bf337Smrgendif 361338bf337Smrg 362338bf337Smrgif have_mips_dspr2 363338bf337Smrg config.set10('USE_MIPS_DSPR2', true) 364338bf337Smrgelif use_mips_dspr2.enabled() 365338bf337Smrg error('MIPS DSPr2 Support unavailable, but required') 366338bf337Smrgendif 367338bf337Smrg 36814b11b2bSmrguse_rvv = get_option('rvv') 36914b11b2bSmrghave_rvv = false 37014b11b2bSmrgrvv_flags = ['-march=rv64gcv1p0'] 37114b11b2bSmrgif not use_rvv.disabled() 37214b11b2bSmrg if host_machine.cpu_family() == 'riscv64' 37314b11b2bSmrg if cc.compiles(''' 37414b11b2bSmrg #include <riscv_vector.h> 37514b11b2bSmrg #include <asm/hwprobe.h> 37614b11b2bSmrg #include <linux/version.h> 37714b11b2bSmrg #include <sys/auxv.h> 37814b11b2bSmrg #include <sys/syscall.h> 37914b11b2bSmrg #include <unistd.h> 38014b11b2bSmrg 38114b11b2bSmrg #if defined(__riscv_v) && __riscv_v < 1000000 38214b11b2bSmrg #error "Minimum supported RVV is 1.0" 38314b11b2bSmrg #endif 38414b11b2bSmrg #if LINUX_VERSION_CODE < KERNEL_VERSION(6, 5, 0) 38514b11b2bSmrg #error "Minimum supported kernel is 6.5.0" 38614b11b2bSmrg #endif 38714b11b2bSmrg int main() { 38814b11b2bSmrg struct riscv_hwprobe pair = {RISCV_HWPROBE_KEY_IMA_EXT_0, 0}; 38914b11b2bSmrg long result = sys_riscv_hwprobe (&pair, 1, 0, 0, 0); 39014b11b2bSmrg vfloat32m1_t tmp1; /* added in gcc-13 */ 39114b11b2bSmrg vfloat32m1x4_t tmp2; /* added in gcc-14 */ 39214b11b2bSmrg return 0; 39314b11b2bSmrg } 39414b11b2bSmrg ''', 39514b11b2bSmrg args : rvv_flags, 39614b11b2bSmrg name : 'RISC-V Vector Intrinsic Support') 39714b11b2bSmrg have_rvv = true 39814b11b2bSmrg endif 39914b11b2bSmrg endif 40014b11b2bSmrgendif 40114b11b2bSmrg 40214b11b2bSmrgif have_rvv 40314b11b2bSmrg config.set10('USE_RVV', true) 40414b11b2bSmrgelif use_rvv.enabled() 40514b11b2bSmrg error('RISC-V Vector Support unavailable, but required') 40614b11b2bSmrgendif 40714b11b2bSmrg 408338bf337Smrguse_gnu_asm = get_option('gnu-inline-asm') 409338bf337Smrgif not use_gnu_asm.disabled() 410338bf337Smrg if cc.compiles(''' 411338bf337Smrg int main () { 412338bf337Smrg /* Most modern architectures have a NOP instruction, so this is a fairly generic test. */ 413338bf337Smrg asm volatile ( "\tnop\n" : : : "cc", "memory" ); 414338bf337Smrg return 0; 415338bf337Smrg } 416338bf337Smrg ''', 417338bf337Smrg name : 'GNU Inline ASM support.') 418338bf337Smrg config.set10('USE_GCC_INLINE_ASM', true) 419338bf337Smrg elif use_gnu_asm.enabled() 420338bf337Smrg error('GNU inline assembly support missing but required.') 421338bf337Smrg endif 422338bf337Smrgendif 423338bf337Smrg 424338bf337Smrgif get_option('timers') 425338bf337Smrg config.set('PIXMAN_TIMERS', 1) 426338bf337Smrgendif 427338bf337Smrgif get_option('gnuplot') 428338bf337Smrg config.set('PIXMAN_GNUPLOT', 1) 429338bf337Smrgendif 430338bf337Smrg 43114b11b2bSmrgif cc.get_id() != 'msvc' 43214b11b2bSmrg dep_openmp = dependency('openmp', required : get_option('openmp')) 43314b11b2bSmrg if dep_openmp.found() 43414b11b2bSmrg config.set10('USE_OPENMP', true) 43514b11b2bSmrg endif 43614b11b2bSmrgelse 43714b11b2bSmrg # the MSVC implementation of openmp is not compliant enough for our 43814b11b2bSmrg # uses here, so we disable it here. 43914b11b2bSmrg # Please see: https://stackoverflow.com/questions/12560243/using-threadprivate-directive-in-visual-studio 440f8cc1056Smrg dep_openmp = null_dep 441338bf337Smrgendif 442338bf337Smrg 44314b11b2bSmrgdep_gtk = dependency('gtk+-3.0', required : get_option('gtk').enabled() and get_option('demos').enabled()) 44414b11b2bSmrgdep_glib = dependency('glib-2.0', required : get_option('gtk').enabled() and get_option('demos').enabled()) 44514b11b2bSmrg 44614b11b2bSmrgdep_png = null_dep 44714b11b2bSmrgif not get_option('libpng').disabled() 44814b11b2bSmrg dep_png = dependency('libpng', required : false) 44914b11b2bSmrg 45014b11b2bSmrg # We need to look for the right library to link to for libpng, 45114b11b2bSmrg # when looking for libpng manually 45214b11b2bSmrg foreach png_ver : [ '16', '15', '14', '13', '12', '10' ] 45314b11b2bSmrg if not dep_png.found() 45414b11b2bSmrg dep_png = cc.find_library('libpng@0@'.format(png_ver), has_headers : ['png.h'], required : false) 45514b11b2bSmrg endif 45614b11b2bSmrg endforeach 45714b11b2bSmrg 45814b11b2bSmrg if get_option('libpng').enabled() and not dep_png.found() 45914b11b2bSmrg error('libpng support requested but libpng library not found') 46014b11b2bSmrg endif 46114b11b2bSmrgendif 46214b11b2bSmrg 463338bf337Smrgif dep_png.found() 464338bf337Smrg config.set('HAVE_LIBPNG', 1) 465338bf337Smrgendif 466338bf337Smrgdep_m = cc.find_library('m', required : false) 467338bf337Smrgdep_threads = dependency('threads') 46814b11b2bSmrg 46914b11b2bSmrg# MSVC-style compilers do not come with pthreads, so we must link 47014b11b2bSmrg# to it explicitly, currently pthreads-win32 is supported 47114b11b2bSmrgpthreads_found = false 47214b11b2bSmrg 47314b11b2bSmrgif dep_threads.found() and cc.has_header('pthread.h') 47414b11b2bSmrg if cc.get_argument_syntax() == 'msvc' 47514b11b2bSmrg pthread_lib = null_dep 47614b11b2bSmrg foreach pthread_type : ['VC3', 'VSE3', 'VCE3', 'VC2', 'VSE2', 'VCE2'] 47714b11b2bSmrg if not pthread_lib.found() 47814b11b2bSmrg pthread_lib = cc.find_library('pthread@0@'.format(pthread_type), required : false) 47914b11b2bSmrg endif 48014b11b2bSmrg endforeach 48114b11b2bSmrg if pthread_lib.found() 48214b11b2bSmrg pthreads_found = true 48314b11b2bSmrg dep_threads = pthread_lib 48414b11b2bSmrg endif 48514b11b2bSmrg else 48614b11b2bSmrg pthreads_found = true 48714b11b2bSmrg endif 48814b11b2bSmrgelse 48914b11b2bSmrg # Avoid linking with -pthread if we don't actually have pthreads 49014b11b2bSmrg dep_threads = null_dep 49114b11b2bSmrgendif 49214b11b2bSmrg 49314b11b2bSmrgif pthreads_found 494338bf337Smrg config.set('HAVE_PTHREADS', 1) 495338bf337Smrgendif 496338bf337Smrg 49714b11b2bSmrgfuncs = ['sigaction', 'alarm', 'mprotect', 'getpagesize', 'mmap', 'getisax', 'gettimeofday'] 498338bf337Smrg# mingw claimes to have posix_memalign, but it doesn't 499338bf337Smrgif host_machine.system() != 'windows' 500338bf337Smrg funcs += 'posix_memalign' 501338bf337Smrgendif 502338bf337Smrg 503338bf337Smrgforeach f : funcs 504338bf337Smrg if cc.has_function(f) 505338bf337Smrg config.set('HAVE_@0@'.format(f.to_upper()), 1) 506338bf337Smrg endif 507338bf337Smrgendforeach 508338bf337Smrg 509338bf337Smrg# This is only used in one test, that defines _GNU_SOURCE 510338bf337Smrgif cc.has_function('feenableexcept', 511338bf337Smrg prefix : '#define _GNU_SOURCE\n#include <fenv.h>', 512338bf337Smrg dependencies : dep_m) 513338bf337Smrg config.set('HAVE_FEENABLEEXCEPT', 1) 514338bf337Smrgendif 515338bf337Smrg 516338bf337Smrgif cc.has_header_symbol('fenv.h', 'FE_DIVBYZERO') 517338bf337Smrg config.set('HAVE_FEDIVBYZERO', 1) 518338bf337Smrgendif 519338bf337Smrg 520338bf337Smrgforeach h : ['sys/mman.h', 'fenv.h', 'unistd.h'] 521338bf337Smrg if cc.check_header(h) 522338bf337Smrg config.set('HAVE_@0@'.format(h.underscorify().to_upper()), 1) 523338bf337Smrg endif 524338bf337Smrgendforeach 525338bf337Smrg 52614b11b2bSmrguse_tls = get_option('tls') 52714b11b2bSmrghave_tls = '' 52814b11b2bSmrgif not use_tls.disabled() 52914b11b2bSmrg # gcc on Windows only warns that __declspec(thread) isn't supported, 53014b11b2bSmrg # passing -Werror=attributes makes it fail. 53114b11b2bSmrg if (host_machine.system() == 'windows' and 53214b11b2bSmrg cc.compiles('int __declspec(thread) foo;', 53314b11b2bSmrg args : cc.get_supported_arguments(['-Werror=attributes']), 53414b11b2bSmrg name : 'TLS via __declspec(thread)')) 53514b11b2bSmrg have_tls = '__declspec(thread)' 53614b11b2bSmrg elif cc.compiles('int __thread foo;', name : 'TLS via __thread') 53714b11b2bSmrg have_tls = '__thread' 53814b11b2bSmrg endif 53914b11b2bSmrgendif 54014b11b2bSmrg 54114b11b2bSmrgif have_tls != '' 54214b11b2bSmrg config.set('TLS', have_tls) 54314b11b2bSmrgelif use_tls.enabled() 54414b11b2bSmrg error('Compiler TLS Support unavailable, but required') 545338bf337Smrgendif 546338bf337Smrg 547338bf337Smrgif cc.links(''' 548338bf337Smrg static int x = 1; 549338bf337Smrg static void __attribute__((constructor)) constructor_function () { x = 0; } 550338bf337Smrg int main (void) { return x; } 551338bf337Smrg ''', 552338bf337Smrg name : '__attribute__((constructor))') 553338bf337Smrg config.set('TOOLCHAIN_SUPPORTS_ATTRIBUTE_CONSTRUCTOR', 1) 554338bf337Smrgendif 555338bf337Smrg 55614b11b2bSmrgif cc.links(''' 55714b11b2bSmrg static int x = 1; 55814b11b2bSmrg static void __attribute__((destructor)) destructor_function () { x = 0; } 55914b11b2bSmrg int main (void) { return x; } 56014b11b2bSmrg ''', 56114b11b2bSmrg name : '__attribute__((destructor))') 56214b11b2bSmrg config.set('TOOLCHAIN_SUPPORTS_ATTRIBUTE_DESTRUCTOR', 1) 56314b11b2bSmrgendif 56414b11b2bSmrg 565338bf337Smrgif cc.links( 566338bf337Smrg ' __float128 a = 1.0Q, b = 2.0Q; int main (void) { return a + b; }', 567338bf337Smrg name : 'Has float128 support') 568338bf337Smrg config.set('HAVE_FLOAT128', 1) 569338bf337Smrgendif 570338bf337Smrg 571338bf337Smrgif cc.has_function('clz') 572338bf337Smrg config.set('HAVE_BUILTIN_CLZ', 1) 573338bf337Smrgendif 574338bf337Smrg 575338bf337Smrgif cc.links(''' 576338bf337Smrg unsigned int __attribute__ ((vector_size(16))) e, a, b; 577338bf337Smrg int main (void) { e = a - ((b << 27) + (b >> (32 - 27))) + 1; return e[0]; } 578338bf337Smrg ''', 579338bf337Smrg name : 'Support for GCC vector extensions') 580338bf337Smrg config.set('HAVE_GCC_VECTOR_EXTENSIONS', 1) 581338bf337Smrgendif 582338bf337Smrg 583338bf337Smrgif host_machine.endian() == 'big' 584338bf337Smrg config.set('WORDS_BIGENDIAN', 1) 585338bf337Smrgendif 586338bf337Smrg 58714b11b2bSmrgconfig.set('SIZEOF_LONG', cc.sizeof('long')) 58814b11b2bSmrg 589338bf337Smrg# Required to make pixman-private.h 590338bf337Smrgconfig.set('PACKAGE', 'foo') 591338bf337Smrg 592338bf337Smrgversion_conf = configuration_data() 593338bf337Smrgsplit = meson.project_version().split('.') 594338bf337Smrgversion_conf.set('PIXMAN_VERSION_MAJOR', split[0]) 595338bf337Smrgversion_conf.set('PIXMAN_VERSION_MINOR', split[1]) 596338bf337Smrgversion_conf.set('PIXMAN_VERSION_MICRO', split[2]) 597338bf337Smrg 598338bf337Smrgadd_project_arguments('-DHAVE_CONFIG_H', language : ['c']) 599338bf337Smrg 600338bf337Smrgsubdir('pixman') 60114b11b2bSmrg 60214b11b2bSmrgif not get_option('tests').disabled() or not get_option('demos').disabled() 60314b11b2bSmrg subdir('test/utils') 60414b11b2bSmrgendif 60514b11b2bSmrg 60614b11b2bSmrgif not get_option('demos').disabled() 60714b11b2bSmrg subdir('demos') 60814b11b2bSmrgendif 60914b11b2bSmrg 61014b11b2bSmrgif not get_option('tests').disabled() 61114b11b2bSmrg subdir('test') 61214b11b2bSmrgendif 613338bf337Smrg 614338bf337Smrgpkg = import('pkgconfig') 61514b11b2bSmrgpkg.generate(libpixman, 616338bf337Smrg name : 'Pixman', 617338bf337Smrg filebase : 'pixman-1', 618338bf337Smrg description : 'The pixman library (version 1)', 619338bf337Smrg subdirs: 'pixman-1', 620338bf337Smrg version : meson.project_version(), 621338bf337Smrg) 622