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