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