[Kimchi-devel] [PATCH] Packaging: Discover and Build Plugins Automatically

Aline Manera alinefm at linux.vnet.ibm.com
Wed Apr 9 12:36:54 UTC 2014


The plugins should be packaged in a separated package and not with 
kimchi code.

We should have: kimchi.rpm and pluginA.rpm, pluginB.rpm and so (same for 
deb packages)
And plugins packages depend on kimchi

On 04/09/2014 06:43 AM, zhshzhou at linux.vnet.ibm.com wrote:
> From: Zhou Zheng Sheng <zhshzhou at linux.vnet.ibm.com>
>
> Though Kimchi can automatically discover and load plugin Python modules
> when kimchid starts, the packaging subsystem is not as smart. Downstream
> plugin developers have to insert entries in Kimchi configure.ac and
> contrib/kimchi.spec.*.in to compile and package plugin files. This is
> not scalable.
>
> This patch proposes a mechanism to make packaging scripts smarter to
> discover and build plugins dynamically, so that the plugin code is
> actually "plugable" to the packaging subsystem. The plugin developer
> just places the pluginX code to plugins/pluginX, then uses
> "./autogen.sh --with-plugins=pluginX" to generate the packaging scripts
> for pluginX. We no longer have to change upstream Kimchi configure.ac,
> Makefile.am and kimchi.spec.*.in.
>
> To compile with plugins, use the following command.
>    ./autogen.sh --with-plugins=plugin1,plugin2,... && make
>
> To build kimchi-plugin1.rpm, kimchi-plugin2.rpm and kimchi.rpm, use the
> following command.
>    ./autogen.sh --system --with-plugins=plugin1,plugin2 && make && make rpm
>
> To build only kimchi.rpm, use the following command
>    ./autogen.sh --system && make && make rpm
>
> This patch makes use of the "include" functions in autoconf and RPM
> spec. The basic idea is that each plugin provides two files as follow.
>    plugins/PLUGIN_NAME/configure.m4
>    plugins/PLUGIN_NAME/plugin.spec
> Then autogen.sh catenates all plugins/{enabled_plugins}/configure.m4
> into one big plugins/plugins.m4. In configure.ac, it includes
> plugins/plugins.m4. When we invoke "make rpm", the Makefil scripts does
> the similar catenation of plugins/{enabled_plugins}/plugin.spec into
> plugins/plugins.spec, and have kimchi.spec include this file.
>
> Since the Debian packaging system is a different story, future patches
> shall be submitted to make Kimchi deb packaging code plugable.
>
> Signed-off-by: Zhou Zheng Sheng <zhshzhou at linux.vnet.ibm.com>
> ---
>   .gitignore                           |  2 ++
>   Makefile.am                          | 14 ++++++++------
>   autogen.sh                           | 13 +++++++++++++
>   configure.ac                         |  7 ++++---
>   contrib/kimchi.spec.fedora.in        |  4 ++++
>   contrib/kimchi.spec.suse.in          |  4 ++++
>   plugins/Makefile.am                  | 17 +++++++++++++++--
>   plugins/sample/Makefile.am           | 14 +++++++++++++-
>   plugins/sample/configure.m4          | 26 ++++++++++++++++++++++++++
>   plugins/sample/plugin.spec           | 17 +++++++++++++++++
>   plugins/sample/ui/config/Makefile.am |  6 +++++-
>   11 files changed, 111 insertions(+), 13 deletions(-)
>   create mode 100644 plugins/sample/configure.m4
>   create mode 100644 plugins/sample/plugin.spec
>
> diff --git a/.gitignore b/.gitignore
> index 67878e2..324325b 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -20,6 +20,8 @@ contrib/DEBIAN/control
>   contrib/kimchi.spec.fedora
>   contrib/kimchi.spec.suse
>   contrib/make-deb.sh
> +plugins/plugins.m4
> +plugins/plugins.spec
>   *.min.css
>   *.min.js
>   *.gmo
> diff --git a/Makefile.am b/Makefile.am
> index 6831b5d..b6a864c 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -35,9 +35,7 @@ EXTRA_DIST = \
>   # When fixing a file to conform with pep8, add it to the WL here.
>   # So it will be checked from now on.
>   PEP8_WHITELIST = \
> -	plugins/__init__.py \
> -	plugins/sample/__init__.py \
> -	plugins/sample/model.py \
> +	plugins \
>   	src/kimchi/asynctask.py \
>   	src/kimchi/auth.py \
>   	src/kimchi/cachebust.py \
> @@ -122,10 +120,14 @@ kimchi.spec: contrib/kimchi.spec.fedora contrib/kimchi.spec.suse
>   		/bin/false ;                                        \
>   	fi
>   
> -rpm: dist kimchi.spec
> +plugins/plugins.spec:
> +	cd plugins; \
> +	make plugins.spec
> +
> +rpm: dist kimchi.spec plugins/plugins.spec
>   	$(MKDIR_P) rpm/BUILD rpm/RPMS rpm/SOURCES rpm/SPECS rpm/SRPMS
>   	cp $(top_srcdir)/kimchi.spec rpm/SPECS/kimchi.spec
> -	cp $(DIST_ARCHIVES) rpm/SOURCES
> +	cp $(DIST_ARCHIVES) plugins/plugins.spec rpm/SOURCES
>   	rpmbuild -ba --define "_topdir `pwd`/rpm" rpm/SPECS/kimchi.spec
>   
>   fedora-rpm: contrib/kimchi.spec.fedora
> @@ -146,7 +148,7 @@ VERSION:
>   		git describe --abbrev=0 > $@;                     \
>   	fi
>   
> -.PHONY: deb install-deb rpm fedora-rpm suse-rpm ChangeLog VERSION
> +.PHONY: deb install-deb rpm fedora-rpm suse-rpm ChangeLog VERSION plugins/plugins.spec
>   
>   clean-local:
>   	rm -rf mo rpm
> diff --git a/autogen.sh b/autogen.sh
> index 0f22dba..75d85aa 100755
> --- a/autogen.sh
> +++ b/autogen.sh
> @@ -1,5 +1,18 @@
>   #!/bin/bash
>   
> +plugins_list=""
> +for opts in "$@" ; do
> +    if [[ "$opts" == "--with-plugins="* ]] ; then
> +        plugins_list=${opts#--with-plugins=}
> +        plugins_list=$(sed -e "s/,/ /g" <<< ${plugins_list})
> +    fi
> +done
> +
> +echo "" > plugins/plugins.m4
> +for plugin in ${plugins_list}; do
> +    cat plugins/${plugin}/configure.m4 >> plugins/plugins.m4
> +done
> +
>   aclocal
>   automake --add-missing
>   autoreconf
> diff --git a/configure.ac b/configure.ac
> index a625f35..75be00d 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -48,6 +48,10 @@ if test "x$PYFLAKES" = "x"; then
>     AC_MSG_WARN([pyflakes not found])
>   fi
>   
> +m4_include([plugins/plugins.m4])
> +
> +AC_SUBST([enabled_plugins], ["${enabled_plugins}"])
> +
>   
>   AC_CONFIG_FILES([
>       po/Makefile.in
> @@ -61,9 +65,6 @@ AC_CONFIG_FILES([
>       src/kimchi/control/vm/Makefile
>       src/kimchi/model/Makefile
>       plugins/Makefile
> -    plugins/sample/Makefile
> -    plugins/sample/ui/Makefile
> -    plugins/sample/ui/config/Makefile
>       ui/Makefile
>       ui/css/Makefile
>       ui/css/novnc/Makefile
> diff --git a/contrib/kimchi.spec.fedora.in b/contrib/kimchi.spec.fedora.in
> index bf80104..12b5f42 100644
> --- a/contrib/kimchi.spec.fedora.in
> +++ b/contrib/kimchi.spec.fedora.in
> @@ -10,6 +10,7 @@ BuildRoot:	%{_topdir}/BUILD/%{name}-%{version}-%{release}
>   Group:		System Environment/Base
>   License:	LGPL/ASL2
>   Source0:	%{name}-%{version}.tar.gz
> +Source1:	plugins.spec
>   Requires:	qemu-kvm
>   Requires:	gettext-devel
>   Requires:	libvirt
> @@ -140,6 +141,7 @@ rm -rf $RPM_BUILD_ROOT
>   %{python_sitelib}/kimchi/control/*.py*
>   %{python_sitelib}/kimchi/control/vm/*.py*
>   %{python_sitelib}/kimchi/model/*.py*
> +%{python_sitelib}/kimchi/plugins/*.py*
>   %{python_sitelib}/kimchi/API.json
>   %{_datadir}/kimchi/doc/API.md
>   %{_datadir}/kimchi/doc/README.md
> @@ -192,6 +194,8 @@ rm -rf $RPM_BUILD_ROOT
>   %{_initrddir}/kimchid
>   %endif
>   
> +%include %{SOURCE1}
> +
>   %changelog
>   * Tue Feb 11 2014 Crístian Viana <vianac at linux.vnet.ibm.com> 1.1.0
>   - Add help pages and XSLT dependency
> diff --git a/contrib/kimchi.spec.suse.in b/contrib/kimchi.spec.suse.in
> index cba0899..8432dab 100644
> --- a/contrib/kimchi.spec.suse.in
> +++ b/contrib/kimchi.spec.suse.in
> @@ -6,6 +6,7 @@ BuildRoot:	%{_topdir}/BUILD/%{name}-%{version}-%{release}
>   Group:		System Environment/Base
>   License:	LGPL/ASL2
>   Source0:	%{name}-%{version}.tar.gz
> +Source1:	plugins.spec
>   Requires:	kvm
>   Requires:	gettext-tools
>   Requires:	libvirt
> @@ -66,6 +67,7 @@ rm -rf $RPM_BUILD_ROOT
>   %{python_sitelib}/kimchi/control/*.py*
>   %{python_sitelib}/kimchi/control/vm/*.py*
>   %{python_sitelib}/kimchi/model/*.py*
> +%{python_sitelib}/kimchi/plugins/*.py*
>   %{python_sitelib}/kimchi/API.json
>   %{_datadir}/kimchi/doc/API.md
>   %{_datadir}/kimchi/doc/README.md
> @@ -108,6 +110,8 @@ rm -rf $RPM_BUILD_ROOT
>   %{_sysconfdir}/kimchi/distros.d/gentoo.json
>   %{_initrddir}/kimchid
>   
> +%include %{SOURCE1}
> +
>   %changelog
>   * Tue Feb 11 2014 Crístian Viana <vianac at linux.vnet.ibm.com> 1.1.0
>   - Add help pages and XSLT dependency
> diff --git a/plugins/Makefile.am b/plugins/Makefile.am
> index 2ceedae..2ec958f 100644
> --- a/plugins/Makefile.am
> +++ b/plugins/Makefile.am
> @@ -17,6 +17,19 @@
>   # License along with this library; if not, write to the Free Software
>   # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
>   
> -SUBDIRS = sample
> +SUBDIRS = $(enabled_plugins)
>   
> -EXTRA_DIST = __init__.py
> +plugins_PYTHON = \
> +	__init__.py
> +
> +pluginsdir = $(pythondir)/kimchi/plugins
> +
> +plugins.spec: $(SUBDIRS:%=%/plugin.spec) Makefile
> +	echo "" > plugins.spec
> +	for plugin in $(SUBDIRS); do \
> +	    cat $$plugin/plugin.spec >> plugins.spec; \
> +	done
> +
> +CLEANFILES = \
> +	plugins.spec \
> +	$(NULL)
> diff --git a/plugins/sample/Makefile.am b/plugins/sample/Makefile.am
> index e03a4c0..1d595c2 100644
> --- a/plugins/sample/Makefile.am
> +++ b/plugins/sample/Makefile.am
> @@ -19,4 +19,16 @@
>   
>   SUBDIRS = ui
>   
> -EXTRA_DIST = API.json sample.conf $(wildcard *.py)
> +sampledir = $(pythondir)/kimchi/plugins/sample
> +
> +confdir = $(sysconfdir)/kimchi/plugins.d
> +
> +sample_PYTHON = $(wildcard *.py)
> +
> +dist_conf_DATA = sample.conf
> +
> +EXTRA_DIST = API.json
> +
> +install-data-local:
> +	$(MKDIR_P) $(DESTDIR)$(sampledir)
> +	$(INSTALL_DATA) API.json $(DESTDIR)$(sampledir)/API.json
> diff --git a/plugins/sample/configure.m4 b/plugins/sample/configure.m4
> new file mode 100644
> index 0000000..b5d65f9
> --- /dev/null
> +++ b/plugins/sample/configure.m4
> @@ -0,0 +1,26 @@
> +#
> +# Kimchi
> +#
> +# Copyright IBM Corp, 2014
> +#
> +# This library is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU Lesser General Public
> +# License as published by the Free Software Foundation; either
> +# version 2.1 of the License, or (at your option) any later version.
> +#
> +# This library is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +# Lesser General Public License for more details.
> +#
> +# You should have received a copy of the GNU Lesser General Public
> +# License along with this library; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
> +
> +enabled_plugins="${enabled_plugins} sample"
> +
> +AC_CONFIG_FILES([
> +    plugins/sample/Makefile
> +    plugins/sample/ui/Makefile
> +    plugins/sample/ui/config/Makefile
> +])
> diff --git a/plugins/sample/plugin.spec b/plugins/sample/plugin.spec
> new file mode 100644
> index 0000000..9b6b03f
> --- /dev/null
> +++ b/plugins/sample/plugin.spec
> @@ -0,0 +1,17 @@
> +%package sample
> +Summary:	Sample plugin for Kimchi.
> +Requires:	%{name} = %{version}-%{release}
> +
> +%description sample
> +Kimchi is a web server application application to manage KVM/Qemu
> +virtual machines. Kimchi-sample is a sample plugin to demo how to write
> +plugin for Kimchi.
> +
> +
> +%files sample
> +%attr(-,root,root)
> +%{python_sitelib}/kimchi/plugins/sample/*.py*
> +%{python_sitelib}/kimchi/plugins/sample/API.json
> +%{_datadir}/kimchi/plugins/sample/ui/config/tab-ext.xml
> +%{_sysconfdir}/kimchi/plugins.d/sample.conf
> +
> diff --git a/plugins/sample/ui/config/Makefile.am b/plugins/sample/ui/config/Makefile.am
> index cf9e09e..eb05920 100644
> --- a/plugins/sample/ui/config/Makefile.am
> +++ b/plugins/sample/ui/config/Makefile.am
> @@ -17,5 +17,9 @@
>   # License along with this library; if not, write to the Free Software
>   # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
>   
> -EXTRA_DIST = tab-ext.xml
> +xmldir = $(datadir)/kimchi/plugins/sample/ui/config
> +
> +dist_xml_DATA = \
> +	tab-ext.xml \
> +	$(NULL)
>   




More information about the Kimchi-devel mailing list