diff --git a/hw/xquartz/GL/meson.build b/hw/xquartz/GL/meson.build new file mode 100644 index 000000000..556417525 --- /dev/null +++ b/hw/xquartz/GL/meson.build @@ -0,0 +1,5 @@ +libcglcore = static_library('CGLCore', + ['indirect.c', 'capabilities.c', 'visualConfigs.c'], + include_directories: [inc, glx_inc, '..', '../xpr'], + dependencies: [xproto_dep, pixman_dep], +) diff --git a/hw/xquartz/bundle/chown-bundle.sh b/hw/xquartz/bundle/chown-bundle.sh new file mode 100755 index 000000000..ac62f289f --- /dev/null +++ b/hw/xquartz/bundle/chown-bundle.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +BUNDLE_ROOT=$1 + +if [[ $(id -u) == 0 ]] ; then + chown -R root:admin ${BUNDLE_ROOT} +fi diff --git a/hw/xquartz/bundle/meson.build b/hw/xquartz/bundle/meson.build new file mode 100644 index 000000000..ec5225293 --- /dev/null +++ b/hw/xquartz/bundle/meson.build @@ -0,0 +1,65 @@ +# system-wide Xquartz server defaults file +install_data('Xquartz.plist', + install_dir: join_paths(get_option('libdir'), 'X11/xserver')) + +# generate Info.plist +cpp = find_program('cpp') +cpp_defs = [ + '-DAPPLE_APPLICATION_NAME=@0@'.format(apple_application_name), + '-DBUNDLE_ID_PREFIX=@0@'.format(bundle_id_prefix), + '-DBUNDLE_VERSION=@0@'.format(bundle_version), + '-DBUNDLE_VERSION_STRING=@0@'.format(bundle_version_string), +] + +if build_sparkle +cpp_defs += [ + '-DXQUARTZ_SPARKLE', + '-DXQUARTZ_SPARKLE_FEED_URL=@0@'.format(xquartz_sparkle_feed_url), +] +endif + +# bundle data +localities = [ + 'Dutch', 'English', 'French', 'German', 'Italian', 'Japanese', 'Spanish', + 'ar','ca','cs','da','el','fi','he','hr','hu','ko','no','pl','pt','pt_PT', + 'ro','ru','sk','sv','th','tr','uk','zh_CN','zh_TW' +] +foreach lang : localities + install_data(join_paths('Resources', lang + '.lproj', 'Localizable.strings'), + install_dir: join_paths(bundle_root, 'Contents/Resources', lang + '.lproj'), + install_mode: 'rw-r--r--') + + install_data(join_paths('Resources', lang + '.lproj', 'main.nib/keyedobjects.nib'), + install_dir: join_paths(bundle_root, 'Contents/Resources', lang + '.lproj', 'main.nib'), + install_mode: 'rw-r--r--') +endforeach + +install_data('Resources/English.lproj/main.nib/designable.nib', + install_dir: join_paths(bundle_root, 'Contents/Resources/English.lproj/main.nib'), + install_mode: 'rw-r--r--') + +install_data('Resources/X11.icns', + install_dir: join_paths(bundle_root, 'Contents/Resources'), + install_mode: 'rw-r--r--') + +custom_target('Info.plist', + command: [cpp, '-P', cpp_defs, '@INPUT@'], + capture: true, + input: 'Info.plist.cpp', + output: 'Info.plist', + install: true, + install_dir: join_paths(bundle_root, 'Contents'), + install_mode: 'rw-r--r--', + build_by_default: true, +) + +install_data('PkgInfo', + install_dir: join_paths(bundle_root, 'Contents'), + install_mode: 'rw-r--r--') + +install_data('X11.sh', + rename: 'X11', + install_dir: join_paths(bundle_root, 'Contents/MacOS'), + install_mode: 'rwxr-xr-x') + +meson.add_install_script('chown-bundle.sh', bundle_root) diff --git a/hw/xquartz/mach-startup/meson.build b/hw/xquartz/mach-startup/meson.build new file mode 100644 index 000000000..1d5318441 --- /dev/null +++ b/hw/xquartz/mach-startup/meson.build @@ -0,0 +1,92 @@ +# mach interface +mig = find_program('mig') +mach_startup = custom_target('mach_startup', + command: [mig, + '-sheader', '@OUTPUT0@', '-header', '@OUTPUT2@', + '-server', '@OUTPUT1@', '-user', '@OUTPUT3@', + '@INPUT@'], + input: 'mach_startup.defs', + output: ['mach_startupServer.h', + 'mach_startupServer.c', + 'mach_startup.h', + 'mach_startupUser.c'], +) + +mach_startup_dep = declare_dependency( + sources: mach_startup[2] # mach_startup.h +) + +# common defines +xquartz_defs = [ + bundle_id_def, + '-DXSERVER_VERSION="@0@"'.format(meson.project_version()), + '-DX11BINDIR="@0@"'.format(join_paths(get_option('prefix'), get_option('bindir'))), +] + +# X11.bin +x11appdir = join_paths(bundle_root, 'Contents/MacOS') + +x11_bin_deps = [ + meson.get_compiler('c').find_library('Xplugin'), + dependency('Carbon', method: 'extraframework'), + cocoa, + dependency('CoreAudio', method: 'extraframework'), + dependency('IOKit', method: 'extraframework') +] + +if build_glx + x11_bin_deps += [dependency('OpenGL', method: 'extraframework')] +endif + +if build_sparkle + x11_bin_deps += sparkle +endif + +x11_bin_libs = [ + libXquartz, + libXquartzXpr, + libxpbproxy, + libxserver_fb, + libxserver, + libxserver_xkb_stubs, +] + +if build_glx + x11_bin_libs += [libcglcore, libxserver_glx, libglxvnd] +endif + +x11_bin = executable('X11.bin', + [ + 'bundle-main.c', + # strndup(3) was added in Mac OS X 10.7 (Lion), but we do this + # unconditionally to deal with the case where we build on 10.7 or later, + # but target 10.6 (Snow Leopard) or earlier as the minimum OS version. + '../../../os/strndup.c', + mach_startup[1], # mach_startupServer.c + mach_startup[3], # mach_startupUser.c + ], + link_with: x11_bin_libs, + dependencies: [xproto_dep, x11_bin_deps, mach_startup_dep], + include_directories: [inc, '..', top_dir_inc], + c_args: xquartz_defs, + link_args: ['-Objc'], + install: true, + install_dir: x11appdir, +) + +# Xquartz +xquartz_deps = [ + dependency('CoreServices', method: 'extraframework'), +] + +xquartz = executable('Xquartz', + [ + 'stub.c', + 'launchd_fd.c', + mach_startup[3], # mach_startupUser.c + ], + include_directories: inc, + c_args: xquartz_defs, + dependencies: [xquartz_deps, mach_startup_dep], + install: true, +) diff --git a/hw/xquartz/meson.build b/hw/xquartz/meson.build index ebb24132c..25004f79c 100644 --- a/hw/xquartz/meson.build +++ b/hw/xquartz/meson.build @@ -1,6 +1,25 @@ add_languages('objc') -srcs = [ +apple_applications_dir = get_option('apple-applications-dir') +apple_application_name = get_option('apple-application-name') +bundle_id_prefix = get_option('bundle-id-prefix') +xquartz_sparkle_feed_url = get_option('sparkle-feed-url') + +bundle_version_string = meson.project_version() # CFBundleShortVersionString +bundle_version = release # CFBundleVersion + +bundle_id_def = '-DBUNDLE_ID_PREFIX="@0@"'.format(bundle_id_prefix) + +bundle_root = join_paths(apple_applications_dir, apple_application_name + '.app') + +# using sparkle update framework? +build_sparkle = xquartz_sparkle_feed_url != '' +if build_sparkle + sparkle = dependency('Sparkle', method: 'extraframework') +endif + +# libxquartz +srcs_libxquartz = [ 'X11Application.m', 'X11Controller.m', 'applewm.c', @@ -17,30 +36,42 @@ srcs = [ '../../mi/miinitext.c', ] -xquartz_c_args = [ - '-DXFree86Server', - # XXXX: BUILD_DATE - '-DXSERVER_VERSION="' + meson_project.version() + '"', +libxquartz_defs = [ '-DINXQUARTZ', '-DUSE_NEW_CLUT', + '-DX11LIBDIR="@0@"'.format(join_paths(get_option('prefix'), + get_option('libdir'))), + '-DXFree86Server', + '-DXQUARTZ', + '-DXSERVER_VERSION="@0@"'.format(meson.project_version()), + bundle_id_def, ] if cc.has_function('dispatch_async') - xquartz_c_args += '-DHAVE_LIBDISPATCH' + libxquartz_defs += '-DHAVE_LIBDISPATCH' endif -executable( - 'Xquartz', - srcs, - include_directories: inc, - link_with: [ - libxserver_main, - libxserver, - libxserver_xkb_stubs, - libxserver_xi_stubs, - libxserver_glx, - libxserver_pseudoramix, - ], - c_args: xquartz_c_args, - install: true, +libXquartz = static_library('Xquartz', + srcs_libxquartz, + c_args: libxquartz_defs, + objc_args: libxquartz_defs, + include_directories: [inc, '../../pseudoramiX', '../../miext/rootless', top_dir_inc], + dependencies: [xproto_dep, pixman_dep], + link_with: [libxserver_pseudoramix, libxserver_miext_rootless], ) + +subdir('bundle') +if build_glx + subdir('GL') +endif +subdir('pbproxy') +subdir('xpr') +subdir('mach-startup') + +# manpage +xquartz_man = configure_file( + input: 'man/Xquartz.man', + output: 'Xquartz.1', + configuration: manpage_config, +) +install_man(xquartz_man) diff --git a/hw/xquartz/pbproxy/meson.build b/hw/xquartz/pbproxy/meson.build new file mode 100644 index 000000000..bf0f06f75 --- /dev/null +++ b/hw/xquartz/pbproxy/meson.build @@ -0,0 +1,29 @@ +build_standalone_pbproxy = get_option('xpbproxy') + +pbproxy_defs = [bundle_id_def] +if build_standalone_pbproxy + pbproxy_defs += ['-DSTANDALONE_XPBPROXY'] +endif + +libapplewm_dep = dependency('applewm', version: '>=1.4') + +libxpbproxy = static_library('xpbproxy', + ['main.m', + 'x-input.m', + 'x-selection.m'], + dependencies: [applewmproto_dep, libapplewm_dep, dependency('xfixes'), dependency('x11')], + objc_args: pbproxy_defs, +) + +cocoa = dependency('Cocoa', method: 'extraframework') + +# standalone xpbproxy +if build_standalone_pbproxy + executable('xpbproxy', + 'app-main.m', + link_with: libxpbproxy, + dependencies: [cocoa, dependency('x11')], + objc_args: pbproxy_defs, + install: true, + ) +endif diff --git a/hw/xquartz/xpr/meson.build b/hw/xquartz/xpr/meson.build new file mode 100644 index 000000000..590727f47 --- /dev/null +++ b/hw/xquartz/xpr/meson.build @@ -0,0 +1,18 @@ +libXquartzXpr = static_library('XquartzXpr', + [ + 'appledri.c', + 'dri.c', + 'driWrap.c', + 'xprAppleWM.c', + 'xprCursor.c', + 'xprEvent.c', + 'xprFrame.c', + 'xprScreen.c', + 'x-hash.c', + 'x-hook.c', + 'x-list.c', + ], + include_directories: [inc, '..', '../../../pseudoramiX', '../../../miext/rootless'], + c_args: [bundle_id_def, '-DXQUARTZ'], + dependencies: [xproto_dep, pixman_dep], +) diff --git a/include/meson.build b/include/meson.build index 8e400d05d..65781b7a0 100644 --- a/include/meson.build +++ b/include/meson.build @@ -52,8 +52,6 @@ conf_data.set('_GNU_SOURCE', '1') # ifdef for openbsd? conf_data.set('HAS_APERTURE_DRV', host_machine.system() == 'openbsd') -# XXX: BUNDLE_ID_PREFIX - if get_option('input_thread') == 'false' enable_input_thread = false else @@ -289,6 +287,10 @@ if host_machine.system() == 'openbsd' csrg_based = true endif +if host_machine.system() == 'darwin' + csrg_based = true +endif + conf_data.set('SVR4', cc.compiles(defines_svr4)) conf_data.set_quoted('XKB_DFLT_RULES', get_option('xkb_default_rules')) conf_data.set('XORGSERVER', build_xorg) diff --git a/meson.build b/meson.build index 85c045ee3..08395ff62 100644 --- a/meson.build +++ b/meson.build @@ -6,7 +6,7 @@ project('xserver', 'c', version: '1.20.99.1', meson_version: '>= 0.46.0', ) -add_project_arguments('-DHAVE_DIX_CONFIG_H', language: 'c') +add_project_arguments('-DHAVE_DIX_CONFIG_H', language: ['c', 'objc']) cc = meson.get_compiler('c') add_global_arguments('-fno-strict-aliasing', language : 'c') @@ -56,7 +56,7 @@ foreach wflag: test_wflags endif endforeach -add_global_arguments(common_wflags, language : 'c') +add_global_arguments(common_wflags, language : ['c', 'objc']) xproto_dep = dependency('xproto', version: '>= 7.0.31') randrproto_dep = dependency('randrproto', version: '>= 1.6.0') @@ -133,14 +133,21 @@ dfp = get_option('default_font_path') if dfp == '' fontutil_dep = dependency('fontutil') fontrootdir = fontutil_dep.get_pkgconfig_variable('fontrootdir') - default_font_path = ','.join([ + 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 @@ -149,7 +156,7 @@ hal_option = get_option('hal') glamor_option = get_option('glamor') build_udev = get_option('udev') -if host_machine.system() == 'windows' +if host_machine.system() == 'windows' or host_machine.system() == 'darwin' build_udev = false hal_option = 'false' endif @@ -227,8 +234,14 @@ else build_xwin = get_option('xwin') == 'true' endif -# XXX: Finish these. 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 diff --git a/meson_options.txt b/meson_options.txt index 3051932f7..7d3bbe535 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -16,6 +16,9 @@ option('xvfb', type: 'boolean', value: true, description: 'Enable Xvfb X server') option('xwin', type: 'combo', choices: ['true', 'false', 'auto'], value: 'auto', description: 'Enable XWin X server') +option('xquartz', type: 'combo', choices: ['true', 'false', 'auto'], value: 'auto', + description: 'Enable Xquartz X server') + option('builder_addr', type: 'string', description: 'Builder address', value: 'xorg@lists.freedesktop.org') option('builder_string', type: 'string', description: 'Additional builder string') @@ -104,3 +107,14 @@ option('agp', type: 'combo', choices: ['true', 'false', 'auto'], value: 'auto', option('dri1', type: 'combo', choices: ['true', 'false', 'auto'], value: 'auto', description: 'Build DRI1 extension (default: auto)') option('dri2', type: 'combo', choices: ['true', 'false', 'auto'], value: 'auto', description: 'Build DRI2 extension (default: auto)') option('dri3', type: 'combo', choices: ['true', 'false', 'auto'], value: 'auto', description: 'Build DRI3 extension (default: auto)') + +option('apple-applications-dir', type: 'string', value: '/Applications/Utilities', + description: 'Applications directory') +option('apple-application-name', type: 'string', value: 'X11', + description: 'Application name') +option('bundle-id-prefix', type: 'string', value: 'org.x', + description: 'RDNS prefix for bundle identifier') +option('sparkle-feed-url', type: 'string', + description: 'Feed URL for autoupdating with the Sparkle Framework (default: disabled)') +option('xpbproxy', type: 'boolean', value: false, + description: 'Build a standalone X pasteboard proxy') diff --git a/os/meson.build b/os/meson.build index f6313807a..39440a7c3 100644 --- a/os/meson.build +++ b/os/meson.build @@ -62,7 +62,7 @@ if get_option('secure-rpc') if not (rpc_dep.found() or cc.has_header('rpc/rpc.h')) error('secure-rpc requested, but neither libtirpc or libc RPC support were found') endif - + # XXX: also check if RPC library provides xdr_opaque_auth, authdes_(sec)create ??? srcs_os += 'rpcauth.c' endif