Edit

IABSD.fr/xenocara/xserver/meson.build

Branch :

  • Show log

    Commit

  • Author : matthieu
    Date : 2026-05-08 11:12:08
    Hash : f0e0a48c
    Message : Update to xserver 21.1.22. The security fixes were already committed.

  • xserver/meson.build
  • project('xserver', 'c',
            default_options: [
                'buildtype=debugoptimized',
                'c_std=gnu99',
            ],
            version: '21.1.22',
            meson_version: '>= 0.47.0',
    )
    release_date = '2026-04-14'
    
    add_project_arguments('-DHAVE_DIX_CONFIG_H', language: ['c', 'objc'])
    cc = meson.get_compiler('c')
    
    add_global_arguments('-fno-strict-aliasing', language : 'c')
    add_global_arguments('-fvisibility=hidden', language : 'c')
    
    add_global_link_arguments('-fvisibility=hidden', language : 'c')
    
    if cc.get_id() == 'gcc' or cc.get_id() == 'clang'
        test_wflags = [
            '-Wall',
            '-Wpointer-arith',
            '-Wmissing-declarations',
            '-Wformat=2',
            '-Wstrict-prototypes',
            '-Wmissing-prototypes',
            '-Wnested-externs',
            '-Wbad-function-cast',
            '-Wold-style-definition',
            '-Wunused',
            '-Wuninitialized',
            '-Wshadow',
            '-Wmissing-noreturn',
            '-Wmissing-format-attribute',
            '-Wredundant-decls',
            '-Werror=implicit',
            '-Werror=nonnull',
            '-Werror=init-self',
            '-Werror=main',
            '-Werror=missing-braces',
            '-Werror=sequence-point',
            '-Werror=return-type',
            '-Werror=trigraphs',
            '-Werror=array-bounds',
            '-Werror=write-strings',
            '-Werror=address',
            '-Werror=int-to-pointer-cast',
            '-Werror=pointer-to-int-cast',
        ]
    else
        test_wflags = []
    endif
    
    common_wflags = []
    foreach wflag: test_wflags
        if cc.has_argument(wflag)
            common_wflags += [ wflag ]
        endif
    endforeach
    
    add_global_arguments(common_wflags, language : ['c', 'objc'])
    
    libdrm_req = '>= 2.4.89'
    libselinux_req = '>= 2.0.86'
    xext_req = '>= 1.0.99.4'
    wayland_req = '>= 1.5.0'
    wayland_protocols_req = '>= 1.18'
    gbm_req = '>= 10.2'
    xf86dgaproto_req = '>= 2.0.99.1'
    
    xproto_dep = dependency('xproto', version: '>= 7.0.31', fallback: ['xorgproto', 'ext_xorgproto'])
    randrproto_dep = dependency('randrproto', version: '>= 1.6.0', fallback: ['xorgproto', 'ext_xorgproto'])
    renderproto_dep = dependency('renderproto', version: '>= 0.11', fallback: ['xorgproto', 'ext_xorgproto'])
    xextproto_dep = dependency('xextproto', version: '>= 7.2.99.901', fallback: ['xorgproto', 'ext_xorgproto'])
    inputproto_dep = dependency('inputproto', version: '>= 2.3.99.1', fallback: ['xorgproto', 'ext_xorgproto'])
    kbproto_dep = dependency('kbproto', version: '>= 1.0.3', fallback: ['xorgproto', 'ext_xorgproto'])
    fontsproto_dep = dependency('fontsproto', version: '>= 2.1.3', fallback: ['xorgproto', 'ext_xorgproto'])
    fixesproto_dep = dependency('fixesproto', version: '>= 6.0', fallback: ['xorgproto', 'ext_xorgproto'])
    damageproto_dep = dependency('damageproto', version: '>= 1.1', fallback: ['xorgproto', 'ext_xorgproto'])
    xcmiscproto_dep = dependency('xcmiscproto', version: '>= 1.2.0', fallback: ['xorgproto', 'ext_xorgproto'])
    bigreqsproto_dep = dependency('bigreqsproto', version: '>= 1.1.0', fallback: ['xorgproto', 'ext_xorgproto'])
    xtrans_dep = dependency('xtrans', version: '>= 1.3.5')
    
    videoproto_dep = dependency('videoproto', fallback: ['xorgproto', 'ext_xorgproto'])
    compositeproto_dep = dependency('compositeproto', version: '>= 0.4', fallback: ['xorgproto', 'ext_xorgproto'])
    recordproto_dep = dependency('recordproto', version: '>= 1.13.99.1', fallback: ['xorgproto', 'ext_xorgproto'])
    scrnsaverproto_dep = dependency('scrnsaverproto', version: '>= 1.1', fallback: ['xorgproto', 'ext_xorgproto'])
    resourceproto_dep = dependency('resourceproto', version: '>= 1.2.0', fallback: ['xorgproto', 'ext_xorgproto'])
    xf86driproto_dep = dependency('xf86driproto', version: '>= 2.1.0', fallback: ['xorgproto', 'ext_xorgproto'], required: get_option('dri1') == 'true')
    dri2proto_dep = dependency('dri2proto', version: '>= 2.8', fallback: ['xorgproto', 'ext_xorgproto'], required: get_option('dri2') == 'true')
    dri3proto_dep = dependency('dri3proto', version: '>= 1.2', fallback: ['xorgproto', 'ext_xorgproto'], required: get_option('dri3') == 'true')
    xineramaproto_dep = dependency('xineramaproto', fallback: ['xorgproto', 'ext_xorgproto'])
    xf86bigfontproto_dep = dependency('xf86bigfontproto', version: '>= 1.2.0', fallback: ['xorgproto', 'ext_xorgproto'], required: get_option('xf86bigfont'))
    xf86vidmodeproto_dep = dependency('xf86vidmodeproto', version: '>= 2.2.99.1', fallback: ['xorgproto', 'ext_xorgproto'])
    applewmproto_dep = dependency('applewmproto', version: '>= 1.4', fallback: ['xorgproto', 'ext_xorgproto'], required: false)
    xshmfence_dep = dependency('xshmfence', version: '>= 1.1', required: false)
    
    pixman_dep = dependency('pixman-1')
    libbsd_dep = dependency('libbsd-overlay', required: false)
    xkbcomp_dep = dependency('xkbcomp', required: false)
    xkbfile_dep = dependency('xkbfile')
    xfont2_dep = dependency('xfont2', version: '>= 2.0')
    
    dbus_required = get_option('systemd_logind') == 'true'
    dbus_dep = dependency('dbus-1', version: '>= 1.0', required: dbus_required)
    
    # libsystemd-daemon was moved into libsystemd in version 209
    libsystemd_daemon_dep = dependency('libsystemd', version: '>= 209', required: false)
    if not libsystemd_daemon_dep.found()
        libsystemd_daemon_dep = dependency('libsystemd-daemon', required: false)
    endif
    
    build_hashtable = false
    
    # Resolve default values of some options
    xkb_dir = get_option('xkb_dir')
    if xkb_dir == ''
        if xkbcomp_dep.found() and xkbcomp_dep.type_name() == 'pkgconfig'
            xkb_dir = xkbcomp_dep.get_pkgconfig_variable('xkbconfigdir')
        endif
        if xkb_dir == ''
            xkb_dir = join_paths(get_option('prefix'), 'share/X11/xkb')
        endif
    endif
    
    xkb_output_dir = get_option('xkb_output_dir')
    if xkb_output_dir == ''
        xkb_output_dir = join_paths(xkb_dir, 'compiled')
    endif
    
    xkb_bin_dir = get_option('xkb_bin_dir')
    if xkb_bin_dir == ''
        if xkbcomp_dep.found() and xkbcomp_dep.type_name() == 'pkgconfig'
            xkb_bin_dir = xkbcomp_dep.get_pkgconfig_variable('bindir')
        endif
        if xkb_bin_dir == ''
            xkb_bin_dir = join_paths(get_option('prefix'), get_option('bindir'))
        endif
    endif
    
    dfp = get_option('default_font_path')
    if dfp == ''
        fontutil_dep = dependency('fontutil')
        fontrootdir = fontutil_dep.get_pkgconfig_variable('fontrootdir')
        dfp_elements = [
            join_paths(fontrootdir, 'misc'),
            join_paths(fontrootdir, 'TTF'),
            join_paths(fontrootdir, 'OTF'),
            join_paths(fontrootdir, 'Type1'),
            join_paths(fontrootdir, '100dpi'),
            join_paths(fontrootdir, '75dpi'),
        ]
        if host_machine.system() == 'darwin'
           dfp_elements += [
           '/Library/Fonts',
           '/System/Library/Fonts',
        ]
        endif
        default_font_path = ','.join(dfp_elements)
    else
        default_font_path = dfp
    endif
    
    hal_option = get_option('hal')
    glamor_option = get_option('glamor')
    
    build_udev = get_option('udev')
    build_udev_kms = get_option('udev_kms')
    if ['windows',  'darwin', 'cygwin'].contains(host_machine.system())
        build_udev = false
        build_udev_kms = false
        hal_option = 'false'
    endif
    
    if get_option('systemd_logind') == 'auto'
        build_systemd_logind = build_udev_kms and dbus_dep.found()
    else
        build_systemd_logind = get_option('systemd_logind') == 'true'
    endif
    
    with_dtrace = get_option('dtrace')
    if with_dtrace
        dtrace = find_program('dtrace', required: true)
    endif
    
    build_xorg = false
    if (host_machine.system() != 'windows')
        if get_option('xorg') == 'auto'
            build_xorg = (host_machine.system() != 'darwin' and
                          host_machine.system() != 'windows')
        else
            build_xorg = get_option('xorg') == 'true'
        endif
    endif
    xorgsdkdir = join_paths(get_option('prefix'), get_option('includedir'), 'xorg')
    libxcvt_dep = dependency('libxcvt', required: build_xorg)
    
    build_xnest = false
    if (host_machine.system() != 'windows')
        if get_option('xnest') != 'false'
            xnest_required = get_option('xnest') == 'true'
    
            xnest_dep = [
                dependency('xext', version: xext_req, required: xnest_required),
                dependency('x11', required: xnest_required),
                dependency('xau', required: xnest_required),
            ]
    
            build_xnest = true
            # check for all the deps being found, to handle 'auto' mode.
            foreach d: xnest_dep
                if not d.found()
                    build_xnest = false
                endif
            endforeach
        endif
    endif
    
    build_xwin = false
    if get_option('xwin') == 'auto'
        if (host_machine.system() == 'cygwin' or
            host_machine.system() == 'windows')
                build_xwin = true
        endif
    else
        build_xwin = get_option('xwin') == 'true'
    endif
    
    build_xquartz = false
    if get_option('xquartz') == 'auto'
        if host_machine.system() == 'darwin'
                build_xquartz = true
        endif
    else
        build_xquartz = get_option('xquartz') == 'true'
    endif
    
    build_rootless = false
    if build_xquartz
        build_rootless = true
    endif
    
    if get_option('ipv6') == 'auto'
        build_ipv6 = cc.has_function('getaddrinfo')
    else
        build_ipv6 = get_option('ipv6') == 'true'
    endif
    
    int10 = get_option('int10')
    if int10 == 'auto'
        int10 = 'x86emu'
        if host_machine.cpu() == 'powerpc' and host_machine.system() == 'freebsd'
            int10 = 'stub'
        endif
        if host_machine.cpu() == 'arm'
            int10 = 'stub'
        endif
    endif
    
    hal_dep = []
    if hal_option == 'auto'
        if not build_udev
            hal_dep = dependency('hal', required: false)
            build_hal = hal_dep.found()
        else
            build_hal = false
        endif
    else
        build_hal = hal_option == 'true'
        if build_hal
            hal_dep = dependency('hal')
        endif
    endif
    
    if build_udev and build_hal
        error('Hotplugging through both libudev and hal not allowed')
    endif
    
    build_dbus = build_hal or build_systemd_logind
    
    udev_dep = dependency('', required:false)
    if build_udev or build_udev_kms
        udev_dep = dependency('libudev', version: '>= 143')
    endif
    
    log_dir = get_option('log_dir')
    if log_dir == ''
        log_dir = join_paths(get_option('prefix'), get_option('localstatedir'), 'log')
    endif
    
    module_dir = join_paths(get_option('libdir'), get_option('module_dir'))
    
    if glamor_option == 'auto'
        build_glamor = build_xorg
    else
        build_glamor = glamor_option == 'true'
    endif
    
    gbm_dep = dependency('', required: false)
    epoxy_dep = dependency('', required: false)
    if build_glamor
        gbm_dep = dependency('gbm', version: gbm_req, required: false)
        epoxy_dep = dependency('epoxy', required: false)
    endif
    
    # Lots of sha1 options, because Linux is about choice :)
    
    # The idea behind the ordering here is that we should first prefer system
    # builtin providers, and then smaller implementations of over larger ones.
    test_sha1 = [
        'libc',          # libmd API is in libc on some BSDs
        'CommonCrypto',  # darwin API
        'CryptoAPI',     # windows API
        'libmd',         # other BSDs & Solaris
        'libsha1',       # "a tiny library providing a SHA1 implementation, created for facilitating X server compilation on embedded devices where larger libraries containing SHA1 implementations are not needed"
        'libnettle',
        'libgcrypt',     # in debian base system
        'libcrypto',
    ]
    
    if get_option('sha1') != 'auto'
        test_sha1 = [get_option('sha1')]
    endif
    
    sha1_found = false
    foreach t : test_sha1
        if t == 'libc'
            if cc.has_function('SHA1Init')
                sha1_found = true
                sha1_dep = dependency('', required: false)
            endif
        elif t == 'CommonCrypto'
            if cc.has_function('CC_SHA1_Init')
                sha1_found = true
                sha1_dep = dependency('', required: false)
            endif
        elif t == 'CryptoAPI'
            if cc.has_header('wincrypt.h')
                sha1_found = true
                sha1_dep = dependency('', required: false)
            endif
        elif t == 'libmd'
            md_dep = cc.find_library('md', required: false)
            if md_dep.found()
                sha1_found = true
                sha1_dep = md_dep
            endif
        elif t == 'libsha1'
            libsha1_dep = dependency('libsha1', required: false)
            if libsha1_dep.found()
                sha1_found = true
                sha1_dep = libsha1_dep
            endif
        elif t == 'libnettle'
            nettle_dep = dependency('nettle', version: '>= 2.6', required: false)
            if nettle_dep.found()
                sha1_found = true
                sha1_dep = nettle_dep
            endif
        elif t == 'libgcrypt'
            gcrypt_dep = dependency('libgcrypt', required: false)
            if gcrypt_dep.found()
                sha1_found = true
                sha1_dep = gcrypt_dep
            endif
        elif t == 'libcrypto'
            # we don't need all of OpenSSL, just libcrypto
            libcrypto_dep = cc.find_library('crypto', required: false)
            openssl_dep = dependency('openssl', required: false)
            if libcrypto_dep.found() or openssl_dep.found()
                sha1_found = true
                if libcrypto_dep.found()
                   sha1_dep = libcrypto_dep
                else
                   sha1_dep = openssl_dep
                endif
            endif
        endif
    
        if sha1_found
            sha1 = t
            break
        endif
    endforeach
    
    if sha1_found
        message('Using @0@ SHA1 functions'.format(sha1))
    else
        if get_option('sha1') != 'auto'
            error('@0@ SHA1 requested, but not found'.format(get_option('sha1')))
        else
            error('No suitable SHA1 implementation found')
        endif
    endif
    
    xdmcp_dep = dependency('', required : false)
    if get_option('xdmcp')
        xdmcp_dep = dependency('xdmcp')
    endif
    
    has_xdm_auth = get_option('xdm-auth-1')
    
    if not xdmcp_dep.found()
      has_xdm_auth = false
    endif
    
    build_glx = get_option('glx')
    if build_glx
        build_hashtable = true
    endif
    
    libdrm_dep = dependency('libdrm', version: libdrm_req, required: false)
    
    if get_option('dri1') == 'auto'
        build_dri1 = xf86driproto_dep.found() and libdrm_dep.found()
    else
        build_dri1 = get_option('dri1') == 'true'
    endif
    
    if get_option('dri2') == 'auto'
        build_dri2 = dri2proto_dep.found() and libdrm_dep.found()
    else
        build_dri2 = get_option('dri2') == 'true'
    endif
    
    if get_option('dri3') == 'auto'
        build_dri3 = dri3proto_dep.found() and xshmfence_dep.found() and libdrm_dep.found()
    else
        build_dri3 = get_option('dri3') == 'true'
        if build_dri3
           if not xshmfence_dep.found()
               error('DRI3 requested, but xshmfence not found')
           endif
        endif
    endif
    
    libdrm_required = (build_dri1 or build_dri2 or build_dri3) and get_option('drm') == true
    if not libdrm_dep.found() and libdrm_required
        error('DRI requested, but LIBDRM not found')
    endif
    
    build_modesetting = libdrm_dep.found() and dri2proto_dep.found()
    
    build_vgahw = false
    if get_option('vgahw') == 'auto'
        if (host_machine.system() != 'darwin' and
            host_machine.system() != 'windows' and
            host_machine.system() != 'cygwin')
            build_vgahw = true
        endif
    else
        build_vgahw = get_option('vgahw') == 'true'
    endif
    
    build_dpms = get_option('dpms')
    if build_xquartz
        build_dpms = false
    endif
    
    build_xf86bigfont = get_option('xf86bigfont')
    build_screensaver = get_option('screensaver')
    build_res = get_option('xres')
    if build_res
        build_hashtable = true
    endif
    
    build_xace = get_option('xace')
    build_xinerama = get_option('xinerama')
    
    build_xsecurity = get_option('xcsecurity')
    if build_xsecurity
        if not build_xace
            error('cannot build Security extension without X-ACE')
        endif
    endif
    
    build_xv = get_option('xv')
    build_xvmc = get_option('xvmc')
    if not build_xv
        build_xvmc = false
    endif
    
    build_dga = false
    xf86dgaproto_dep = dependency('', required: false)
    if get_option('dga') == 'auto'
        xf86dgaproto_dep = dependency('xf86dgaproto', version: xf86dgaproto_req, required: false)
        if xf86dgaproto_dep.found()
            build_dga = true
        endif
    elif get_option('dga') == 'true'
        xf86dgaproto_dep = dependency('xf86dgaproto', version: xf86dgaproto_req, required: true)
        build_dga = true
    endif
    
    build_apm = false
    if (get_option('linux_apm') == true and
       host_machine.system() == 'linux')
        if cc.has_header('linux/apm_bios.h')
            build_apm = true
        endif
    endif
    
    build_acpi = false
    if (get_option('linux_acpi') == true and
       host_machine.system() == 'linux')
        if (host_machine.cpu() == 'x86' or
           host_machine.cpu() == 'x86_64' or
           host_machine.cpu() == 'ia64')
            build_acpi = true
        endif
    endif
    
    build_mitshm = false
    if get_option('mitshm') == 'auto'
        build_mitshm = cc.has_header('sys/shm.h')
    elif get_option('mitshm') == 'true'
        build_mitshm = true
    endif
    
    m_dep = cc.find_library('m', required : false)
    dl_dep = cc.find_library('dl', required : false)
    
    common_dep = [
        xproto_dep,
        randrproto_dep,
        renderproto_dep,
        xextproto_dep,
        inputproto_dep,
        kbproto_dep,
        fontsproto_dep,
        fixesproto_dep,
        damageproto_dep,
        xcmiscproto_dep,
        bigreqsproto_dep,
        xtrans_dep,
        libsystemd_daemon_dep,
    
        videoproto_dep,
        compositeproto_dep,
        recordproto_dep,
        scrnsaverproto_dep,
        resourceproto_dep,
        xf86driproto_dep,
        dri2proto_dep,
        dri3proto_dep,
        xineramaproto_dep,
        xf86bigfontproto_dep,
        xf86dgaproto_dep,
        xf86vidmodeproto_dep,
        applewmproto_dep,
    
        pixman_dep,
        libbsd_dep,
        xkbfile_dep,
        xfont2_dep,
        xdmcp_dep,
    ]
    
    inc = include_directories(
        'Xext',
        'Xi',
        'composite',
        'damageext',
        'exa',
        'fb',
        'glamor',
        'mi',
        'miext/damage',
        'miext/shadow',
        'miext/sync',
        'dbe',
        'dri3',
        'include',
        'present',
        'randr',
        'render',
        'xfixes',
    )
    
    build_xselinux = false
    if get_option('xselinux') != 'false'
        dep_selinux = dependency('libselinux', version: libselinux_req,
    			     required: get_option('xselinux') == 'true')
        dep_audit = dependency('audit', required: get_option('xselinux') == 'true')
        if get_option('xselinux') == 'true'
            build_xselinux = true
        else
            build_xselinux = dep_selinux.found() and dep_audit.found() and build_xace
        endif
    
        if build_xselinux
            common_dep += dep_selinux
            common_dep += dep_audit
        endif
    endif
    if build_xselinux and not build_xace
        error('cannot build SELinux extension without X-ACE')
    endif
    
    
    socket_dep = []
    if host_machine.system() == 'windows'
        socket_dep = meson.get_compiler('c').find_library('ws2_32')
        common_dep += socket_dep
    endif
    
    if get_option('libunwind')
        common_dep += dependency('libunwind', required: true)
    endif
    
    glx_inc = include_directories('glx')
    
    top_dir_inc = include_directories('.')
    
    serverconfigdir = join_paths(get_option('prefix'), get_option('libdir'), 'xorg')
    
    manpage_config = configuration_data()
    manpage_config.set('vendorversion', '"xorg-server @0@" "X Version 11"'.format(meson.project_version()))
    manpage_config.set('xorgversion', '"xorg-server @0@" "X Version 11"'.format(meson.project_version()))
    manpage_config.set('xservername', 'Xorg')
    manpage_config.set('xconfigfile', 'xorg.conf')
    manpage_config.set('projectroot', get_option('prefix'))
    manpage_config.set('apploaddir', '$(appdefaultdir)')
    manpage_config.set('appmansuffix', '1')
    manpage_config.set('drivermansuffix', '4')
    manpage_config.set('adminmansuffix', '8')
    manpage_config.set('libmansuffix', '3')
    manpage_config.set('miscmansuffix', '7')
    manpage_config.set('filemansuffix', '5')
    manpage_config.set('logdir', log_dir)
    manpage_config.set('datadir', join_paths(get_option('prefix'), get_option('datadir')))
    manpage_config.set('mandir', join_paths(get_option('prefix'), get_option('mandir')))
    manpage_config.set('sysconfdir', join_paths(get_option('prefix'), get_option('sysconfdir')))
    manpage_config.set('xconfigdir', 'xorg.conf.d')
    manpage_config.set('xkbdir', xkb_dir)
    manpage_config.set('XKB_DFLT_RULES', get_option('xkb_default_rules'))
    manpage_config.set('XKB_DFLT_MODEL', get_option('xkb_default_model'))
    manpage_config.set('XKB_DFLT_LAYOUT', get_option('xkb_default_layout'))
    manpage_config.set('XKB_DFLT_VARIANT', get_option('xkb_default_variant'))
    manpage_config.set('XKB_DFLT_OPTIONS', get_option('xkb_default_options'))
    manpage_config.set('bundle_id_prefix', '...')
    manpage_config.set('modulepath', module_dir)
    # wtf doesn't this work
    # manpage_config.set('suid_wrapper_dir', join_paths(get_option('prefix'), libexecdir))
    manpage_config.set('suid_wrapper_dir', join_paths(get_option('prefix'), 'libexec'))
    manpage_config.set('default_font_path', default_font_path)
    
    require_docs = get_option('docs') == 'true'
    require_devel_docs = get_option('devel-docs') == 'true'
    require_docs_pdf = (require_docs or require_devel_docs) and get_option('docs-pdf') == 'true'
    
    sgml_doctools_dep = dependency('xorg-sgml-doctools',
                                   required: require_docs or require_devel_docs)
    xmlto = find_program('xmlto', required: require_docs or require_devel_docs)
    xsltproc = find_program('xsltproc', required: require_docs or require_devel_docs)
    fop = find_program('fop', required: require_docs_pdf)
    
    build_docs = (get_option('docs') != 'false' and
        sgml_doctools_dep.found() and
        xmlto.found())
    
    build_docs_devel = (get_option('devel-docs') != 'false' and
        sgml_doctools_dep.found() and
        xmlto.found())
    
    build_docs_pdf = (get_option('docs-pdf') != 'false' and
        (build_docs or build_docs_devel) and
        fop.found())
    
    if build_docs or build_docs_devel
        doc_sgml_path = sgml_doctools_dep.get_pkgconfig_variable('sgmlrootdir')
        doc_stylesheet_srcdir = join_paths(doc_sgml_path, 'X11')
    
        # once we bump meson dependency to 0.56.0 we can use
        # meson.project_build_root() instead of meson.build_root()
    
        # Meson does not and will not support functions so we are copy-pasting
        # documentation build code around which is unfortunate
        # See https://mesonbuild.com/FAQ.html#why-doesnt-meson-have-user-defined-functionsmacros
    
        docs_xmlto_search_flags = [
            '--searchpath', doc_stylesheet_srcdir,
            '--searchpath', meson.build_root(),
        ]
    
        docs_xslt_search_flags = [
            '--path', doc_stylesheet_srcdir,
            '--path', meson.build_root(),
        ]
    endif
    
    # Include must come first, as it sets up dix-config.h
    subdir('include')
    
    # X server core
    subdir('config')
    subdir('dix')
    subdir('dri3')
    subdir('glx')
    subdir('fb')
    subdir('mi')
    subdir('os')
    # X extensions
    subdir('composite')
    subdir('damageext')
    subdir('dbe')
    subdir('miext/damage')
    subdir('miext/shadow')
    subdir('miext/sync')
    if build_rootless
        subdir('miext/rootless')
    endif
    subdir('present')
    if build_xwin or build_xquartz
        subdir('pseudoramiX')
    endif
    subdir('randr')
    subdir('record')
    subdir('render')
    subdir('xfixes')
    subdir('xkb')
    subdir('Xext')
    subdir('Xi')
    # other
    if build_glamor
        subdir('glamor')
    endif
    if build_xorg or get_option('xephyr')
        subdir('exa')
    endif
    subdir('doc')
    
    # Common static libraries of all X servers
    libxserver = [
        libxserver_mi,
        libxserver_dix,
    
        libxserver_composite,
        libxserver_damageext,
        libxserver_dbe,
        libxserver_randr,
        libxserver_miext_damage,
        libxserver_render,
        libxserver_present,
        libxserver_xext,
        libxserver_miext_sync,
        libxserver_xfixes,
        libxserver_xi,
        libxserver_xkb,
        libxserver_record,
    
        libxserver_os,
    ]
    
    libxserver += libxserver_dri3
    
    subdir('hw')
    
    if host_machine.system() != 'windows'
        subdir('test')
    endif
    
    install_man(configure_file(
        input: 'man/Xserver.man',
        output: 'Xserver.1',
        configuration: manpage_config,
    ))
    
    if build_xorg
        sdkconfig = configuration_data()
        awk = find_program('awk')
    
        sdkconfig.set('prefix', get_option('prefix'))
        sdkconfig.set('exec_prefix', '${prefix}')
        sdkconfig.set('libdir', join_paths('${exec_prefix}', get_option('libdir')))
        sdkconfig.set('includedir', join_paths('${prefix}', get_option('includedir')))
        sdkconfig.set('datarootdir', join_paths('${prefix}', get_option('datadir')))
        sdkconfig.set('moduledir', join_paths('${exec_prefix}', module_dir))
        sdkconfig.set('sdkdir', join_paths('${prefix}', get_option('includedir'), 'xorg'))
        sdkconfig.set('sysconfigdir', join_paths('${datarootdir}', 'X11/xorg.conf.d'))
    
        sdkconfig.set('abi_ansic',
            run_command(awk, '-F', '[(,)]',
                        '/^#define ABI_ANSIC.*SET/ { printf "%d.%d", $2, $3 }',
                        files('hw/xfree86/common/xf86Module.h')
            ).stdout()
        )
        sdkconfig.set('abi_videodrv',
            run_command(awk, '-F', '[(,)]',
                        '/^#define ABI_VIDEODRV.*SET/ { printf "%d.%d", $2, $3 }',
                        files('hw/xfree86/common/xf86Module.h')
            ).stdout()
        )
        sdkconfig.set('abi_xinput',
            run_command(awk, '-F', '[(,)]',
                        '/^#define ABI_XINPUT.*SET/ { printf "%d.%d", $2, $3 }',
                        files('hw/xfree86/common/xf86Module.h')
            ).stdout()
        )
        sdkconfig.set('abi_extension',
            run_command(awk, '-F', '[(,)]',
                        '/^#define ABI_EXTENSION.*SET/ { printf "%d.%d", $2, $3 }',
                        files('hw/xfree86/common/xf86Module.h')
            ).stdout()
        )
    
        sdk_required_modules = [
          'pixman-1 >= 0.27.2',
        ]
    
        # XXX this isn't trying very hard, but hard enough.
        sdkconfig.set('PACKAGE_VERSION', meson.project_version())
        sdkconfig.set('SDK_REQUIRED_MODULES', ' '.join(sdk_required_modules))
        sdkconfig.set('symbol_visibility', '-fvisibility=hidden')
        sdkconfig.set('XORG_DRIVER_LIBS', '')
    
        configure_file(
            input: 'xorg-server.pc.in',
            output: 'xorg-server.pc',
            configuration: sdkconfig,
            install_dir: join_paths(get_option('prefix'),
                                    get_option('libdir'),
                                    'pkgconfig'),
        )
    
        install_data('xorg-server.m4',
                     install_dir: join_paths(get_option('datadir'), 'aclocal'))
    endif
    
    if build_docs or build_docs_devel
        docxmlconfig = configuration_data()
        docxmlconfig.set('PACKAGE_VERSION', meson.project_version())
        docxmlconfig.set('RELEASE_DATE', release_date)
        configure_file(
            input: 'xserver.ent.in',
            output: 'xserver.ent',
            configuration: docxmlconfig
        )
    endif