xref: /aosp_15_r20/external/wayland/src/meson.build (revision 84e872a0dc482bffdb63672969dd03a827d67c73)
1*84e872a0SLloyd Piqueif not (get_option('scanner') or get_option('libraries'))
2*84e872a0SLloyd Pique	error('Either -Dscanner=true or -Dlibraries=true is required')
3*84e872a0SLloyd Piqueendif
4*84e872a0SLloyd Pique
5*84e872a0SLloyd Piquewayland_version_h = configuration_data()
6*84e872a0SLloyd Piquewayland_version_h.set('WAYLAND_VERSION', meson.project_version())
7*84e872a0SLloyd Piquewayland_version_h.set('WAYLAND_VERSION_MAJOR', wayland_version[0].to_int())
8*84e872a0SLloyd Piquewayland_version_h.set('WAYLAND_VERSION_MINOR', wayland_version[1].to_int())
9*84e872a0SLloyd Piquewayland_version_h.set('WAYLAND_VERSION_MICRO', wayland_version[2].to_int())
10*84e872a0SLloyd Piqueconfigure_file(
11*84e872a0SLloyd Pique	input: 'wayland-version.h.in',
12*84e872a0SLloyd Pique	output: 'wayland-version.h',
13*84e872a0SLloyd Pique	configuration: wayland_version_h,
14*84e872a0SLloyd Pique	install: get_option('libraries'),
15*84e872a0SLloyd Pique	install_dir: join_paths(get_option('prefix'), get_option('includedir'))
16*84e872a0SLloyd Pique)
17*84e872a0SLloyd Pique
18*84e872a0SLloyd Pique
19*84e872a0SLloyd Piquewayland_util = static_library(
20*84e872a0SLloyd Pique	'wayland-util',
21*84e872a0SLloyd Pique	sources: 'wayland-util.c'
22*84e872a0SLloyd Pique)
23*84e872a0SLloyd Pique
24*84e872a0SLloyd Piquewayland_util_dep = declare_dependency(
25*84e872a0SLloyd Pique	link_with: wayland_util,
26*84e872a0SLloyd Pique	include_directories: include_directories('.')
27*84e872a0SLloyd Pique)
28*84e872a0SLloyd Pique
29*84e872a0SLloyd Piqueif get_option('scanner')
30*84e872a0SLloyd Pique	# wayland-scanner
31*84e872a0SLloyd Pique
32*84e872a0SLloyd Pique	scanner_deps = [ dependency('expat') ]
33*84e872a0SLloyd Pique	scanner_args = [ '-include', 'config.h' ]
34*84e872a0SLloyd Pique
35*84e872a0SLloyd Pique	if get_option('dtd_validation')
36*84e872a0SLloyd Pique		scanner_deps += dependency('libxml-2.0')
37*84e872a0SLloyd Pique		scanner_args += '-DHAVE_LIBXML=1'
38*84e872a0SLloyd Pique	endif
39*84e872a0SLloyd Pique
40*84e872a0SLloyd Pique	prog_embed = find_program('embed.py', native: true)
41*84e872a0SLloyd Pique
42*84e872a0SLloyd Pique	embed_dtd = custom_target(
43*84e872a0SLloyd Pique		'wayland.dtd.h',
44*84e872a0SLloyd Pique		input: '../protocol/wayland.dtd',
45*84e872a0SLloyd Pique		output: 'wayland.dtd.h',
46*84e872a0SLloyd Pique		command: [ prog_embed, '@INPUT@', 'wayland_dtd' ],
47*84e872a0SLloyd Pique		capture: true
48*84e872a0SLloyd Pique	)
49*84e872a0SLloyd Pique
50*84e872a0SLloyd Pique	wayland_scanner_sources = [ 'scanner.c', embed_dtd ]
51*84e872a0SLloyd Pique	wayland_scanner_includes = [ root_inc, protocol_inc ]
52*84e872a0SLloyd Pique
53*84e872a0SLloyd Pique	wayland_scanner = executable(
54*84e872a0SLloyd Pique		'wayland-scanner',
55*84e872a0SLloyd Pique		wayland_scanner_sources,
56*84e872a0SLloyd Pique		c_args: scanner_args,
57*84e872a0SLloyd Pique		include_directories: wayland_scanner_includes,
58*84e872a0SLloyd Pique		dependencies: [ scanner_deps, wayland_util_dep, ],
59*84e872a0SLloyd Pique		install: true
60*84e872a0SLloyd Pique	)
61*84e872a0SLloyd Pique
62*84e872a0SLloyd Pique	pkgconfig.generate(
63*84e872a0SLloyd Pique		name: 'Wayland Scanner',
64*84e872a0SLloyd Pique		description: 'Wayland scanner',
65*84e872a0SLloyd Pique		version: meson.project_version(),
66*84e872a0SLloyd Pique		variables: [
67*84e872a0SLloyd Pique			'datarootdir=' + join_paths('${prefix}', get_option('datadir')),
68*84e872a0SLloyd Pique			'pkgdatadir=' + join_paths('${datarootdir}', meson.project_name()),
69*84e872a0SLloyd Pique			'bindir=' + join_paths('${prefix}', get_option('bindir')),
70*84e872a0SLloyd Pique			'wayland_scanner=${bindir}/wayland-scanner'
71*84e872a0SLloyd Pique		],
72*84e872a0SLloyd Pique		filebase: 'wayland-scanner'
73*84e872a0SLloyd Pique	)
74*84e872a0SLloyd Pique
75*84e872a0SLloyd Pique	if meson.can_run_host_binaries()
76*84e872a0SLloyd Pique		meson.override_find_program('wayland-scanner', wayland_scanner)
77*84e872a0SLloyd Pique	endif
78*84e872a0SLloyd Piqueendif
79*84e872a0SLloyd Pique
80*84e872a0SLloyd Piqueif meson.is_cross_build() or not get_option('scanner')
81*84e872a0SLloyd Pique	scanner_dep = dependency('wayland-scanner', native: true, version: meson.project_version())
82*84e872a0SLloyd Pique	wayland_scanner_for_build = find_program(scanner_dep.get_variable(pkgconfig: 'wayland_scanner'))
83*84e872a0SLloyd Piqueelse
84*84e872a0SLloyd Pique	wayland_scanner_for_build = wayland_scanner
85*84e872a0SLloyd Piqueendif
86*84e872a0SLloyd Pique
87*84e872a0SLloyd Piqueif get_option('libraries')
88*84e872a0SLloyd Pique	# wayland libraries
89*84e872a0SLloyd Pique
90*84e872a0SLloyd Pique	mathlib_dep = cc.find_library('m', required: false)
91*84e872a0SLloyd Pique	threads_dep = dependency('threads', required: false)
92*84e872a0SLloyd Pique
93*84e872a0SLloyd Pique	wayland_private = static_library(
94*84e872a0SLloyd Pique		'wayland-private',
95*84e872a0SLloyd Pique		sources: [
96*84e872a0SLloyd Pique			'connection.c',
97*84e872a0SLloyd Pique			'wayland-os.c'
98*84e872a0SLloyd Pique		],
99*84e872a0SLloyd Pique		dependencies: [ epoll_dep, ffi_dep, rt_dep ]
100*84e872a0SLloyd Pique	)
101*84e872a0SLloyd Pique
102*84e872a0SLloyd Pique	wayland_private_dep = declare_dependency(
103*84e872a0SLloyd Pique		link_with: wayland_private,
104*84e872a0SLloyd Pique		include_directories: include_directories('.')
105*84e872a0SLloyd Pique	)
106*84e872a0SLloyd Pique
107*84e872a0SLloyd Pique	generated_headers = [
108*84e872a0SLloyd Pique		{
109*84e872a0SLloyd Pique			'scanner_args': ['server-header'],
110*84e872a0SLloyd Pique			'output': 'wayland-server-protocol.h',
111*84e872a0SLloyd Pique			'install': true,
112*84e872a0SLloyd Pique		},
113*84e872a0SLloyd Pique		{
114*84e872a0SLloyd Pique			'scanner_args': ['server-header', '-c'],
115*84e872a0SLloyd Pique			'output': 'wayland-server-protocol-core.h',
116*84e872a0SLloyd Pique			'install': false,
117*84e872a0SLloyd Pique		},
118*84e872a0SLloyd Pique		{
119*84e872a0SLloyd Pique			'scanner_args': ['client-header'],
120*84e872a0SLloyd Pique			'output': 'wayland-client-protocol.h',
121*84e872a0SLloyd Pique			'install': true,
122*84e872a0SLloyd Pique		},
123*84e872a0SLloyd Pique		{
124*84e872a0SLloyd Pique			'scanner_args': ['client-header', '-c'],
125*84e872a0SLloyd Pique			'output': 'wayland-client-protocol-core.h',
126*84e872a0SLloyd Pique			'install': false,
127*84e872a0SLloyd Pique		},
128*84e872a0SLloyd Pique	]
129*84e872a0SLloyd Pique
130*84e872a0SLloyd Pique	foreach gen: generated_headers
131*84e872a0SLloyd Pique		scanner_args = gen['scanner_args']
132*84e872a0SLloyd Pique		output_file = gen['output']
133*84e872a0SLloyd Pique		install_file = gen['install']
134*84e872a0SLloyd Pique		install_dir = join_paths(get_option('prefix'), get_option('includedir'))
135*84e872a0SLloyd Pique		target_name = output_file.underscorify()
136*84e872a0SLloyd Pique
137*84e872a0SLloyd Pique		target = custom_target(
138*84e872a0SLloyd Pique			target_name,
139*84e872a0SLloyd Pique			command: [
140*84e872a0SLloyd Pique				wayland_scanner_for_build, '-s', scanner_args,
141*84e872a0SLloyd Pique				'@INPUT@', '@OUTPUT@'
142*84e872a0SLloyd Pique			],
143*84e872a0SLloyd Pique			input: wayland_protocol_xml,
144*84e872a0SLloyd Pique			output: output_file,
145*84e872a0SLloyd Pique			install: install_file,
146*84e872a0SLloyd Pique			install_dir: install_dir
147*84e872a0SLloyd Pique		)
148*84e872a0SLloyd Pique
149*84e872a0SLloyd Pique		set_variable(target_name, target)
150*84e872a0SLloyd Pique	endforeach
151*84e872a0SLloyd Pique
152*84e872a0SLloyd Pique	wayland_protocol_c = custom_target(
153*84e872a0SLloyd Pique		'protocol source',
154*84e872a0SLloyd Pique		command: [
155*84e872a0SLloyd Pique			wayland_scanner_for_build, '-s', 'public-code', '@INPUT@', '@OUTPUT@'
156*84e872a0SLloyd Pique		],
157*84e872a0SLloyd Pique		input: wayland_protocol_xml,
158*84e872a0SLloyd Pique		output: 'wayland-protocol.c'
159*84e872a0SLloyd Pique	)
160*84e872a0SLloyd Pique
161*84e872a0SLloyd Pique	if wayland_version[0] != '1'
162*84e872a0SLloyd Pique		# The versioning used for the shared libraries assumes that the major
163*84e872a0SLloyd Pique		# version of Wayland as a whole will increase to 2 if and only if there
164*84e872a0SLloyd Pique		# is an ABI break, at which point we should probably bump the SONAME of
165*84e872a0SLloyd Pique		# all libraries to .so.2. For more details see
166*84e872a0SLloyd Pique		# https://gitlab.freedesktop.org/wayland/wayland/-/merge_requests/177
167*84e872a0SLloyd Pique		error('We probably need to bump the SONAME of libwayland-server and -client')
168*84e872a0SLloyd Pique	endif
169*84e872a0SLloyd Pique
170*84e872a0SLloyd Pique	wayland_server = library(
171*84e872a0SLloyd Pique		'wayland-server',
172*84e872a0SLloyd Pique		sources: [
173*84e872a0SLloyd Pique			wayland_server_protocol_core_h,
174*84e872a0SLloyd Pique			wayland_server_protocol_h,
175*84e872a0SLloyd Pique			wayland_protocol_c,
176*84e872a0SLloyd Pique			'wayland-server.c',
177*84e872a0SLloyd Pique			'wayland-shm.c',
178*84e872a0SLloyd Pique			'event-loop.c'
179*84e872a0SLloyd Pique		],
180*84e872a0SLloyd Pique		# To avoid an unnecessary SONAME bump, wayland 1.x.y produces
181*84e872a0SLloyd Pique		# libwayland-server.so.0.x.y.
182*84e872a0SLloyd Pique		version: '.'.join(['0', wayland_version[1], wayland_version[2]]),
183*84e872a0SLloyd Pique		dependencies: [
184*84e872a0SLloyd Pique			epoll_dep,
185*84e872a0SLloyd Pique			ffi_dep,
186*84e872a0SLloyd Pique			wayland_private_dep,
187*84e872a0SLloyd Pique			wayland_util_dep,
188*84e872a0SLloyd Pique			mathlib_dep,
189*84e872a0SLloyd Pique			threads_dep,
190*84e872a0SLloyd Pique			rt_dep
191*84e872a0SLloyd Pique		],
192*84e872a0SLloyd Pique		include_directories: root_inc,
193*84e872a0SLloyd Pique		install: true
194*84e872a0SLloyd Pique	)
195*84e872a0SLloyd Pique
196*84e872a0SLloyd Pique	wayland_server_dep = declare_dependency(
197*84e872a0SLloyd Pique		link_with: wayland_server,
198*84e872a0SLloyd Pique		include_directories: [ root_inc, include_directories('.') ],
199*84e872a0SLloyd Pique		dependencies: [ epoll_dep, ffi_dep, mathlib_dep, threads_dep ],
200*84e872a0SLloyd Pique		sources: [
201*84e872a0SLloyd Pique			wayland_server_protocol_core_h,
202*84e872a0SLloyd Pique			wayland_server_protocol_h
203*84e872a0SLloyd Pique		]
204*84e872a0SLloyd Pique	)
205*84e872a0SLloyd Pique
206*84e872a0SLloyd Pique	pkgconfig.generate(
207*84e872a0SLloyd Pique		wayland_server,
208*84e872a0SLloyd Pique		name: 'Wayland Server',
209*84e872a0SLloyd Pique		description: 'Server side implementation of the Wayland protocol',
210*84e872a0SLloyd Pique		version: meson.project_version(),
211*84e872a0SLloyd Pique		filebase: 'wayland-server',
212*84e872a0SLloyd Pique		variables: [
213*84e872a0SLloyd Pique			'datarootdir=' + join_paths('${prefix}', get_option('datadir')),
214*84e872a0SLloyd Pique			'pkgdatadir=' + join_paths('${datarootdir}', meson.project_name())
215*84e872a0SLloyd Pique		]
216*84e872a0SLloyd Pique	)
217*84e872a0SLloyd Pique
218*84e872a0SLloyd Pique	if meson.version().version_compare('>= 0.54.0')
219*84e872a0SLloyd Pique		meson.override_dependency('wayland-server', wayland_server_dep)
220*84e872a0SLloyd Pique	endif
221*84e872a0SLloyd Pique
222*84e872a0SLloyd Pique	wayland_client = library(
223*84e872a0SLloyd Pique		'wayland-client',
224*84e872a0SLloyd Pique		sources: [
225*84e872a0SLloyd Pique			wayland_client_protocol_core_h,
226*84e872a0SLloyd Pique			wayland_client_protocol_h,
227*84e872a0SLloyd Pique			wayland_protocol_c,
228*84e872a0SLloyd Pique			'wayland-client.c'
229*84e872a0SLloyd Pique		],
230*84e872a0SLloyd Pique		# To avoid an unnecessary SONAME bump, wayland 1.x.y produces
231*84e872a0SLloyd Pique		# libwayland-client.so.0.x.y.
232*84e872a0SLloyd Pique		version: '.'.join(['0', wayland_version[1], wayland_version[2]]),
233*84e872a0SLloyd Pique		dependencies: [
234*84e872a0SLloyd Pique			epoll_dep,
235*84e872a0SLloyd Pique			ffi_dep,
236*84e872a0SLloyd Pique			wayland_private_dep,
237*84e872a0SLloyd Pique			wayland_util_dep,
238*84e872a0SLloyd Pique			mathlib_dep,
239*84e872a0SLloyd Pique			threads_dep
240*84e872a0SLloyd Pique		],
241*84e872a0SLloyd Pique		include_directories: root_inc,
242*84e872a0SLloyd Pique		install: true
243*84e872a0SLloyd Pique	)
244*84e872a0SLloyd Pique
245*84e872a0SLloyd Pique	pkgconfig.generate(
246*84e872a0SLloyd Pique		wayland_client,
247*84e872a0SLloyd Pique		name: 'Wayland Client',
248*84e872a0SLloyd Pique		description: 'Wayland client side library',
249*84e872a0SLloyd Pique		version: meson.project_version(),
250*84e872a0SLloyd Pique		filebase: 'wayland-client',
251*84e872a0SLloyd Pique		variables: [
252*84e872a0SLloyd Pique			'datarootdir=' + join_paths('${prefix}', get_option('datadir')),
253*84e872a0SLloyd Pique			'pkgdatadir=' + join_paths('${datarootdir}', meson.project_name())
254*84e872a0SLloyd Pique		]
255*84e872a0SLloyd Pique	)
256*84e872a0SLloyd Pique
257*84e872a0SLloyd Pique	wayland_client_dep = declare_dependency(
258*84e872a0SLloyd Pique		link_with: wayland_client,
259*84e872a0SLloyd Pique		include_directories: [ root_inc, include_directories('.') ],
260*84e872a0SLloyd Pique		sources: [
261*84e872a0SLloyd Pique			wayland_client_protocol_core_h,
262*84e872a0SLloyd Pique			wayland_client_protocol_h
263*84e872a0SLloyd Pique		]
264*84e872a0SLloyd Pique	)
265*84e872a0SLloyd Pique
266*84e872a0SLloyd Pique	if meson.version().version_compare('>= 0.54.0')
267*84e872a0SLloyd Pique		meson.override_dependency('wayland-client', wayland_client_dep)
268*84e872a0SLloyd Pique	endif
269*84e872a0SLloyd Pique
270*84e872a0SLloyd Pique	install_headers([
271*84e872a0SLloyd Pique		'wayland-util.h',
272*84e872a0SLloyd Pique		'wayland-server.h',
273*84e872a0SLloyd Pique		'wayland-server-core.h',
274*84e872a0SLloyd Pique		'wayland-client.h',
275*84e872a0SLloyd Pique		'wayland-client-core.h',
276*84e872a0SLloyd Pique	])
277*84e872a0SLloyd Piqueendif
278