# SPDX-License-Identifier: MIT
#
# Copyright (c) 2025, Oracle and/or its affiliates.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
#
# This is the package version number, not the shared library
# version. This version number will be substituted into Xft.h
# Please bump the minor library number at each release as well.
#
project(
'libXft',
'c',
version: '2.3.9',
license: 'HPND-sell-variant',
license_files: 'COPYING',
meson_version: '>= 1.1.0',
)
# Replacement for XORG_DEFAULT_OPTIONS
cc = meson.get_compiler('c')
if cc.has_argument('-fno-strict-aliasing')
add_project_arguments('-fno-strict-aliasing', language: 'c')
endif
# Make builds reproducible instead of embedding build paths due to use
# of __FILE__ in the assert() macro
fs = import('fs')
source_prefix_path = fs.relative_to(
meson.project_source_root(),
meson.project_build_root()
)
macro_prefix_map = '-fmacro-prefix-map=' + source_prefix_path + '/src/='
if cc.has_argument(macro_prefix_map)
add_project_arguments(macro_prefix_map, language: 'c')
endif
prog_sed = find_program('sed')
# Set library version for Xft.h from package version set above
xft_version = meson.project_version()
xft_vers_components = xft_version.split('.')
xft_vers_conf = configuration_data()
xft_vers_conf.set('XFT_MAJOR', xft_vers_components[0],
description: 'Major version of Xft')
xft_vers_conf.set('XFT_MINOR', xft_vers_components[1],
description: 'Minor version of Xft')
xft_vers_conf.set('XFT_REVISION', xft_vers_components[2],
description: 'Micro revision of Xft')
# Temporary solution to allow building with either autoconf or meson
# during the transition period - can be replaced by configure_file()
# and use of '#mesondefine' when configure.ac is removed.
xft_h = custom_target(
input: 'include/X11/Xft/Xft.h.in',
output: 'Xft.h',
command: [
prog_sed,
'-e', f's/#undef XFT_MAJOR/#define XFT_MAJOR @0@/'.format(xft_vers_conf.get('XFT_MAJOR')),
'-e', f's/#undef XFT_MINOR/#define XFT_MINOR @0@/'.format(xft_vers_conf.get('XFT_MINOR')),
'-e', f's/#undef XFT_REVISION/#define XFT_REVISION @0@/'.format(xft_vers_conf.get('XFT_REVISION')),
'@INPUT@',
],
capture: true,
install: true,
install_dir: get_option('prefix') / get_option('includedir') / 'X11/Xft'
)
# Check for Xrender
dep_xrender = dependency('xrender', required: true, version: '>= 0.8.2')
dep_libx11 = dependency('x11', required: true)
dep_xproto = dependency('xproto', required: true, version: '>= 7.0.22')
# Check freetype configuration
dep_freetype = dependency('freetype2', required: true, version: '>= 2.1.6')
# Check fontconfig configuration
dep_fontconfig = dependency('fontconfig', required: true, version: '>= 2.5.92')
libXft_sources = [
'src/xftcolor.c',
'src/xftcore.c',
'src/xftdbg.c',
'src/xftdpy.c',
'src/xftdraw.c',
'src/xftextent.c',
'src/xftfont.c',
'src/xftfreetype.c',
'src/xftglyphs.c',
'src/xftinit.c',
'src/xftlist.c',
'src/xftname.c',
'src/xftrender.c',
'src/xftstr.c',
'src/xftswap.c',
'src/xftxlfd.c'
]
lib = library(
'Xft',
libXft_sources,
include_directories: 'include/X11/Xft',
dependencies: [dep_fontconfig, dep_freetype, dep_xrender, dep_libx11,
dep_xproto],
sources: xft_h,
version: xft_version,
install: true,
)
install_headers(
'include/X11/Xft/XftCompat.h',
subdir: 'X11/Xft',
)
pkg = import('pkgconfig')
pkg.generate(
name: 'Xft',
description: 'X FreeType library',
filebase: 'xft',
libraries: '-L${libdir} -lXft',
requires: ['xproto'],
requires_private: ['xrender', 'fontconfig', 'freetype2'],
url: 'https://gitlab.freedesktop.org/xorg/lib/libxft/'
)
lib_man_suffix = get_option('lib_man_suffix')
custom_target(
input: 'man/Xft.man',
output: f'Xft.@lib_man_suffix@',
command: [
prog_sed,
'-e', f's/__libmansuffix__/@lib_man_suffix@/g',
'-e', 's/__vendorversion__/"libXft @0@" "X Version 11"/'.format(meson.project_version()),
'@INPUT@',
],
capture: true,
install: true,
install_dir: get_option('prefix') / get_option('mandir') / f'man@lib_man_suffix@',
)
shadow_man_pages = [
'XftCharExists',
'XftCharFontSpecRender',
'XftCharIndex',
'XftCharSpecRender',
'XftColorAllocName',
'XftColorAllocValue',
'XftColorFree',
'XftDefaultHasRender',
'XftDefaultSet',
'XftDefaultSubstitute',
'XftDrawChange',
'XftDrawCharFontSpec',
'XftDrawCharSpec',
'XftDrawColormap',
'XftDrawCreate',
'XftDrawCreateAlpha',
'XftDrawCreateBitmap',
'XftDrawDestroy',
'XftDrawDisplay',
'XftDrawDrawable',
'XftDrawGlyphFontSpec',
'XftDrawGlyphSpec',
'XftDrawGlyphs',
'XftDrawPicture',
'XftDrawRect',
'XftDrawSetClip',
'XftDrawSetClipRectangles',
'XftDrawSetSubwindowMode',
'XftDrawSrcPicture',
'XftDrawString16',
'XftDrawString32',
'XftDrawString8',
'XftDrawStringUtf16',
'XftDrawStringUtf8',
'XftDrawVisual',
'XftFontCheckGlyph',
'XftFontClose',
'XftFontCopy',
'XftFontInfoCreate',
'XftFontInfoDestroy',
'XftFontInfoEqual',
'XftFontInfoHash',
'XftFontLoadGlyphs',
'XftFontMatch',
'XftFontOpen',
'XftFontOpenInfo',
'XftFontOpenName',
'XftFontOpenPattern',
'XftFontOpenXlfd',
'XftFontUnloadGlyphs',
'XftGetVersion',
'XftGlyphExtents',
'XftGlyphFontSpecRender',
'XftGlyphRender',
'XftGlyphSpecRender',
'XftInit',
'XftInitFtLibrary',
'XftListFonts',
'XftLockFace',
'XftNameParse',
'XftNameUnparse',
'XftTextExtents16',
'XftTextExtents32',
'XftTextExtents8',
'XftTextExtentsUtf16',
'XftTextExtentsUtf8',
'XftTextRender16',
'XftTextRender16BE',
'XftTextRender16LE',
'XftTextRender32',
'XftTextRender32BE',
'XftTextRender32LE',
'XftTextRender8',
'XftTextRenderUtf16',
'XftTextRenderUtf8',
'XftUnlockFace',
'XftXlfdParse'
]
foreach man: shadow_man_pages
custom_target(
output: f'@man@.@lib_man_suffix@',
command: ['echo', f'.so man@lib_man_suffix@/Xft.@lib_man_suffix@'],
capture: true,
install: true,
install_dir: get_option('prefix') / get_option('mandir') / f'man@lib_man_suffix@',
)
endforeach