From: Sung-Jin Park Date: Mon, 15 Apr 2019 10:57:24 +0000 (+0900) Subject: headless: add basic build environments for headless server X-Git-Tag: submit/tizen/20190530.092249~85 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=01c4ae24ac65708034461c3308b3ff2c71fd5764;p=platform%2Fcore%2Fuifw%2Fpepper.git headless: add basic build environments for headless server Change-Id: Idb5b04fbea0194d864d12afa574eaf10d6f04c2f Signed-off-by: Sung-Jin Park --- diff --git a/configure.ac b/configure.ac index 3057e7d..f83c362 100644 --- a/configure.ac +++ b/configure.ac @@ -306,6 +306,15 @@ SAMPLES_LIBS="$PEPPER_X11_LIB $PEPPER_X11_LIBS $SAMPLES_LIBS" AC_SUBST(SAMPLES_CFLAGS) AC_SUBST(SAMPLES_LIBS) +# headless server +HEADLESS_SERVER_REQUIRES="wayland-server" +PKG_CHECK_MODULES(HEADLESS_SERVER, $[HEADLESS_SERVER_REQUIRES]) +HEADLESS_SERVER_CFLAGS="$PEPPER_DIR $HEADLESS_SERVER_CFLAGS" +HEADLESS_SERVER_LIBS="$PEPPER_LIB $PEPPER_LIBS $HEADLESS_SERVER_LIBS" + +AC_SUBST(HEADLESS_SERVER_CFLAGS) +AC_SUBST(HEADLESS_SERVER_LIBS) + # doctor (headless server) and headless client samples DOCTOR_SERVER_REQUIRES="wayland-server libtbm" PKG_CHECK_MODULES(DOCTOR_SERVER, $[DOCTOR_SERVER_REQUIRES]) @@ -392,6 +401,7 @@ src/lib/drm/Makefile src/lib/fbdev/Makefile src/lib/wayland/Makefile src/bin/doctor/Makefile +src/bin/headless/Makefile src/samples/Makefile pkgconfig/pepper.pc pkgconfig/pepper-render.pc diff --git a/data/headless/units/display-manager-ready.path b/data/headless/units/display-manager-ready.path new file mode 100644 index 0000000..bbbe8fb --- /dev/null +++ b/data/headless/units/display-manager-ready.path @@ -0,0 +1,6 @@ +[Unit] +Description=Path activation for display manager ready service +After=tmp.mount display-manager.service + +[Path] +PathExists=/run/headless-0 diff --git a/data/headless/units/display-manager-ready.service b/data/headless/units/display-manager-ready.service new file mode 100644 index 0000000..43779e3 --- /dev/null +++ b/data/headless/units/display-manager-ready.service @@ -0,0 +1,13 @@ +[Unit] +Description=Headless Display Manager Ready Service +After=tmp.mount display-manager.service + +[Service] +Type=oneshot +EnvironmentFile=/etc/sysconfig/display-manager.env +SmackProcessLabel=System +ExecStart=/usr/bin/sh -c "while [ ! -e /run/headless-0 ] ; do /usr/bin/sleep .1 ; done ;/bin/chown -f root:display /run/headless-0;/bin/chmod 775 /run/headless-0" +ExecStartPost=/usr/bin/sh -c "/usr/bin/touch /run/.wm_ready" + +[Install] +WantedBy=graphical.target diff --git a/data/headless/units/display-manager.env b/data/headless/units/display-manager.env new file mode 100644 index 0000000..2c356e3 --- /dev/null +++ b/data/headless/units/display-manager.env @@ -0,0 +1,3 @@ +TBM_DISPLAY_SERVER=1 +WAYLAND_DISPLAY="headless-0" +XDG_RUNTIME_DIR=/run diff --git a/data/headless/units/display-manager.service b/data/headless/units/display-manager.service new file mode 100644 index 0000000..35ecc6b --- /dev/null +++ b/data/headless/units/display-manager.service @@ -0,0 +1,11 @@ +[Unit] +Description=Headless Display Manager + +[Service] +Type=simple +EnvironmentFile=/etc/sysconfig/display-manager.env +SmackProcessLabel=System +ExecStart=/usr/bin/headless_server + +[Install] +WantedBy=graphical.target diff --git a/data/headless/units/display-user.service b/data/headless/units/display-user.service new file mode 100644 index 0000000..9c55463 --- /dev/null +++ b/data/headless/units/display-user.service @@ -0,0 +1,7 @@ +[Unit] +Description=Creating a link file for user to access display manager socket +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/bin/sh -c "while [ ! -e /run/headless-0 ] ; do /usr/bin/sleep .1 ; done ;/usr/bin/ln -sf /run/headless-0 /run/user/%U/" diff --git a/data/headless/units/display_env.sh b/data/headless/units/display_env.sh new file mode 100644 index 0000000..56a32a9 --- /dev/null +++ b/data/headless/units/display_env.sh @@ -0,0 +1,8 @@ +if [ "$USER" == "root" ]; then + export XDG_RUNTIME_DIR=/run +else + export XDG_RUNTIME_DIR=/run/user/$UID +fi +if [ "$WAYALND_DISPLAY" = "" ]; then + export WAYLAND_DISPLAY=headless-0 +fi diff --git a/packaging/pepper.spec b/packaging/pepper.spec index f4213ab..866a6f1 100644 --- a/packaging/pepper.spec +++ b/packaging/pepper.spec @@ -235,6 +235,14 @@ Requires: libtbm %description doctor This package includes doctor server files. +###### headless server +%package headless +Summary: Headless server for pepper package +Requires: pepper + +%description headless +This package includes headless server files. + ###### samples %package samples Summary: samples for pepper package @@ -277,16 +285,22 @@ make %{?_smp_mflags} install -m 644 data/doctor/units/display-manager.service %{buildroot}%{_unitdir} install -m 644 data/doctor/units/display-manager-ready.path %{buildroot}%{_unitdir} install -m 644 data/doctor/units/display-manager-ready.service %{buildroot}%{_unitdir} +install -m 644 data/headless/units/display-manager.service %{buildroot}%{_unitdir} +install -m 644 data/headless/units/display-manager-ready.path %{buildroot}%{_unitdir} +install -m 644 data/headless/units/display-manager-ready.service %{buildroot}%{_unitdir} # install user session service %__mkdir_p %{buildroot}%{_unitdir_user} install -m 644 data/doctor/units/display-user.service %{buildroot}%{_unitdir_user} +install -m 644 data/headless/units/display-user.service %{buildroot}%{_unitdir_user} # install env file and scripts for service %__mkdir_p %{buildroot}%{_sysconfdir}/sysconfig install -m 0644 data/doctor/units/display-manager.env %{buildroot}%{_sysconfdir}/sysconfig +install -m 0644 data/headless/units/display-manager.env %{buildroot}%{_sysconfdir}/sysconfig %__mkdir_p %{buildroot}%{_sysconfdir}/profile.d install -m 0644 data/doctor/units/display_env.sh %{buildroot}%{_sysconfdir}/profile.d +install -m 0644 data/headless/units/display_env.sh %{buildroot}%{_sysconfdir}/profile.d %post -n %{name} -p /sbin/ldconfig %postun -n %{name} -p /sbin/ldconfig @@ -327,6 +341,12 @@ getent group %{display_group} >/dev/null || %{_sbindir}/groupadd -r -o %{display # create user 'display' getent passwd %{display_user} >/dev/null || %{_sbindir}/useradd -r -g %{display_group} -d /run/display -s /bin/false -c "Display" %{display_user} +%pre headless +# create groups 'display' +getent group %{display_group} >/dev/null || %{_sbindir}/groupadd -r -o %{display_group} +# create user 'display' +getent passwd %{display_user} >/dev/null || %{_sbindir}/useradd -r -g %{display_group} -d /run/display -s /bin/false -c "Display" %{display_user} + # create links within systemd's target(s) %__mkdir_p %{_unitdir}/graphical.target.wants/ %__mkdir_p %{_unitdir_user}/basic.target.wants/ @@ -339,6 +359,11 @@ rm -f %{_unitdir}/graphical.target.wants/display-manager.service rm -f %{_unitdir}/graphical.target.wants/display-manager-ready.service rm -f %{_unitdir_user}/basic.target.wants/display-user.service +%postun headless +rm -f %{_unitdir}/graphical.target.wants/display-manager.service +rm -f %{_unitdir}/graphical.target.wants/display-manager-ready.service +rm -f %{_unitdir_user}/basic.target.wants/display-user.service + %files -n %{name} %manifest %{name}.manifest %defattr(-,root,root,-) @@ -532,6 +557,18 @@ rm -f %{_unitdir_user}/basic.target.wants/display-user.service %config %{_sysconfdir}/sysconfig/display-manager.env %config %{_sysconfdir}/profile.d/display_env.sh +%files headless +%manifest %{name}.manifest +%defattr(-,root,root,-) +%license COPYING +%{_bindir}/headless* +%{_unitdir}/display-manager-ready.path +%{_unitdir}/display-manager-ready.service +%{_unitdir}/display-manager.service +%{_unitdir_user}/display-user.service +%config %{_sysconfdir}/sysconfig/display-manager.env +%config %{_sysconfdir}/profile.d/display_env.sh + %files samples %manifest %{name}.manifest %defattr(-,root,root,-) diff --git a/src/Makefile.am b/src/Makefile.am index 800689f..af24127 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -20,4 +20,5 @@ SUBDIRS += lib/x11 endif SUBDIRS += samples \ - bin/doctor + bin/doctor \ + bin/headless diff --git a/src/bin/headless/Makefile.am b/src/bin/headless/Makefile.am new file mode 100644 index 0000000..50c1ba0 --- /dev/null +++ b/src/bin/headless/Makefile.am @@ -0,0 +1,8 @@ +bin_PROGRAMS = + +bin_PROGRAMS += headless_server + +headless_server_CFLAGS = $(HEADLESS_SERVER_CFLAGS) +headless_server_LDADD = $(HEADLESS_SERVER_LIBS) + +headless_server_SOURCES = headless_server.c diff --git a/src/bin/headless/headless_server.c b/src/bin/headless/headless_server.c new file mode 100644 index 0000000..dda6ddd --- /dev/null +++ b/src/bin/headless/headless_server.c @@ -0,0 +1,23 @@ +#include + +int main(int argc, char *argv[]) +{ + const char *socket_name = NULL; + pepper_compositor_t *compositor = NULL; + + socket_name = getenv("WAYLAND_DISPLAY"); + + if (!socket_name) + socket_name = "headless-0"; + + /* create pepper compositir */ + compositor = pepper_compositor_create(socket_name); + PEPPER_CHECK(compositor, return EXIT_FAILURE, "Failed to create compositor !"); + + /* run event loop */ + wl_display_run(pepper_compositor_get_display(compositor)); + + pepper_compositor_destroy(compositor); + + return EXIT_SUCCESS; +}