1de301c82Smrg# SPDX-License-Identifier: MIT
2de301c82Smrg#
3de301c82Smrg# Copyright (c) 2025, Oracle and/or its affiliates.
4de301c82Smrg#
5de301c82Smrg# Permission is hereby granted, free of charge, to any person obtaining a
6de301c82Smrg# copy of this software and associated documentation files (the "Software"),
7de301c82Smrg# to deal in the Software without restriction, including without limitation
8de301c82Smrg# the rights to use, copy, modify, merge, publish, distribute, sublicense,
9de301c82Smrg# and/or sell copies of the Software, and to permit persons to whom the
10de301c82Smrg# Software is furnished to do so, subject to the following conditions:
11de301c82Smrg#
12de301c82Smrg# The above copyright notice and this permission notice (including the next
13de301c82Smrg# paragraph) shall be included in all copies or substantial portions of the
14de301c82Smrg# Software.
15de301c82Smrg#
16de301c82Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17de301c82Smrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18de301c82Smrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19de301c82Smrg# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20de301c82Smrg# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21de301c82Smrg# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22de301c82Smrg# DEALINGS IN THE SOFTWARE.
23de301c82Smrg#
24de301c82Smrg
25de301c82Smrg#
26de301c82Smrg# This is the package version number, not the shared library
27de301c82Smrg# version.  This version number will be substituted into Xft.h
28de301c82Smrg# Please bump the minor library number at each release as well.
29de301c82Smrg#
30de301c82Smrgproject(
31de301c82Smrg  'libXft',
32de301c82Smrg  'c',
33de301c82Smrg  version: '2.3.9',
34de301c82Smrg  license: 'HPND-sell-variant',
35de301c82Smrg  license_files: 'COPYING',
36de301c82Smrg  meson_version: '>= 1.1.0',
37de301c82Smrg)
38de301c82Smrg
39de301c82Smrg# Replacement for XORG_DEFAULT_OPTIONS
40de301c82Smrgcc = meson.get_compiler('c')
41de301c82Smrgif cc.has_argument('-fno-strict-aliasing')
42de301c82Smrg  add_project_arguments('-fno-strict-aliasing', language: 'c')
43de301c82Smrgendif
44de301c82Smrg
45de301c82Smrg# Make builds reproducible instead of embedding build paths due to use
46de301c82Smrg# of __FILE__ in the assert() macro
47de301c82Smrgfs = import('fs')
48de301c82Smrgsource_prefix_path = fs.relative_to(
49de301c82Smrg    meson.project_source_root(),
50de301c82Smrg    meson.project_build_root()
51de301c82Smrg)
52de301c82Smrgmacro_prefix_map = '-fmacro-prefix-map=' + source_prefix_path + '/src/='
53de301c82Smrgif cc.has_argument(macro_prefix_map)
54de301c82Smrg  add_project_arguments(macro_prefix_map, language: 'c')
55de301c82Smrgendif
56de301c82Smrg
57de301c82Smrgprog_sed = find_program('sed')
58de301c82Smrg
59de301c82Smrg# Set library version for Xft.h from package version set above
60de301c82Smrgxft_version = meson.project_version()
61de301c82Smrgxft_vers_components = xft_version.split('.')
62de301c82Smrgxft_vers_conf = configuration_data()
63de301c82Smrgxft_vers_conf.set('XFT_MAJOR', xft_vers_components[0],
64de301c82Smrg                  description: 'Major version of Xft')
65de301c82Smrgxft_vers_conf.set('XFT_MINOR', xft_vers_components[1],
66de301c82Smrg                  description: 'Minor version of Xft')
67de301c82Smrgxft_vers_conf.set('XFT_REVISION', xft_vers_components[2],
68de301c82Smrg                  description: 'Micro revision of Xft')
69de301c82Smrg# Temporary solution to allow building with either autoconf or meson
70de301c82Smrg# during the transition period - can be replaced by configure_file()
71de301c82Smrg# and use of '#mesondefine' when configure.ac is removed.
72de301c82Smrgxft_h = custom_target(
73de301c82Smrg  input: 'include/X11/Xft/Xft.h.in',
74de301c82Smrg  output: 'Xft.h',
75de301c82Smrg  command: [
76de301c82Smrg    prog_sed,
77de301c82Smrg    '-e', f's/#undef XFT_MAJOR/#define XFT_MAJOR @0@/'.format(xft_vers_conf.get('XFT_MAJOR')),
78de301c82Smrg    '-e', f's/#undef XFT_MINOR/#define XFT_MINOR @0@/'.format(xft_vers_conf.get('XFT_MINOR')),
79de301c82Smrg    '-e', f's/#undef XFT_REVISION/#define XFT_REVISION @0@/'.format(xft_vers_conf.get('XFT_REVISION')),
80de301c82Smrg    '@INPUT@',
81de301c82Smrg  ],
82de301c82Smrg  capture: true,
83de301c82Smrg  install: true,
84de301c82Smrg  install_dir: get_option('prefix') / get_option('includedir') / 'X11/Xft'
85de301c82Smrg)
86de301c82Smrg
87de301c82Smrg
88de301c82Smrg# Check for Xrender
89de301c82Smrgdep_xrender    = dependency('xrender', required: true, version: '>= 0.8.2')
90de301c82Smrgdep_libx11     = dependency('x11', required: true)
91de301c82Smrgdep_xproto     = dependency('xproto', required: true, version: '>= 7.0.22')
92de301c82Smrg
93de301c82Smrg# Check freetype configuration
94de301c82Smrgdep_freetype   = dependency('freetype2', required: true, version: '>= 2.1.6')
95de301c82Smrg
96de301c82Smrg# Check fontconfig configuration
97de301c82Smrgdep_fontconfig = dependency('fontconfig', required: true, version: '>= 2.5.92')
98de301c82Smrg
99de301c82SmrglibXft_sources = [
100de301c82Smrg  'src/xftcolor.c',
101de301c82Smrg  'src/xftcore.c',
102de301c82Smrg  'src/xftdbg.c',
103de301c82Smrg  'src/xftdpy.c',
104de301c82Smrg  'src/xftdraw.c',
105de301c82Smrg  'src/xftextent.c',
106de301c82Smrg  'src/xftfont.c',
107de301c82Smrg  'src/xftfreetype.c',
108de301c82Smrg  'src/xftglyphs.c',
109de301c82Smrg  'src/xftinit.c',
110de301c82Smrg  'src/xftlist.c',
111de301c82Smrg  'src/xftname.c',
112de301c82Smrg  'src/xftrender.c',
113de301c82Smrg  'src/xftstr.c',
114de301c82Smrg  'src/xftswap.c',
115de301c82Smrg  'src/xftxlfd.c'
116de301c82Smrg]
117de301c82Smrg
118de301c82Smrglib = library(
119de301c82Smrg  'Xft',
120de301c82Smrg  libXft_sources,
121de301c82Smrg  include_directories: 'include/X11/Xft',
122de301c82Smrg  dependencies: [dep_fontconfig, dep_freetype, dep_xrender, dep_libx11,
123de301c82Smrg                 dep_xproto],
124de301c82Smrg  sources: xft_h,
125de301c82Smrg  version: xft_version,
126de301c82Smrg  install: true,
127de301c82Smrg)
128de301c82Smrg
129de301c82Smrginstall_headers(
130de301c82Smrg  'include/X11/Xft/XftCompat.h',
131de301c82Smrg  subdir: 'X11/Xft',
132de301c82Smrg)
133de301c82Smrg
134de301c82Smrgpkg = import('pkgconfig')
135de301c82Smrgpkg.generate(
136de301c82Smrg  name: 'Xft',
137de301c82Smrg  description: 'X FreeType library',
138de301c82Smrg  filebase: 'xft',
139de301c82Smrg  libraries: '-L${libdir} -lXft',
140de301c82Smrg  requires: ['xproto'],
141de301c82Smrg  requires_private: ['xrender', 'fontconfig', 'freetype2'],  
142de301c82Smrg  url: 'https://gitlab.freedesktop.org/xorg/lib/libxft/'
143de301c82Smrg)
144de301c82Smrg
145de301c82Smrglib_man_suffix = get_option('lib_man_suffix')
146de301c82Smrg
147de301c82Smrgcustom_target(
148de301c82Smrg  input: 'man/Xft.man',
149de301c82Smrg  output: f'Xft.@lib_man_suffix@',
150de301c82Smrg  command: [
151de301c82Smrg    prog_sed,
152de301c82Smrg    '-e', f's/__libmansuffix__/@lib_man_suffix@/g',
153de301c82Smrg    '-e', 's/__vendorversion__/"libXft @0@" "X Version 11"/'.format(meson.project_version()),
154de301c82Smrg    '@INPUT@',
155de301c82Smrg  ],
156de301c82Smrg  capture: true,
157de301c82Smrg  install: true,
158de301c82Smrg  install_dir: get_option('prefix') / get_option('mandir') / f'man@lib_man_suffix@',
159de301c82Smrg)
160de301c82Smrg
161de301c82Smrgshadow_man_pages = [
162de301c82Smrg  'XftCharExists',
163de301c82Smrg  'XftCharFontSpecRender',
164de301c82Smrg  'XftCharIndex',
165de301c82Smrg  'XftCharSpecRender',
166de301c82Smrg  'XftColorAllocName',
167de301c82Smrg  'XftColorAllocValue',
168de301c82Smrg  'XftColorFree',
169de301c82Smrg  'XftDefaultHasRender',
170de301c82Smrg  'XftDefaultSet',
171de301c82Smrg  'XftDefaultSubstitute',
172de301c82Smrg  'XftDrawChange',
173de301c82Smrg  'XftDrawCharFontSpec',
174de301c82Smrg  'XftDrawCharSpec',
175de301c82Smrg  'XftDrawColormap',
176de301c82Smrg  'XftDrawCreate',
177de301c82Smrg  'XftDrawCreateAlpha',
178de301c82Smrg  'XftDrawCreateBitmap',
179de301c82Smrg  'XftDrawDestroy',
180de301c82Smrg  'XftDrawDisplay',
181de301c82Smrg  'XftDrawDrawable',
182de301c82Smrg  'XftDrawGlyphFontSpec',
183de301c82Smrg  'XftDrawGlyphSpec',
184de301c82Smrg  'XftDrawGlyphs',
185de301c82Smrg  'XftDrawPicture',
186de301c82Smrg  'XftDrawRect',
187de301c82Smrg  'XftDrawSetClip',
188de301c82Smrg  'XftDrawSetClipRectangles',
189de301c82Smrg  'XftDrawSetSubwindowMode',
190de301c82Smrg  'XftDrawSrcPicture',
191de301c82Smrg  'XftDrawString16',
192de301c82Smrg  'XftDrawString32',
193de301c82Smrg  'XftDrawString8',
194de301c82Smrg  'XftDrawStringUtf16',
195de301c82Smrg  'XftDrawStringUtf8',
196de301c82Smrg  'XftDrawVisual',
197de301c82Smrg  'XftFontCheckGlyph',
198de301c82Smrg  'XftFontClose',
199de301c82Smrg  'XftFontCopy',
200de301c82Smrg  'XftFontInfoCreate',
201de301c82Smrg  'XftFontInfoDestroy',
202de301c82Smrg  'XftFontInfoEqual',
203de301c82Smrg  'XftFontInfoHash',
204de301c82Smrg  'XftFontLoadGlyphs',
205de301c82Smrg  'XftFontMatch',
206de301c82Smrg  'XftFontOpen',
207de301c82Smrg  'XftFontOpenInfo',
208de301c82Smrg  'XftFontOpenName',
209de301c82Smrg  'XftFontOpenPattern',
210de301c82Smrg  'XftFontOpenXlfd',
211de301c82Smrg  'XftFontUnloadGlyphs',
212de301c82Smrg  'XftGetVersion',
213de301c82Smrg  'XftGlyphExtents',
214de301c82Smrg  'XftGlyphFontSpecRender',
215de301c82Smrg  'XftGlyphRender',
216de301c82Smrg  'XftGlyphSpecRender',
217de301c82Smrg  'XftInit',
218de301c82Smrg  'XftInitFtLibrary',
219de301c82Smrg  'XftListFonts',
220de301c82Smrg  'XftLockFace',
221de301c82Smrg  'XftNameParse',
222de301c82Smrg  'XftNameUnparse',
223de301c82Smrg  'XftTextExtents16',
224de301c82Smrg  'XftTextExtents32',
225de301c82Smrg  'XftTextExtents8',
226de301c82Smrg  'XftTextExtentsUtf16',
227de301c82Smrg  'XftTextExtentsUtf8',
228de301c82Smrg  'XftTextRender16',
229de301c82Smrg  'XftTextRender16BE',
230de301c82Smrg  'XftTextRender16LE',
231de301c82Smrg  'XftTextRender32',
232de301c82Smrg  'XftTextRender32BE',
233de301c82Smrg  'XftTextRender32LE',
234de301c82Smrg  'XftTextRender8',
235de301c82Smrg  'XftTextRenderUtf16',
236de301c82Smrg  'XftTextRenderUtf8',
237de301c82Smrg  'XftUnlockFace',
238de301c82Smrg  'XftXlfdParse'
239de301c82Smrg]
240de301c82Smrg
241de301c82Smrgforeach man: shadow_man_pages
242de301c82Smrg  custom_target(
243de301c82Smrg    output: f'@man@.@lib_man_suffix@',
244de301c82Smrg    command: ['echo', f'.so man@lib_man_suffix@/Xft.@lib_man_suffix@'],
245de301c82Smrg    capture: true,
246de301c82Smrg    install: true,
247de301c82Smrg    install_dir: get_option('prefix') / get_option('mandir') / f'man@lib_man_suffix@',
248de301c82Smrg  )
249de301c82Smrgendforeach
250