-
Notifications
You must be signed in to change notification settings - Fork 4
/
meson.build
2412 lines (2160 loc) · 80.3 KB
/
meson.build
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# Copyright © 2017-2020 Intel Corporation
# SPDX-License-Identifier: MIT
project(
'mesa',
['c', 'cpp'],
version : files('VERSION'),
license : 'MIT',
meson_version : '>= 1.1.0',
default_options : [
'buildtype=debugoptimized',
'b_ndebug=if-release',
'c_std=c11',
'cpp_std=c++17',
'rust_std=2021',
'build.rust_std=2021',
],
)
if host_machine.system() == 'darwin'
add_languages('objc', native : false)
add_project_arguments('-fobjc-arc', language : 'objc')
endif
cc = meson.get_compiler('c')
cpp = meson.get_compiler('cpp')
sizeof_pointer = cc.sizeof('void*').to_string()
null_dep = dependency('', required : false)
if get_option('layout') != 'mirror'
error('`mirror` is the only build directory layout supported')
endif
with_mesa_debug = get_option('buildtype') == 'debug'
# This means the final value of b_ndebug==true
with_mesa_ndebug = get_option('b_ndebug') == 'true' or (get_option('buildtype') == 'release' and get_option('b_ndebug') == 'if-release')
# Arguments for the preprocessor, put these in a separate array from the C and
# C++ (cpp in meson terminology) arguments since they need to be added to the
# default arguments for both C and C++.
pre_args = [
'-D__STDC_CONSTANT_MACROS',
'-D__STDC_FORMAT_MACROS',
'-D__STDC_LIMIT_MACROS',
'-DPACKAGE_VERSION="@0@"'.format(meson.project_version()),
'-DPACKAGE_BUGREPORT="https://gitlab.freedesktop.org/mesa/mesa/-/issues"',
]
# Arguments for c or cpp compiler, can be compiler options
c_cpp_args = []
c_args = []
cpp_args = []
with_moltenvk_dir = get_option('moltenvk-dir')
with_vulkan_icd_dir = get_option('vulkan-icd-dir')
with_tests = get_option('build-tests')
with_glcpp_tests = get_option('enable-glcpp-tests')
with_aco_tests = get_option('build-aco-tests')
with_glx_read_only_text = get_option('glx-read-only-text')
with_glx_direct = get_option('glx-direct')
with_osmesa = get_option('osmesa')
with_vulkan_overlay_layer = get_option('vulkan-layers').contains('overlay')
with_vulkan_device_select_layer = get_option('vulkan-layers').contains('device-select')
with_vulkan_screenshot_layer = get_option('vulkan-layers').contains('screenshot')
with_tools = get_option('tools')
if with_tools.contains('all')
with_tools = [
'drm-shim',
'dlclose-skip',
'etnaviv',
'freedreno',
'glsl',
'intel',
'intel-ui',
'lima',
'nir',
'nouveau',
'asahi',
'imagination',
]
endif
with_any_vulkan_layers = get_option('vulkan-layers').length() != 0
with_intel_tools = with_tools.contains('intel') or with_tools.contains('intel-ui')
with_imgui = with_intel_tools or with_vulkan_overlay_layer
dri_drivers_path = get_option('dri-drivers-path')
if dri_drivers_path == ''
dri_drivers_path = join_paths(get_option('prefix'), get_option('libdir'), 'dri')
endif
gbm_backends_path = get_option('gbm-backends-path')
if gbm_backends_path == ''
gbm_backends_path = join_paths(get_option('prefix'), get_option('libdir'), 'gbm')
endif
# Default shared glapi disabled for windows, enabled elsewhere.
with_shared_glapi = get_option('shared-glapi') \
.disable_auto_if(host_machine.system() == 'windows') \
.allowed()
with_opengl = get_option('opengl')
with_gles1 = get_option('gles1') \
.require(with_shared_glapi, error_message : 'OpengGL ES 1.x requires shared-glapi') \
.allowed()
with_gles2 = get_option('gles2') \
.require(with_shared_glapi, error_message : 'OpengGL ES 2.x requires shared-glapi') \
.allowed()
pre_args += '-DHAVE_OPENGL=@0@'.format(with_opengl.to_int())
pre_args += '-DHAVE_OPENGL_ES_1=@0@'.format(with_gles1.to_int())
pre_args += '-DHAVE_OPENGL_ES_2=@0@'.format(with_gles2.to_int())
with_any_opengl = with_opengl or with_gles1 or with_gles2
# Only build shared_glapi if at least one OpenGL API is enabled
with_shared_glapi = with_shared_glapi and with_any_opengl
system_has_kms_drm = ['openbsd', 'netbsd', 'freebsd', 'gnu/kfreebsd', 'dragonfly', 'linux', 'sunos', 'android', 'managarm'].contains(host_machine.system())
gallium_drivers = get_option('gallium-drivers')
if gallium_drivers.contains('auto')
if system_has_kms_drm
# TODO: Sparc
if ['x86', 'x86_64'].contains(host_machine.cpu_family())
gallium_drivers = [
'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'svga', 'llvmpipe', 'softpipe',
'iris', 'crocus', 'i915', 'zink'
]
elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
gallium_drivers = [
'v3d', 'vc4', 'freedreno', 'etnaviv', 'nouveau', 'svga',
'tegra', 'virgl', 'lima', 'panfrost', 'llvmpipe', 'softpipe', 'iris',
'zink'
]
elif ['mips', 'mips64', 'ppc', 'ppc64', 'riscv32', 'riscv64'].contains(host_machine.cpu_family())
gallium_drivers = [
'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'llvmpipe', 'softpipe', 'zink'
]
elif ['loongarch64'].contains(host_machine.cpu_family())
gallium_drivers = [
'r300', 'r600', 'radeonsi', 'nouveau', 'virgl', 'etnaviv', 'llvmpipe', 'softpipe', 'zink'
]
else
error('Unknown architecture @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
host_machine.cpu_family()))
endif
elif ['windows'].contains(host_machine.system())
gallium_drivers = ['llvmpipe', 'softpipe', 'zink', 'd3d12']
elif ['darwin', 'cygwin', 'haiku'].contains(host_machine.system())
gallium_drivers = ['llvmpipe', 'softpipe']
else
error('Unknown OS @0@. Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
host_machine.system()))
endif
elif gallium_drivers.contains('all')
# Build-test everything except for i915, which depends on libdrm-intel which
# is not available on non-Intel distros.
gallium_drivers = [
'r300', 'r600', 'radeonsi', 'crocus', 'v3d', 'vc4', 'freedreno', 'etnaviv',
'nouveau', 'svga', 'tegra', 'virgl', 'lima', 'panfrost', 'llvmpipe', 'softpipe', 'iris',
'zink', 'd3d12', 'asahi'
]
endif
# compatibility for meson configurations asking for 'swrast'
with_swrast = gallium_drivers.contains('swrast')
if with_swrast
warning('`gallium-drivers=swrast` is a deprecated alias for `gallium-drivers=softpipe,llvmpipe` and will be removed in version 25.0')
endif
with_gallium_radeonsi = gallium_drivers.contains('radeonsi')
with_gallium_r300 = gallium_drivers.contains('r300')
with_gallium_r600 = gallium_drivers.contains('r600')
with_gallium_nouveau = gallium_drivers.contains('nouveau')
with_gallium_freedreno = gallium_drivers.contains('freedreno')
with_gallium_softpipe = with_swrast or gallium_drivers.contains('softpipe')
with_gallium_llvmpipe = with_swrast or gallium_drivers.contains('llvmpipe')
with_gallium_vc4 = gallium_drivers.contains('vc4')
with_gallium_v3d = gallium_drivers.contains('v3d')
with_gallium_panfrost = gallium_drivers.contains('panfrost')
with_gallium_etnaviv = gallium_drivers.contains('etnaviv')
with_gallium_tegra = gallium_drivers.contains('tegra')
with_gallium_crocus = gallium_drivers.contains('crocus')
with_gallium_iris = gallium_drivers.contains('iris')
with_gallium_i915 = gallium_drivers.contains('i915')
with_gallium_svga = gallium_drivers.contains('svga')
with_gallium_virgl = gallium_drivers.contains('virgl')
with_gallium_lima = gallium_drivers.contains('lima')
with_gallium_zink = gallium_drivers.contains('zink')
with_gallium_d3d12 = gallium_drivers.contains('d3d12')
with_gallium_asahi = gallium_drivers.contains('asahi')
foreach gallium_driver : gallium_drivers
pre_args += '-DHAVE_@0@'.format(gallium_driver.to_upper())
endforeach
# compatibility for "swrast" as an internal-ish driver name
with_gallium_swrast = with_gallium_softpipe or with_gallium_llvmpipe
if with_gallium_swrast
pre_args += '-DHAVE_SWRAST'
endif
with_gallium = gallium_drivers.length() != 0
with_gallium_kmsro = system_has_kms_drm and [
with_gallium_asahi,
with_gallium_etnaviv,
with_gallium_freedreno,
with_gallium_lima,
with_gallium_panfrost,
with_gallium_v3d,
with_gallium_vc4,
].contains(true)
_vulkan_drivers = get_option('vulkan-drivers')
if _vulkan_drivers.contains('auto')
if system_has_kms_drm
if host_machine.cpu_family().startswith('x86')
_vulkan_drivers = ['amd', 'intel', 'intel_hasvk', 'nouveau', 'swrast']
elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
_vulkan_drivers = ['swrast', 'intel']
elif ['mips', 'mips64', 'ppc', 'ppc64', 'riscv32', 'riscv64'].contains(host_machine.cpu_family())
_vulkan_drivers = ['amd', 'swrast']
elif ['loongarch64'].contains(host_machine.cpu_family())
_vulkan_drivers = ['amd', 'swrast']
else
error('Unknown architecture @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format(
host_machine.cpu_family()))
endif
elif ['darwin', 'windows', 'cygwin', 'haiku'].contains(host_machine.system())
# No vulkan driver supports windows or macOS currently
_vulkan_drivers = []
else
error('Unknown OS @0@. Please pass -Dvulkan-drivers to set driver options. Patches gladly accepted to fix this.'.format(
host_machine.system()))
endif
elif _vulkan_drivers.contains('all')
# Build every vulkan driver regardless of architecture.
_vulkan_drivers = ['amd', 'intel', 'intel_hasvk', 'swrast',
'freedreno', 'panfrost', 'virtio', 'broadcom',
'imagination-experimental', 'microsoft-experimental',
'nouveau', 'asahi', 'gfxstream-experimental']
endif
with_intel_vk = _vulkan_drivers.contains('intel')
with_intel_hasvk = _vulkan_drivers.contains('intel_hasvk')
with_amd_vk = _vulkan_drivers.contains('amd')
with_freedreno_vk = _vulkan_drivers.contains('freedreno')
with_panfrost_vk = _vulkan_drivers.contains('panfrost')
with_swrast_vk = _vulkan_drivers.contains('swrast')
with_virtio_vk = _vulkan_drivers.contains('virtio')
with_broadcom_vk = _vulkan_drivers.contains('broadcom')
with_imagination_vk = _vulkan_drivers.contains('imagination-experimental')
with_imagination_srv = get_option('imagination-srv')
with_microsoft_vk = _vulkan_drivers.contains('microsoft-experimental')
with_nouveau_vk = _vulkan_drivers.contains('nouveau')
with_asahi_vk = _vulkan_drivers.contains('asahi')
with_gfxstream_vk = _vulkan_drivers.contains('gfxstream-experimental')
with_any_vk = _vulkan_drivers.length() != 0
if with_any_vk and host_machine.system() == 'windows' and meson.version().version_compare('< 1.3')
error('Vulkan drivers on Windows require meson 1.3 or newer')
endif
with_any_llvmpipe = with_gallium_llvmpipe or with_swrast_vk
with_gallium_or_lvp = with_gallium or with_swrast_vk
freedreno_kmds = get_option('freedreno-kmds')
if freedreno_kmds.length() != 0 and freedreno_kmds != [ 'msm' ] and with_freedreno_vk
if freedreno_kmds.contains('msm')
warning('Turnip with the DRM KMD will require libdrm to always be present at runtime which may not always be the case on platforms such as Android.')
elif with_gallium_kmsro
warning('As a side-effect, Turnip is forced to link with libdrm when built alongside Gallium DRM drivers which platforms such as Android may not have available at runtime.')
elif _vulkan_drivers != [ 'freedreno' ]
warning('Turnip is forced to link with libdrm when built alongside other Vulkan drivers which platforms such as Android may not have available at runtime.')
else
# If DRM support isn't needed, we can get rid of it since linking
# to libdrm can be a potential compatibility hazard.
system_has_kms_drm = false
endif
endif
with_dri = false
if with_gallium and system_has_kms_drm
_glx = get_option('glx')
_egl = get_option('egl')
if _glx == 'dri' or _egl.enabled() or (_glx == 'disabled' and _egl.allowed())
with_dri = true
endif
endif
with_any_broadcom = [
with_gallium_vc4,
with_gallium_v3d,
with_broadcom_vk,
].contains(true)
if get_option('intel-clc') != 'system'
# Require intel-clc with Anv & Iris (for internal shaders)
with_intel_clc = get_option('intel-clc') == 'enabled' or \
with_intel_vk or with_gallium_iris
else
with_intel_clc = false
endif
with_intel_vk_rt = get_option('intel-rt') \
.disable_auto_if(not with_intel_vk) \
.disable_if(host_machine.cpu_family() != 'x86_64', error_message : 'Intel Ray Tracing is only supported on x86_64') \
.allowed()
with_any_intel = [
with_gallium_crocus,
with_gallium_i915,
with_gallium_iris,
with_intel_clc,
with_intel_hasvk,
with_intel_tools,
with_intel_vk,
].contains(true)
with_any_nouveau = with_gallium_nouveau or with_nouveau_vk
# needed in the loader
if with_nouveau_vk
pre_args += '-DHAVE_NVK'
endif
if with_gallium_tegra and not with_gallium_nouveau
error('tegra driver requires nouveau driver')
endif
if with_aco_tests and not with_amd_vk
error('ACO tests require Radv')
endif
with_microsoft_clc = get_option('microsoft-clc').enabled()
with_spirv_to_dxil = get_option('spirv-to-dxil')
if host_machine.system() == 'darwin'
with_dri_platform = 'apple'
pre_args += '-DBUILDING_MESA'
elif ['windows', 'cygwin'].contains(host_machine.system())
with_dri_platform = 'windows'
elif system_has_kms_drm
with_dri_platform = 'drm'
else
# FIXME: haiku doesn't use dri, and xlib doesn't use dri, probably should
# assert here that one of those cases has been met.
# FIXME: illumos ends up here as well
with_dri_platform = 'none'
endif
with_vulkan_beta = get_option('vulkan-beta')
if host_machine.system() == 'darwin'
#macOS seems to need beta extensions to build for now:
with_vulkan_beta = true
endif
if with_vulkan_beta
pre_args += '-DVK_ENABLE_BETA_EXTENSIONS'
endif
_codecs = get_option('video-codecs')
patent_codecs = ['vc1dec', 'h264dec', 'h264enc', 'h265dec', 'h265enc']
free_codecs = ['av1dec', 'av1enc', 'vp9dec']
all_codecs = patent_codecs + free_codecs
if _codecs.contains('all')
_codecs = all_codecs
elif _codecs.contains('all_free')
selected_codecs = _codecs
_codecs = free_codecs
foreach c : patent_codecs
if selected_codecs.contains(c)
_codecs += c
endif
endforeach
endif
foreach c : all_codecs
pre_args += '-DVIDEO_CODEC_@0@=@1@'.format(c.to_upper(), _codecs.contains(c).to_int())
endforeach
_platforms = get_option('platforms')
if _platforms.contains('auto')
if system_has_kms_drm
_platforms = ['x11', 'wayland']
elif host_machine.system() == 'cygwin'
_platforms = ['x11']
elif host_machine.system() == 'haiku'
_platforms = ['haiku']
elif host_machine.system() == 'windows'
_platforms = ['windows']
elif host_machine.system() == 'darwin'
_platforms = ['x11', 'macos']
else
error('Unknown OS @0@. Please pass -Dplatforms to set platforms. Patches gladly accepted to fix this.'.format(
host_machine.system()))
endif
endif
with_platform_android = _platforms.contains('android')
with_platform_x11 = _platforms.contains('x11')
with_platform_xcb = _platforms.contains('xcb')
with_platform_wayland = _platforms.contains('wayland')
with_platform_haiku = _platforms.contains('haiku')
with_platform_windows = _platforms.contains('windows')
with_platform_macos = _platforms.contains('macos')
with_glx = get_option('glx')
if with_glx == 'auto'
if not with_opengl
with_glx = 'disabled'
elif with_platform_android
with_glx = 'disabled'
elif with_dri
with_glx = 'dri'
elif with_platform_haiku
with_glx = 'disabled'
elif host_machine.system() == 'windows'
with_glx = 'disabled'
elif with_gallium
# Even when building just gallium drivers the user probably wants dri
with_glx = 'dri'
elif with_platform_x11 and with_any_opengl and not with_any_vk
# The automatic behavior should not be to turn on xlib based glx when
# building only vulkan drivers
with_glx = 'xlib'
else
with_glx = 'disabled'
endif
endif
if with_glx == 'dri'
if with_gallium
with_dri = true
endif
endif
if not with_opengl and with_glx != 'disabled'
error('Building GLX without OpenGL is not supported.')
endif
if not (with_dri or with_gallium or with_glx != 'disabled')
with_gles1 = false
with_gles2 = false
with_opengl = false
with_any_opengl = false
with_shared_glapi = false
endif
with_gbm = get_option('gbm') \
.require(system_has_kms_drm, error_message : 'GBM only supports DRM/KMS platforms') \
.disable_auto_if(not with_dri) \
.allowed()
with_xlib_lease = get_option('xlib-lease') \
.require(with_platform_x11 and (system_has_kms_drm or with_dri_platform == 'apple'), error_message : 'xlib-lease requires X11 and KMS/DRM support') \
.allowed()
with_egl = get_option('egl') \
.require(with_platform_windows or with_platform_haiku or with_dri or with_platform_android, error_message : 'EGL requires DRI, Haiku, Windows or Android') \
.require(with_shared_glapi, error_message : 'EGL requires shared-glapi') \
.require(with_glx != 'xlib', error_message :'EGL requires DRI, but GLX is being built with xlib support') \
.disable_auto_if(with_platform_haiku) \
.allowed()
if with_egl
_platforms += 'surfaceless'
if with_gbm and not with_platform_android
_platforms += 'drm'
endif
egl_native_platform = get_option('egl-native-platform')
if egl_native_platform.contains('auto')
egl_native_platform = _platforms[0]
endif
endif
if with_egl and not _platforms.contains(egl_native_platform)
error('-Degl-native-platform does not specify an enabled platform')
endif
if 'x11' in _platforms
_platforms += 'xcb'
endif
foreach platform : _platforms
pre_args += '-DHAVE_@0@_PLATFORM'.format(platform.to_upper())
endforeach
if with_platform_android and get_option('platform-sdk-version') >= 29
# By default the NDK compiler, at least, emits emutls references instead of
# ELF TLS, even when building targeting newer API levels. Make it actually do
# ELF TLS instead.
c_cpp_args += '-fno-emulated-tls'
endif
# -mtls-dialect=gnu2 speeds up non-initial-exec TLS significantly but requires
# full toolchain (including libc) support.
have_mtls_dialect = false
foreach c_arg : get_option('c_args')
if c_arg.startswith('-mtls-dialect=')
have_mtls_dialect = true
break
endif
endforeach
if not have_mtls_dialect
# need .run to check libc support. meson aborts when calling .run when
# cross-compiling, but because this is just an optimization we can skip it
if meson.is_cross_build() and not meson.can_run_host_binaries()
warning('cannot auto-detect -mtls-dialect when cross-compiling, using compiler default')
else
# The way to specify the TLSDESC dialect is architecture-specific.
# We probe both because there is not a fallback guaranteed to work for all
# future architectures.
foreach tlsdesc_arg : ['-mtls-dialect=gnu2', '-mtls-dialect=desc']
# -fpic to force dynamic tls, otherwise TLS relaxation defeats check
tlsdesc_test = cc.run('int __thread x; int main() { return x; }',
args: [tlsdesc_arg, '-fpic'],
name: tlsdesc_arg)
if tlsdesc_test.returncode() == 0 and (
# check for lld 13 bug: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5665
host_machine.cpu_family() != 'x86_64' or
# get_linker_id misses LDFLAGS=-fuse-ld=lld: https://github.com/mesonbuild/meson/issues/6377
#cc.get_linker_id() != 'ld.lld' or
cc.links('''int __thread x; int y; int main() { __asm__(
"leaq x@TLSDESC(%rip), %rax\n"
"movq y@GOTPCREL(%rip), %rdx\n"
"call *x@TLSCALL(%rax)\n"); }''', name: 'split TLSDESC')
)
c_cpp_args += tlsdesc_arg
break
endif
endforeach
endif
endif
if with_glx != 'disabled'
if not (with_platform_x11 and with_any_opengl)
error('Cannot build GLX support without X11 platform support and at least one OpenGL API')
elif with_glx == 'xlib'
if not with_gallium
error('xlib based GLX requires at least one gallium driver')
elif not with_gallium_swrast
#error('xlib based GLX requires softpipe or llvmpipe.')
elif with_dri
error('xlib conflicts with any dri driver')
endif
elif with_glx == 'dri'
if not with_shared_glapi
error('dri based GLX requires shared-glapi')
endif
endif
endif
_glvnd = get_option('glvnd') \
.require(not with_platform_windows,
error_message: 'glvnd cannot be used on Windows') \
.require(with_glx != 'xlib',
error_message: 'Cannot build glvnd support for GLX that is not DRI based.') \
.require(with_glx != 'disabled' or with_egl,
error_message: 'glvnd requires DRI based GLX and/or EGL') \
.require(get_option('egl-lib-suffix') == '',
error_message: '''EGL lib suffix can't be used with libglvnd''')
dep_glvnd = dependency('libglvnd', version : '>= 1.3.2', required : _glvnd)
with_glvnd = dep_glvnd.found()
pre_args += '-DUSE_LIBGLVND=@0@'.format(with_glvnd.to_int())
glvnd_vendor_name = get_option('glvnd-vendor-name')
if with_vulkan_icd_dir == ''
with_vulkan_icd_dir = join_paths(get_option('datadir'), 'vulkan/icd.d')
endif
with_dri2 = (with_dri or with_any_vk) and (with_dri_platform == 'drm' or with_dri_platform == 'apple')
with_x11_dri2 = with_dri2 and get_option('legacy-x11').contains('dri2')
if with_dri
if with_glx == 'disabled' and not with_egl and not with_gbm
error('building dri drivers require at least one windowing system')
endif
endif
dep_dxheaders = null_dep
if with_gallium_d3d12 or with_microsoft_clc or with_microsoft_vk
dep_dxheaders = dependency('directx-headers', required : false)
if not dep_dxheaders.found()
dep_dxheaders = dependency('DirectX-Headers',
version : '>= 1.614.1',
fallback : ['DirectX-Headers', 'dep_dxheaders'],
required : with_gallium_d3d12 or with_microsoft_vk
)
endif
endif
_with_gallium_d3d12_video = get_option('gallium-d3d12-video')
with_gallium_d3d12_video = false
if with_gallium_d3d12 and not _with_gallium_d3d12_video.disabled()
with_gallium_d3d12_video = true
pre_args += '-DHAVE_GALLIUM_D3D12_VIDEO'
endif
_vdpau_drivers = [
with_gallium_d3d12_video,
with_gallium_nouveau,
with_gallium_r600,
with_gallium_radeonsi,
with_gallium_virgl,
]
vdpau = get_option('gallium-vdpau') \
.require(system_has_kms_drm, error_message : 'VDPAU state tracker can only be build on unix-like OSes.') \
.require(with_platform_x11, error_message : 'VDPAU state tracker requires X11 support.') \
.require(_vdpau_drivers.contains(true), error_message : 'VDPAU state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau, d3d12 (with option gallium-d3d12-video, virgl).')
dep_vdpau = dependency('vdpau', version : '>= 1.5', required : vdpau)
if dep_vdpau.found()
dep_vdpau = dep_vdpau.partial_dependency(compile_args : true)
pre_args += '-DHAVE_ST_VDPAU'
endif
with_gallium_vdpau = dep_vdpau.found()
vdpau_drivers_path = get_option('vdpau-libs-path')
if vdpau_drivers_path == ''
vdpau_drivers_path = join_paths(get_option('libdir'), 'vdpau')
endif
# GLSL has interesting version output and Meson doesn't parse it correctly as of
# Meson 1.4.0
prog_glslang = find_program('glslangValidator', native : true,
required : with_vulkan_overlay_layer or with_aco_tests or with_amd_vk or with_intel_vk)
if prog_glslang.found()
# Check if glslang has depfile support. Support was added in 11.3.0, but
# Windows path support was broken until 11.9.0.
#
# It is intentional to check the build machine, since we need to ensure that
# glslang will output valid paths on the build platform
_glslang_check = build_machine.system() == 'windows' ? '>= 11.9.0' : '>= 11.3.0'
if run_command(prog_glslang, ['--version'], check : false).stdout().split(':')[2].version_compare(_glslang_check)
glslang_depfile = ['--depfile', '@DEPFILE@']
else
glslang_depfile = []
endif
if run_command(prog_glslang, [ '--quiet', '--version' ], check : false).returncode() == 0
glslang_quiet = ['--quiet']
else
glslang_quiet = []
endif
endif
_va_drivers = [
with_gallium_d3d12_video,
with_gallium_nouveau,
with_gallium_r600,
with_gallium_radeonsi,
with_gallium_virgl,
]
_va = get_option('gallium-va') \
.require(_va_drivers.contains(true),
error_message : 'VA state tracker requires at least one of the following gallium drivers: r600, radeonsi, nouveau, d3d12 (with option gallium-d3d12-video), virgl.')
_dep_va_name = host_machine.system() == 'windows' ? 'libva-win32' : 'libva'
dep_va = dependency(_dep_va_name, version : '>= 1.8.0', required : _va)
if dep_va.found()
dep_va_headers = dep_va.partial_dependency(compile_args : true)
if cc.has_header_symbol('va/va.h', 'VASurfaceAttribDRMFormatModifiers',
dependencies: dep_va_headers)
pre_args += '-DHAVE_VA_SURFACE_ATTRIB_DRM_FORMAT_MODIFIERS'
endif
endif
with_gallium_va = dep_va.found()
va_drivers_path = get_option('va-libs-path')
if va_drivers_path == ''
va_drivers_path = join_paths(get_option('libdir'), 'dri')
endif
with_gallium_xa = get_option('gallium-xa') \
.require(system_has_kms_drm, error_message : 'XA state tracker can only be built on unix-like OSes.') \
.require(with_gallium_nouveau or with_gallium_freedreno or with_gallium_i915 or with_gallium_svga,
error_message : 'XA state tracker requires at least one of the following gallium drivers: nouveau, freedreno, i915, svga.') \
.allowed()
d3d_drivers_path = get_option('d3d-drivers-path')
if d3d_drivers_path == ''
d3d_drivers_path = join_paths(get_option('prefix'), get_option('libdir'), 'd3d')
endif
with_gallium_st_nine = get_option('gallium-nine')
if with_gallium_st_nine
if not with_gallium_swrast
error('The nine state tracker requires gallium softpipe/llvmpipe.')
elif not [
with_gallium_crocus,
with_gallium_freedreno,
with_gallium_i915,
with_gallium_iris,
with_gallium_nouveau,
with_gallium_panfrost,
with_gallium_r300,
with_gallium_r600,
with_gallium_radeonsi,
with_gallium_svga,
with_gallium_zink,
].contains(true)
error('The nine state tracker requires at least one non-swrast gallium driver.')
endif
endif
with_gallium_st_d3d10umd = get_option('gallium-d3d10umd')
if with_gallium_st_d3d10umd
if not with_gallium_swrast
error('The d3d10umd state tracker requires gallium softpipe/llvmpipe.')
endif
endif
_power8 = get_option('power8')
if _power8.allowed()
if host_machine.cpu_family() == 'ppc64' and host_machine.endian() == 'little'
if cc.get_id() == 'gcc' and cc.version().version_compare('< 4.8')
error('Altivec is not supported with gcc version < 4.8.')
endif
if cc.compiles('''
#include <altivec.h>
int main() {
vector unsigned char r;
vector unsigned int v = vec_splat_u32 (1);
r = __builtin_vec_vgbbd ((vector unsigned char) v);
return 0;
}''',
args : '-mpower8-vector',
name : 'POWER8 intrinsics')
pre_args += ['-D_ARCH_PWR8']
c_cpp_args += '-mpower8-vector'
elif _power8.enabled()
error('POWER8 intrinsic support required but not found.')
endif
endif
endif
if get_option('vmware-mks-stats')
if not with_gallium_svga
error('vmware-mks-stats requires gallium VMware/svga driver.')
endif
pre_args += '-DVMX86_STATS=1'
endif
_opencl = get_option('gallium-opencl')
_rtti = get_option('cpp_rtti')
if _opencl != 'disabled'
if not with_gallium
error('OpenCL Clover implementation requires at least one gallium driver.')
endif
if not _rtti
error('The Clover OpenCL state tracker requires rtti')
endif
with_gallium_clover = true
with_opencl_icd = _opencl == 'icd'
else
with_gallium_clover = false
with_opencl_icd = false
endif
with_gallium_rusticl = get_option('gallium-rusticl')
if with_gallium_rusticl
if not with_gallium
error('rusticl requires at least one gallium driver.')
endif
endif
if with_gallium_rusticl or with_nouveau_vk or with_tools.contains('etnaviv')
if with_gallium_rusticl
# uses rust.bindgen.output_inline_wrapper needing 1.4.0
if meson.version().version_compare('< 1.4.0')
error('Rusticl requires meson 1.4.0 or newer')
endif
else
# see https://github.com/mesonbuild/meson/issues/12758 (backported to 1.3.2)
if meson.version().version_compare('< 1.3.2')
error('Mesa Rust support requires meson 1.3.2 or newer')
endif
endif
add_languages('rust', required: true)
rustc = meson.get_compiler('rust')
rust = import('rust')
if rustc.version().version_compare('< 1.76')
error('Mesa requires Rust 1.76.0 or newer')
endif
bindgen_version = find_program('bindgen').version()
if bindgen_version == 'unknown'
error('Failed to detect bindgen version. If you are using bindgen 0.69.0, ' +
'please either update to 0.69.1 or downgrade to 0.68.1. ' +
'You can install the latest version for your user with `cargo install bindgen-cli`.')
endif
if bindgen_version.version_compare('< 0.65')
error('Mesa requires bindgen 0.65 or newer. ' +
'If your distribution does not ship a recent enough version, ' +
'you can install the latest version for your user with `cargo install bindgen-cli`.')
endif
endif
with_clover_spirv = with_gallium_clover and get_option('opencl-spirv')
with_clc = with_microsoft_clc or with_intel_clc or with_gallium_asahi or with_asahi_vk or with_gallium_rusticl or with_clover_spirv
dep_clc = null_dep
if with_gallium_clover or with_clc
dep_clc = dependency('libclc')
endif
gl_pkgconfig_c_flags = []
with_glx_indirect_rendering = false
if with_platform_x11
if with_glx == 'xlib'
pre_args += '-DUSE_XSHM'
else
with_glx_indirect_rendering = true
pre_args += '-DGLX_INDIRECT_RENDERING'
if with_glx_direct
pre_args += '-DGLX_DIRECT_RENDERING'
endif
if with_dri_platform == 'drm'
pre_args += '-DGLX_USE_DRM'
elif with_dri_platform == 'apple'
pre_args += '-DGLX_USE_APPLEGL'
# Check to see if more than just the default 'swrast' is required
if (not with_gallium_softpipe) or 1 < gallium_drivers.length()
# Switch the MacOS code from "forwarding to the OpenGL.framework" mode
# and into actual Gallium Driver mode
pre_args += '-DGLX_USE_APPLE'
endif
elif with_dri_platform == 'windows'
pre_args += '-DGLX_USE_WINDOWSGL'
endif
endif
endif
with_glapi_export_proto_entry_points = false
if with_shared_glapi and not with_glx_indirect_rendering
# Imply !defined(GLX_INDIRECT_RENDERING)
with_glapi_export_proto_entry_points = true
endif
pre_args += '-DGLAPI_EXPORT_PROTO_ENTRY_POINTS=@0@'.format(with_glapi_export_proto_entry_points.to_int())
with_android_stub = get_option('android-stub')
if with_android_stub and not with_platform_android
error('`-D android-stub=true` makes no sense without `-D platforms=android`')
endif
with_libbacktrace = get_option('android-libbacktrace') \
.require(with_platform_android, error_message : '`-D android-libbacktrace=enabled` makes no sense without `-D platforms=android`') \
.disable_auto_if(not with_platform_android) \
.allowed()
if with_libbacktrace
cpp_args += '-DWITH_LIBBACKTRACE'
endif
if with_platform_android
dep_android_mapper4 = null_dep
if not with_android_stub
dep_android = [
dependency('cutils'),
dependency('hardware'),
dependency('log'),
dependency('sync'),
]
if with_libbacktrace
dep_android += dependency('backtrace')
endif
if get_option('platform-sdk-version') >= 26
dep_android += dependency('nativewindow')
endif
if get_option('platform-sdk-version') >= 30
dep_android_mapper4 = dependency('android.hardware.graphics.mapper', version : '>= 4.0', required : false)
endif
endif
pre_args += '-DANDROID_API_LEVEL=' + get_option('platform-sdk-version').to_string()
if get_option('android-strict')
pre_args += '-DANDROID_STRICT'
endif
endif
# On Android, seccomp kills the process on kernels without
# CONFIG_KCMP/CONFIG_CHECKPOINT_RESTORE if it attemps to use KCMP.
# Since we can't detect that, err on the side of caution and disable
# KCMP by default on Android.
if get_option('allow-kcmp') \
.disable_auto_if(with_platform_android) \
.allowed()
pre_args += '-DALLOW_KCMP'
endif
prog_python = import('python').find_installation('python3')
has_mako = run_command(
prog_python, '-c',
'''
try:
from packaging.version import Version
except:
from distutils.version import StrictVersion as Version
import mako
assert Version(mako.__version__) >= Version("0.8.0")
''', check: false)
if has_mako.returncode() != 0
error('Python (3.x) mako module >= 0.8.0 required to build mesa.')
endif
has_yaml = run_command(
prog_python, '-c',
'''
import yaml
''', check: false)
if has_yaml.returncode() != 0
error('Python (3.x) yaml module (PyYAML) required to build mesa.')
endif
if cc.get_id() == 'gcc' and cc.version().version_compare('< 4.4.6')
error('When using GCC, version 4.4.6 or later is required.')
endif
# Support systems without ETIME (e.g. FreeBSD)
if cc.get_define('ETIME', prefix : '#include <errno.h>') == ''
pre_args += '-DETIME=ETIMEDOUT'
endif
# Define MESA_DEBUG to 1 for debug builds only (debugoptimized is not included on this one);
# otherwise define MESA_DEBUG to 0
pre_args += '-DMESA_DEBUG=@0@'.format(with_mesa_debug.to_int())
with_split_debug = get_option('split-debug') \
.disable_if(not cc.has_argument('-gsplit-dwarf'),
error_message : 'split-debug requires compiler -gsplit-dwarf support') \
.disable_if(not cc.has_link_argument('-Wl,--gdb-index'),
error_message : 'split-debug requires the linker argument -Wl,--gdb-index')
if with_split_debug.allowed() and get_option('debug')
add_project_arguments('-gsplit-dwarf', language : ['c', 'cpp'])
add_project_link_arguments('-Wl,--gdb-index', language : ['c', 'cpp'])
endif
with_shader_cache = get_option('shader-cache') \
.require(host_machine.system() != 'windows', error_message : 'Shader Cache does not currently work on Windows') \
.allowed()
if with_shader_cache
pre_args += '-DENABLE_SHADER_CACHE'
if not get_option('shader-cache-default')
pre_args += '-DSHADER_CACHE_DISABLE_BY_DEFAULT'
endif
shader_cache_max_size = get_option('shader-cache-max-size')
if shader_cache_max_size != ''
pre_args += '-DMESA_SHADER_CACHE_MAX_SIZE="@0@"'.format(shader_cache_max_size)
endif
endif
# Check for GCC style builtins
foreach b : ['bswap32', 'bswap64', 'clz', 'clzll', 'ctz', 'expect', 'ffs',
'ffsll', 'popcount', 'popcountll', 'unreachable', 'types_compatible_p']
if cc.has_function(b)
pre_args += '-DHAVE___BUILTIN_@0@'.format(b.to_upper())
endif
endforeach
# check for GCC __attribute__
_attributes = [
'const', 'flatten', 'malloc', 'pure', 'unused', 'warn_unused_result',
'weak', 'format', 'packed', 'returns_nonnull', 'alias', 'noreturn',
'optimize',
]
foreach a : cc.get_supported_function_attributes(_attributes)
pre_args += '-DHAVE_FUNC_ATTRIBUTE_@0@'.format(a.to_upper())
endforeach
if cc.has_function_attribute('visibility:hidden')
pre_args += '-DHAVE_FUNC_ATTRIBUTE_VISIBILITY'
endif
if cc.compiles('__uint128_t foo(void) { return 0; }',
name : '__uint128_t')
pre_args += '-DHAVE_UINT128'
endif
if cc.has_function('reallocarray')
pre_args += '-DHAVE_REALLOCARRAY'
endif
if cc.has_function('fmemopen')
pre_args += '-DHAVE_FMEMOPEN'
endif
# TODO: this is very incomplete
if ['linux', 'cygwin', 'gnu', 'freebsd', 'gnu/kfreebsd', 'haiku', 'android', 'managarm'].contains(host_machine.system())
pre_args += '-D_GNU_SOURCE'
elif host_machine.system() == 'sunos'
pre_args += '-D__EXTENSIONS__'
elif host_machine.system() == 'windows'
pre_args += [
'-D_WINDOWS', '-D_WIN32_WINNT=0x0A00', '-DWINVER=0x0A00',
'-DPIPE_SUBSYSTEM_WINDOWS_USER',
'-D_USE_MATH_DEFINES', # XXX: scons didn't use this for mingw