diff --git a/demo/CMakeLists.txt b/demo/CMakeLists.txt index 80e4e78..2ac6b09 100644 --- a/demo/CMakeLists.txt +++ b/demo/CMakeLists.txt @@ -11,14 +11,10 @@ execute_process(COMMAND ${VALAC} --version OUTPUT_VARIABLE VALAC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) string(REPLACE "Vala " "" VALAC_VERSION "${VALAC_VERSION}") -if(VALAC_VERSION VERSION_GREATER 0.34.0) - list(APPEND VALA_EXTRA_OPTIONS -D VALA_VERSION_NEWER_THEN_0_34) -endif() - execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --atleast-version 3.22 gdk-3.0 RESULT_VARIABLE GDK_VERSION_NEWER_THEN_3_22) -if(NOT GDK_VERSION_NEWER_THEN_3_22) - list(APPEND VALA_EXTRA_OPTIONS -D GDK_VERSION_NEWER_THEN_3_22) +if(VALAC_VERSION VERSION_GREATER 0.34.0 AND NOT GDK_VERSION_NEWER_THEN_3_22) + list(APPEND VALA_EXTRA_OPTIONS -D GDK3_HAS_MONITOR_CLASS) endif() set(DBUS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dbus) diff --git a/demo/meson.build b/demo/meson.build new file mode 100644 index 0000000..fe1af45 --- /dev/null +++ b/demo/meson.build @@ -0,0 +1,24 @@ +add_languages('vala') + +gio2 = dependency('gio-2.0') +gdk3 = dependency('gdk-3.0') + +valac = meson.get_compiler('vala') +valac_extra_args = [] +if valac.version().version_compare('>=0.34') and gdk3.version().version_compare('>=3.22') + valac_extra_args += ['-D', 'GDK3_HAS_MONITOR_CLASS'] +endif + +miracle_wfdctl_src = ['wfdctl.vala', + 'sigint.vapi', + 'sigint.c', + 'org-freedesktop-networkmanager.vala', + 'org-freedesktop-miracle-wifi.vala', + 'org-freedesktop-miracle-wfd.vala' +] + +executable('miracle-wfdctl', miracle_wfdctl_src, + dependencies: [gio2, gdk3], + vala_args: valac_extra_args, + install: true +) diff --git a/demo/wfdctl.vala b/demo/wfdctl.vala index 71a0cdb..6028927 100644 --- a/demo/wfdctl.vala +++ b/demo/wfdctl.vala @@ -400,7 +400,7 @@ private class WfdCtl : GLib.Application info("P2P group formed"); } -#if GDK_VERSION_NEWER_THEN_3_22 && VALA_VERSION_NEWER_THEN_0_34 +#if GDK3_HAS_MONITOR_CLASS private void get_monitor_geometry(out Gdk.Rectangle g) throws Error { Gdk.Monitor m; @@ -623,7 +623,7 @@ private class WfdCtl : GLib.Application } int n_monitors; -#if GDK_VERSION_NEWER_THEN_3_22 && VALA_VERSION_NEWER_THEN_0_34 +#if GDK3_HAS_MONITOR_CLASS n_monitors = display.get_n_monitors(); #else n_monitors = display.get_default_screen().get_n_monitors(); diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..2f6460a --- /dev/null +++ b/meson.build @@ -0,0 +1,56 @@ +project('Miraclecast', + 'c', + version: '1', + meson_version: '>=0.39', + default_options: ['buildtype=debugoptimized', + 'c_std=gnu11', + 'b_lundef=true', + 'b_sanitize=address'] +) + +glib2 = dependency('glib-2.0') +udev = dependency('libudev') +libsystemd = dependency('libsystemd') +gstreamer = dependency('gstreamer-1.0') +gstreamer_base = dependency('gstreamer-base-1.0') + +if get_option('build-enable-debug') + add_project_arguments('-DBUILD_ENABLE_DEBUG', language: 'c') +endif + +c_compiler = meson.get_compiler('c') +if c_compiler.has_argument('-std=gnu11') + add_project_arguments('-std=gnu11', language: 'c') +endif + +readline = c_compiler.find_library('readline', required: false) +if readline.found() + add_project_arguments('-DHAVE_READLINE', language: 'c') +endif + +add_project_arguments('-D_GNU_SOURCE', language: 'c') + +r = c_compiler.compiles('''int main() { return _Generic(0, int: 0); }''', + name: 'C11 generic selection') +if false == r + error('C11 generic selection is required') +endif + +subdir('src') +subdir('res') +subdir('test') + +if get_option('build-demo') + subdir('demo') +endif + +conf_data = configuration_data() +conf_data.set('BUILD_BINDIR', + '"' + join_paths(get_option('prefix'), get_option('bindir')) + '"' +) +conf_data.set('PACKAGE_STRING', + '"@0@ @1@"'.format(meson.project_name(), +meson.project_version())) +configure_file(output: 'config.h', + configuration: conf_data +) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..0f4eaee --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,16 @@ +option('build-enable-debug', + type: 'boolean', + value: true, + description: 'Enable Debug') +option('rely-udev', + type: 'boolean', + value: false, + description: 'Rely in udev tag to select device') +option('build-tests', + type: 'boolean', + value: true, + description: 'Enable TEST') +option('build-demo', + type: 'boolean', + value: false, + description: 'Enable DEMO') diff --git a/res/create-symlinks b/res/create-symlinks new file mode 100755 index 0000000..f0d92c6 --- /dev/null +++ b/res/create-symlinks @@ -0,0 +1,6 @@ +#!/bin/sh +SYSTEMD_SYSTEM_UNIT_DIR=${DESTDIR}`pkg-config --variable=systemdsystemunitdir systemd` +ln -sfv miracle-wifid.service \ + ${SYSTEMD_SYSTEM_UNIT_DIR}/dbos-org.freedesktop.miracle.wifi.service +ln -sfv miracle-dispd.service \ + ${SYSTEMD_SYSTEM_UNIT_DIR}/dbos-org.freedesktop.miracle.wfd.service diff --git a/res/install-scripts b/res/install-scripts new file mode 100755 index 0000000..d18a1f2 --- /dev/null +++ b/res/install-scripts @@ -0,0 +1,8 @@ +#!/bin/sh +RESDIR="${MESON_SOURCE_ROOT}/res" +BINDIR="${MESON_INSTALL_DESTDIR_PREFIX}/$1" + +install -dv "$BINDIR" +install -v "$RESDIR"/miracle-gst "$BINDIR" +install -v "$RESDIR"/gstplayer "$BINDIR" +install -v "$RESDIR"/uibc-viewer "$BINDIR" diff --git a/res/meson.build b/res/meson.build new file mode 100644 index 0000000..113c50c --- /dev/null +++ b/res/meson.build @@ -0,0 +1,42 @@ +dbus1 = dependency('dbus-1') +systemd = dependency('systemd') + +dbus_system_services_dir = dbus1.get_pkgconfig_variable('system_bus_services_dir') +systemd_system_unit_dir = systemd.get_pkgconfig_variable('systemdsystemunitdir') + +conf_data = configuration_data() +dbus_name_prefix = 'org.freedesktop.miracle' +conf_data.set('dbus_name_prefix', dbus_name_prefix) +conf_data.set('exec_path', + join_paths(get_option('prefix'), get_option('bindir')) +) + +configure_file(input: 'miracle-wifid.service.in', + output: 'miracle-wifid.service', + configuration: conf_data, + install_dir: systemd_system_unit_dir +) +configure_file(input: 'miracle-dispd.service.in', + output: 'miracle-dispd.service', + configuration: conf_data, + install_dir: systemd_system_unit_dir +) +# create symlinks for DBus activiated services +meson.add_install_script('create-symlinks') + +configure_file(input: 'org.freedesktop.miracle.wifi.service.in', + output: 'org.freedesktop.miracle.wifi.service', + configuration: conf_data, + install_dir: dbus_system_services_dir +) +configure_file(input: 'org.freedesktop.miracle.wfd.service.in', + output: 'org.freedesktop.miracle.wfd.service', + configuration: conf_data, + install_dir: dbus_system_services_dir +) +install_data( + dbus_name_prefix + '.conf', + install_dir: join_paths('/', get_option('sysconfdir'), 'dbus-1/system.d') +) + +meson.add_install_script('install-scripts', get_option('bindir')) diff --git a/res/miracle-dispd.service.in b/res/miracle-dispd.service.in new file mode 100644 index 0000000..dfbd1c3 --- /dev/null +++ b/res/miracle-dispd.service.in @@ -0,0 +1,15 @@ +[Unit] +Description=Miraclecast WiFi Display Service +After=dbus.service +Requires=miracle-wifid.service +After=miracle-wifid.service + +[Service] +BusName=@dbus_name_prefix@.wfd +Environment=LOG_LEVEL=trace +ExecStart=@exec_path@/miracle-dispd +KillSignal=SIGKILL + +[Install] +WantedBy=multi-user.target +Alias=dbus-@dbus_name_prefix@.wfd.service diff --git a/res/miracle-wifid.service.in b/res/miracle-wifid.service.in new file mode 100644 index 0000000..8dd5871 --- /dev/null +++ b/res/miracle-wifid.service.in @@ -0,0 +1,16 @@ +[Unit] +Description=Miraclecast WiFi Daemon +After=dbus.service +Requires=network.target + +[Service] +BusName=@dbus_name_prefix@.wifi +Environment=PATH=/sbin:/usr/bin +ExecStart=@exec_path@/miracle-wifid \ + --use-dev \ + --log-level trace \ + --lazy-managed + +[Install] +WantedBy=multi-user.target +Alias=dbus-@dbus_name_prefix@.wifi.service diff --git a/res/org.freedesktop.miracle.wfd.service.in b/res/org.freedesktop.miracle.wfd.service.in new file mode 100644 index 0000000..895f15b --- /dev/null +++ b/res/org.freedesktop.miracle.wfd.service.in @@ -0,0 +1,5 @@ +[D-BUS Service] +Name=@dbus_name_prefix@.wfd +Exec=/bin/sh -c 'LOG_LEVEL=trace @exec_path@/miracle-dispd' +User=root +SystemdService=dbus-@dbus_name_prefix@.wfd.service diff --git a/res/org.freedesktop.miracle.wifi.service.in b/res/org.freedesktop.miracle.wifi.service.in new file mode 100644 index 0000000..3b202b0 --- /dev/null +++ b/res/org.freedesktop.miracle.wifi.service.in @@ -0,0 +1,5 @@ +[D-BUS Service] +Name=@dbus_name_prefix@.wifi +Exec=/bin/sh -c 'PATH=/sbin:/usr/bin @exec_path@/miracle-wifid --use-dev --log-level trace' +User=root +SystemdService=dbus-@dbus_name_prefix@.wifi.service diff --git a/src/ctl/meson.build b/src/ctl/meson.build new file mode 100644 index 0000000..5fbe275 --- /dev/null +++ b/src/ctl/meson.build @@ -0,0 +1,24 @@ +inc = include_directories('../..') +miracle_wifictl_deps = [libsystemd, libmiracle_shared_dep] +if readline.found() + miracle_wifictl_deps += readline +endif + +miracle_wifictl_srcs = ['ctl-cli.c', 'ctl-wifi.c', 'wifictl.c'] +executable('miracle-wifictl', miracle_wifictl_srcs, + install: true, + include_directories: inc, + dependencies: miracle_wifictl_deps +) + +miracle_sinkctl_srcs = ['ctl-cli.c', + 'ctl-sink.c', + 'ctl-wifi.c', + 'sinkctl.c', + 'wfd.c' +] +executable('miracle-sinkctl', miracle_sinkctl_srcs, + install: true, + include_directories: inc, + dependencies: miracle_wifictl_deps +) diff --git a/src/dhcp/meson.build b/src/dhcp/meson.build new file mode 100644 index 0000000..1dce905 --- /dev/null +++ b/src/dhcp/meson.build @@ -0,0 +1,11 @@ +miracle_dhcp_srcs = ['dhcp.c', + 'common.c', + 'ipv4ll.c', + 'client.c', + 'server.c' +] +executable('miracle-dhcp', miracle_dhcp_srcs, + install: true, + include_directories: include_directories('../..'), + dependencies: [glib2, udev, libmiracle_shared_dep] +) diff --git a/src/disp/meson.build b/src/disp/meson.build new file mode 100644 index 0000000..5fc6d1a --- /dev/null +++ b/src/disp/meson.build @@ -0,0 +1,22 @@ +inc = include_directories('../..', '../ctl',) +deps = [libsystemd, gstreamer, gstreamer_base, libmiracle_shared_dep] +if readline.found() + deps += [readline] +endif + +miracle_dispd_src = ['../ctl/ctl-cli.c', + '../ctl/ctl-wifi.c', + 'wfd-sink.c', + 'wfd-dbus.c', + 'wfd-session.c', + 'wfd-out-session.c', + 'dispd.c', + '../ctl/wfd.c', + 'wfd-arg.c' +] +executable('miracle-dispd', + miracle_dispd_src, + install: true, + include_directories: inc, + dependencies: deps +) diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..253bb74 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,8 @@ +inc_shared = include_directories('shared') + +subdir('shared') +subdir('wifi') +subdir('dhcp') +subdir('ctl') +subdir('uibc') +subdir('disp') diff --git a/src/shared/meson.build b/src/shared/meson.build new file mode 100644 index 0000000..4af9e34 --- /dev/null +++ b/src/shared/meson.build @@ -0,0 +1,22 @@ +libmiracle_shared = static_library('miracle-shared', + 'rtsp.h', + 'rtsp.c', + 'shl_dlist.h', + 'shl_htable.h', + 'shl_htable.c', + 'shl_log.h', + 'shl_log.c', + 'shl_macro.h', + 'shl_ring.h', + 'shl_ring.c', + 'shl_util.h', + 'shl_util.c', + 'util.h', + 'wpas.h', + 'wpas.c', + dependencies: [libsystemd] +) +libmiracle_shared_dep = declare_dependency( + include_directories: include_directories('.'), + link_with: libmiracle_shared +) diff --git a/src/uibc/meson.build b/src/uibc/meson.build new file mode 100644 index 0000000..17a06db --- /dev/null +++ b/src/uibc/meson.build @@ -0,0 +1,5 @@ +m = c_compiler.find_library('m', required: false) +executable('miracle-uibcctl', 'miracle-uibcctl.h', 'miracle-uibcctl.c', + install: true, + dependencies: [m, libmiracle_shared_dep] +) diff --git a/src/wifi/meson.build b/src/wifi/meson.build new file mode 100644 index 0000000..e0176f4 --- /dev/null +++ b/src/wifi/meson.build @@ -0,0 +1,14 @@ +inc = include_directories('../..') +miracle_wifid_src = ['wifid.h', + 'wifid.c', + 'wifid-dbus.c', + 'wifid-link.c', + 'wifid-peer.c', + 'wifid-supplicant.c' +] +executable('miracle-wifid', miracle_wifid_src, + include_directories: inc, + install: true, + dependencies: [udev, glib2, libsystemd, libmiracle_shared_dep] +) + diff --git a/test/meson.build b/test/meson.build new file mode 100644 index 0000000..b2feb2a --- /dev/null +++ b/test/meson.build @@ -0,0 +1,33 @@ +check = dependency('check', required: false) +deps = [udev, glib2, check, libsystemd, libmiracle_shared_dep] + +if check.found() + test_rtsp = executable('test_rtsp', 'test_rtsp.c', dependencies: deps) + + test_wpas = executable('test_wpas', 'test_wpas.c', dependencies: deps) + + test_valgrind = executable('test_valgrind', + 'test_valgrind.c', + dependencies: deps + ) + + valgrind = find_program('valgrind') + +# set(VALGRIND CK_FORK=no valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --leak-resolution=high --error-exitcode=1 --suppressions=${CMAKE_SOURCE_DIR}/test.supp) +# +# add_custom_target(memcheck-verify +# DEPENDS test_rtsp test_wpas test_valgrind +# COMMAND ${VALGRIND} --log-file=/dev/null ./test_valgrind >/dev/null | +# test 1 = $$? +# COMMENT "verify memcheck") +# +# add_custom_target(memcheck +# DEPENDS memcheck-verify +# COMMAND for i in $(MEMTESTS) | +# do | +# ${VALGRIND} --log-file=${CMAKE_SOURCE_DIR}/$$i.memlog | +# ${CMAKE_SOURCE_DIR}/$$i >/dev/null || (echo "memcheck failed on: $$i" ; exit 1) ; | +# done +# SOURCES test_rtsp test_valgrind test_wpas +# COMMENT "verify memcheck") +endif