From 268560f490582a700f87d3f93be3c52f306574b8 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Thu, 19 Mar 2015 14:07:50 +0300 Subject: [PATCH 01/28] add RPM module (Closes #49) Signed-off-by: Igor Gnatenko --- authors.txt | 1 + interpreter.py | 2 ++ modules/rpm.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 modules/rpm.py diff --git a/authors.txt b/authors.txt index 85a4770f5..8b0396cfe 100644 --- a/authors.txt +++ b/authors.txt @@ -10,3 +10,4 @@ Masashi Fujita Juhani Simola Robin McCorkell Axel Waggershauser +Igor Gnatenko diff --git a/interpreter.py b/interpreter.py index 98875ce45..edc7721ab 100644 --- a/interpreter.py +++ b/interpreter.py @@ -616,6 +616,8 @@ class ModuleHolder(InterpreterObject): self.interpreter.environment.get_build_dir()) state.subdir = self.interpreter.subdir state.environment = self.interpreter.environment + state.project_name = self.interpreter.build.project_name + state.targets = self.interpreter.build.targets value = fn(state, args, kwargs) return self.interpreter.module_method_callback(value) diff --git a/modules/rpm.py b/modules/rpm.py new file mode 100644 index 000000000..56f4ae08d --- /dev/null +++ b/modules/rpm.py @@ -0,0 +1,69 @@ +# Copyright 2015 The Meson development team + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +'''This module provides helper functions for RPM related +functionality such as generating RPM spec file.''' + +import build +import mlog + +class RPMModule: + + def generate_spec(self, state, args, kwargs): + proj = state.project_name.replace(' ', '_').replace('\t', '_') + fn = open('%s.spec' % proj, 'w+') + fn.write('Name: %s\n' % proj) + fn.write('\n') + for dep in state.environment.coredata.deps: + fn.write('BuildRequires: pkgconfig(%s)\n' % dep) + for lib in state.environment.coredata.ext_libs.values(): + fn.write('BuildRequires: %s # FIXME\n' % lib.fullpath) + mlog.log('Warning, replace', mlog.bold(lib.fullpath), 'with real package.', + 'You can use following command to find package which contains this lib:', + mlog.bold('dnf provides %s' % lib.fullpath)) + for prog in state.environment.coredata.ext_progs.values(): + fn.write('BuildRequires: %s\n' % ' '.join(prog.fullpath)) + fn.write('BuildRequires: meson\n') + fn.write('\n') + fn.write('%prep\n') + fn.write('%autosetup\n') + fn.write('rm -rf build && mkdir build\n') + fn.write('\n') + fn.write('%build\n') + fn.write('pushd build\n') + fn.write(' meson ..\n') + fn.write(' ninja-build -v\n') + fn.write('popd\n') + fn.write('\n') + fn.write('%isntall\n') + fn.write('pushd build\n') + fn.write(' DESTDIR=%{buildroot} ninja-build -v install\n') + fn.write('popd\n') + fn.write('\n') + fn.write('%files\n') + for target in state.targets.values(): + if isinstance(target, build.Executable) and target.need_install: + fn.write('%%{_bindir}/%s\n' % target.filename) + elif isinstance(target, build.SharedLibrary) and target.need_install: + fn.write('%%{_libdir}/%s\n' % target.filename) + elif isinstance(target, build.StaticLibrary) and target.need_install: + fn.write('%%{_libdir}/%s\n' % target.filename) + mlog.log('Warning, installing static libs (', + mlog.bold(target.filename), + ') not recommended') + fn.write('\n') + fn.close() + +def initialize(): + return RPMModule() From 5fa8cac6b3caeec350f1ec91b896d8d57dab9ffc Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Thu, 19 Mar 2015 16:51:46 +0300 Subject: [PATCH 02/28] modules/rpm: add support for devel subpkg Signed-off-by: Igor Gnatenko --- modules/rpm.py | 52 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/modules/rpm.py b/modules/rpm.py index 56f4ae08d..9c882d6d6 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -22,6 +22,28 @@ class RPMModule: def generate_spec(self, state, args, kwargs): proj = state.project_name.replace(' ', '_').replace('\t', '_') + so_installed = False + devel_subpkg = False + files = [] + files_devel = [] + for target in state.targets.values(): + if isinstance(target, build.Executable) and target.need_install: + files.append('%%{_bindir}/%s' % target.get_filename()) + elif isinstance(target, build.SharedLibrary) and target.need_install: + files.append('%%{_libdir}/%s' % target.get_filename()) + for alias in target.get_aliaslist(): + if alias.endswith('.so'): + files_devel.append('%%{_libdir}/%s' % alias) + else: + files.append('%%{_libdir}/%s' % alias) + so_installed = True + elif isinstance(target, build.StaticLibrary) and target.need_install: + files.append('%%{_libdir}/%s' % target.get_filename()) + mlog.log('Warning, installing static libs (', + mlog.bold(target.get_filename()), + ') not recommended') + if len(files_devel) > 0: + devel_subpkg = True fn = open('%s.spec' % proj, 'w+') fn.write('Name: %s\n' % proj) fn.write('\n') @@ -36,6 +58,14 @@ class RPMModule: fn.write('BuildRequires: %s\n' % ' '.join(prog.fullpath)) fn.write('BuildRequires: meson\n') fn.write('\n') + fn.write('%description\n') + fn.write('\n') + if devel_subpkg: + fn.write('%package devel\n') + fn.write('Requires: %{name}%{?_isa} = %{version}-%{release}\n') + fn.write('\n') + fn.write('%description devel\n') + fn.write('\n') fn.write('%prep\n') fn.write('%autosetup\n') fn.write('rm -rf build && mkdir build\n') @@ -52,16 +82,18 @@ class RPMModule: fn.write('popd\n') fn.write('\n') fn.write('%files\n') - for target in state.targets.values(): - if isinstance(target, build.Executable) and target.need_install: - fn.write('%%{_bindir}/%s\n' % target.filename) - elif isinstance(target, build.SharedLibrary) and target.need_install: - fn.write('%%{_libdir}/%s\n' % target.filename) - elif isinstance(target, build.StaticLibrary) and target.need_install: - fn.write('%%{_libdir}/%s\n' % target.filename) - mlog.log('Warning, installing static libs (', - mlog.bold(target.filename), - ') not recommended') + for f in files: + fn.write('%s\n' % f) + fn.write('\n') + if devel_subpkg: + fn.write('%files devel\n') + for f in files_devel: + fn.write('%s\n' % f) + fn.write('\n') + if so_installed: + fn.write('%post -p /sbin/ldconfig\n') + fn.write('\n') + fn.write('%postun -p /sbin/ldconfig\n') fn.write('\n') fn.close() From 0a7bc1ffb7682dfaad2a22b376dd0988d42a7da0 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Thu, 19 Mar 2015 16:52:05 +0300 Subject: [PATCH 03/28] modules/rpm: fix typo in install macros Signed-off-by: Igor Gnatenko --- modules/rpm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rpm.py b/modules/rpm.py index 9c882d6d6..adbe79695 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -76,7 +76,7 @@ class RPMModule: fn.write(' ninja-build -v\n') fn.write('popd\n') fn.write('\n') - fn.write('%isntall\n') + fn.write('%install\n') fn.write('pushd build\n') fn.write(' DESTDIR=%{buildroot} ninja-build -v install\n') fn.write('popd\n') From be7bea6b083b144825dfb43aaa40a6fe829e7afc Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Thu, 19 Mar 2015 16:57:43 +0300 Subject: [PATCH 04/28] modules/rpm: add changelog Signed-off-by: Igor Gnatenko --- modules/rpm.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/rpm.py b/modules/rpm.py index adbe79695..1fa66608c 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -16,6 +16,7 @@ functionality such as generating RPM spec file.''' import build +import datetime import mlog class RPMModule: @@ -95,6 +96,10 @@ class RPMModule: fn.write('\n') fn.write('%postun -p /sbin/ldconfig\n') fn.write('\n') + fn.write('%changelog\n') + fn.write('* %s meson - \n' % datetime.date.today().strftime('%a %b %d %Y')) + fn.write('- \n') + fn.write('\n') fn.close() def initialize(): From bcf6ff15a41c21cc9ee0fc241a897e1c11e81c2d Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 20 Mar 2015 01:26:48 +0300 Subject: [PATCH 05/28] modules/rpm: add example Signed-off-by: Igor Gnatenko --- manual tests/4 rpm/lib.c | 6 ++++++ manual tests/4 rpm/lib.h | 1 + manual tests/4 rpm/main.c | 8 ++++++++ manual tests/4 rpm/meson.build | 13 +++++++++++++ 4 files changed, 28 insertions(+) create mode 100644 manual tests/4 rpm/lib.c create mode 100644 manual tests/4 rpm/lib.h create mode 100644 manual tests/4 rpm/main.c create mode 100644 manual tests/4 rpm/meson.build diff --git a/manual tests/4 rpm/lib.c b/manual tests/4 rpm/lib.c new file mode 100644 index 000000000..efc230aab --- /dev/null +++ b/manual tests/4 rpm/lib.c @@ -0,0 +1,6 @@ +#include"lib.h" + +char *meson_print(void) +{ + return "Hello, world!"; +} diff --git a/manual tests/4 rpm/lib.h b/manual tests/4 rpm/lib.h new file mode 100644 index 000000000..08fc9611c --- /dev/null +++ b/manual tests/4 rpm/lib.h @@ -0,0 +1 @@ +char *meson_print(void); diff --git a/manual tests/4 rpm/main.c b/manual tests/4 rpm/main.c new file mode 100644 index 000000000..5c4672192 --- /dev/null +++ b/manual tests/4 rpm/main.c @@ -0,0 +1,8 @@ +#include +#include +int main(int argc, char **argv) +{ + char *t = meson_print(); + printf("%s", t); + return 0; +} diff --git a/manual tests/4 rpm/meson.build b/manual tests/4 rpm/meson.build new file mode 100644 index 000000000..bb8991689 --- /dev/null +++ b/manual tests/4 rpm/meson.build @@ -0,0 +1,13 @@ +project('test spec', 'c') + +rpm = import('rpm') +dependency('zlib') + +lib = shared_library('mesontest_shared', ['lib.c', 'lib.h'], + version : '0.1', soversion : '0', + install : true) +executable('mesontest-bin', 'main.c', + link_with : lib, + install : true) + +rpm.generate_spec() From d133fc3fa2d99db35534e21117fea52200845d05 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 20 Mar 2015 01:27:10 +0300 Subject: [PATCH 06/28] modules/rpm: ignore static libs Signed-off-by: Igor Gnatenko --- modules/rpm.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/rpm.py b/modules/rpm.py index 1fa66608c..72694af0e 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -27,6 +27,7 @@ class RPMModule: devel_subpkg = False files = [] files_devel = [] + to_delete = [] for target in state.targets.values(): if isinstance(target, build.Executable) and target.need_install: files.append('%%{_bindir}/%s' % target.get_filename()) @@ -39,10 +40,9 @@ class RPMModule: files.append('%%{_libdir}/%s' % alias) so_installed = True elif isinstance(target, build.StaticLibrary) and target.need_install: - files.append('%%{_libdir}/%s' % target.get_filename()) - mlog.log('Warning, installing static libs (', - mlog.bold(target.get_filename()), - ') not recommended') + to_delete.append('%%{buildroot}%%{_libdir}/%s' % target.get_filename()) + mlog.log('Ignoring', mlog.bold(target.get_filename()), + 'because packaging static libs not recommended') if len(files_devel) > 0: devel_subpkg = True fn = open('%s.spec' % proj, 'w+') @@ -81,6 +81,8 @@ class RPMModule: fn.write('pushd build\n') fn.write(' DESTDIR=%{buildroot} ninja-build -v install\n') fn.write('popd\n') + if len(to_delete) > 0: + fn.write('rm -rf %s\n' % ' '.join(to_delete)) fn.write('\n') fn.write('%files\n') for f in files: From 6e7c921d15bab56810ce8336b7296f86534dd170 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 20 Mar 2015 22:48:12 +0300 Subject: [PATCH 07/28] modules/rpm: rename to generate_spec_template Signed-off-by: Igor Gnatenko --- manual tests/4 rpm/meson.build | 2 +- modules/rpm.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/manual tests/4 rpm/meson.build b/manual tests/4 rpm/meson.build index bb8991689..ebbbdfde9 100644 --- a/manual tests/4 rpm/meson.build +++ b/manual tests/4 rpm/meson.build @@ -10,4 +10,4 @@ executable('mesontest-bin', 'main.c', link_with : lib, install : true) -rpm.generate_spec() +rpm.generate_spec_template() diff --git a/modules/rpm.py b/modules/rpm.py index 72694af0e..263ab4d5c 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -21,7 +21,7 @@ import mlog class RPMModule: - def generate_spec(self, state, args, kwargs): + def generate_spec_template(self, state, args, kwargs): proj = state.project_name.replace(' ', '_').replace('\t', '_') so_installed = False devel_subpkg = False From 2d7e5b89f41a871f3da7c012152930ddca98bb39 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 20 Mar 2015 22:53:15 +0300 Subject: [PATCH 08/28] modules/rpm: create spec in build_dir Signed-off-by: Igor Gnatenko --- modules/rpm.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/rpm.py b/modules/rpm.py index 263ab4d5c..08d655a51 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -18,6 +18,7 @@ functionality such as generating RPM spec file.''' import build import datetime import mlog +import os class RPMModule: @@ -45,7 +46,8 @@ class RPMModule: 'because packaging static libs not recommended') if len(files_devel) > 0: devel_subpkg = True - fn = open('%s.spec' % proj, 'w+') + fn = open('%s.spec' % os.path.join(state.environment.get_build_dir(), proj), + 'w+') fn.write('Name: %s\n' % proj) fn.write('\n') for dep in state.environment.coredata.deps: From 0718d369312d26d255650421075b3bd1e9ccab3d Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 20 Mar 2015 23:44:58 +0300 Subject: [PATCH 09/28] modules/rpm: use rpmbuilddir instead of build dir because some of projects using `build` directory for internal use Signed-off-by: Igor Gnatenko --- modules/rpm.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/rpm.py b/modules/rpm.py index 08d655a51..bbd048b11 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -71,16 +71,16 @@ class RPMModule: fn.write('\n') fn.write('%prep\n') fn.write('%autosetup\n') - fn.write('rm -rf build && mkdir build\n') + fn.write('rm -rf rpmbuilddir && mkdir rpmbuilddir\n') fn.write('\n') fn.write('%build\n') - fn.write('pushd build\n') + fn.write('pushd rpmbuilddir\n') fn.write(' meson ..\n') fn.write(' ninja-build -v\n') fn.write('popd\n') fn.write('\n') fn.write('%install\n') - fn.write('pushd build\n') + fn.write('pushd rpmbuilddir\n') fn.write(' DESTDIR=%{buildroot} ninja-build -v install\n') fn.write('popd\n') if len(to_delete) > 0: From 11d95bd5aba15bb6fa7136f2637aa4d5e133376b Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 20 Mar 2015 23:47:21 +0300 Subject: [PATCH 10/28] modules/rpm: pass RPM CFLAGS and others Signed-off-by: Igor Gnatenko --- modules/rpm.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/rpm.py b/modules/rpm.py index bbd048b11..97d3d8666 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -72,10 +72,12 @@ class RPMModule: fn.write('%prep\n') fn.write('%autosetup\n') fn.write('rm -rf rpmbuilddir && mkdir rpmbuilddir\n') + fn.write('echo "#!/bin/bash" > rpmbuilddir/configure && chmod +x rpmbuilddir/configure\n') fn.write('\n') fn.write('%build\n') fn.write('pushd rpmbuilddir\n') - fn.write(' meson ..\n') + fn.write(' %configure\n') + fn.write(' meson .. --buildtype=plain\n') fn.write(' ninja-build -v\n') fn.write('popd\n') fn.write('\n') From 0a43406059cfc726a259c0da20d7ec3650e7867a Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 20 Mar 2015 23:51:44 +0300 Subject: [PATCH 11/28] modules/rpm: enable tests in check section Signed-off-by: Igor Gnatenko --- modules/rpm.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/rpm.py b/modules/rpm.py index 97d3d8666..d50e0f65d 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -88,6 +88,11 @@ class RPMModule: if len(to_delete) > 0: fn.write('rm -rf %s\n' % ' '.join(to_delete)) fn.write('\n') + fn.write('%check\n') + fn.write('pushd rpmbuilddir\n') + fn.write(' ninja-build -v test\n') + fn.write('popd\n') + fn.write('\n') fn.write('%files\n') for f in files: fn.write('%s\n' % f) From 8a58acd0ae5b198f5ac98a90213a7b587eecfb9e Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 20 Mar 2015 23:58:37 +0300 Subject: [PATCH 12/28] modules/rpm: add description/summary for devel subpkg Signed-off-by: Igor Gnatenko --- modules/rpm.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/rpm.py b/modules/rpm.py index d50e0f65d..4a69f5904 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -65,9 +65,11 @@ class RPMModule: fn.write('\n') if devel_subpkg: fn.write('%package devel\n') + fn.write('Summary: Development files for %{name}\n') fn.write('Requires: %{name}%{?_isa} = %{version}-%{release}\n') fn.write('\n') fn.write('%description devel\n') + fn.write('Development files for %{name}\n') fn.write('\n') fn.write('%prep\n') fn.write('%autosetup\n') From b8b77e7ccc78ad038f255f5833daed52ea35cfcc Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 20 Mar 2015 23:59:33 +0300 Subject: [PATCH 13/28] modules/rpm: improve message about removing static libs Signed-off-by: Igor Gnatenko --- modules/rpm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/rpm.py b/modules/rpm.py index 4a69f5904..bb81d6649 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -42,8 +42,8 @@ class RPMModule: so_installed = True elif isinstance(target, build.StaticLibrary) and target.need_install: to_delete.append('%%{buildroot}%%{_libdir}/%s' % target.get_filename()) - mlog.log('Ignoring', mlog.bold(target.get_filename()), - 'because packaging static libs not recommended') + mlog.log('Warning, removing', mlog.bold(target.get_filename()), + 'from package because packaging static libs not recommended') if len(files_devel) > 0: devel_subpkg = True fn = open('%s.spec' % os.path.join(state.environment.get_build_dir(), proj), From 953edd9fc908c162869e51c0bb191c303166220e Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 00:30:12 +0300 Subject: [PATCH 14/28] modules/rpm: add compilers to BuildRequires automatically Signed-off-by: Igor Gnatenko --- interpreter.py | 1 + modules/rpm.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/interpreter.py b/interpreter.py index edc7721ab..35722ab25 100644 --- a/interpreter.py +++ b/interpreter.py @@ -617,6 +617,7 @@ class ModuleHolder(InterpreterObject): state.subdir = self.interpreter.subdir state.environment = self.interpreter.environment state.project_name = self.interpreter.build.project_name + state.compilers = self.interpreter.build.compilers state.targets = self.interpreter.build.targets value = fn(state, args, kwargs) return self.interpreter.module_method_callback(value) diff --git a/modules/rpm.py b/modules/rpm.py index bb81d6649..257c3d094 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -16,6 +16,7 @@ functionality such as generating RPM spec file.''' import build +import compilers import datetime import mlog import os @@ -23,6 +24,24 @@ import os class RPMModule: def generate_spec_template(self, state, args, kwargs): + compiler_deps = set() + for compiler in state.compilers: + if isinstance(compiler, compilers.ValaCompiler): + compiler_deps.add('vala') + elif isinstance(compiler, compilers.GnuFortranCompiler): + compiler_deps.add('gcc-gfortran') + elif isinstance(compiler, compilers.GnuObjCCompiler): + compiler_deps.add('gcc-objc') + elif compiler == compilers.GnuObjCPPCompiler: + compiler_deps.add('gcc-objc++') + elif isinstance(compiler, compilers.GnuCCompiler) or \ + isinstance(compiler, compilers.GnuCPPCompiler): + # Installed by default + pass + else: + mlog.log('RPM spec file will not created, generating not allowed for:', + mlog.bold(compiler.get_id())) + return proj = state.project_name.replace(' ', '_').replace('\t', '_') so_installed = False devel_subpkg = False @@ -50,6 +69,8 @@ class RPMModule: 'w+') fn.write('Name: %s\n' % proj) fn.write('\n') + for compiler in compiler_deps: + fn.write('BuildRequires: %s\n' % compiler) for dep in state.environment.coredata.deps: fn.write('BuildRequires: pkgconfig(%s)\n' % dep) for lib in state.environment.coredata.ext_libs.values(): From 3e10458e1930fc89ab59b6db22af52ee2464d3d6 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 00:30:27 +0300 Subject: [PATCH 15/28] modules/rpm: update doc about module Signed-off-by: Igor Gnatenko --- modules/rpm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rpm.py b/modules/rpm.py index 257c3d094..66cc480e9 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -13,7 +13,7 @@ # limitations under the License. '''This module provides helper functions for RPM related -functionality such as generating RPM spec file.''' +functionality such as generating template RPM spec file.''' import build import compilers From 84e2776d986c89619b6c3e36a04e00d861995e10 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 00:31:08 +0300 Subject: [PATCH 16/28] modules/rpm: fix ident Signed-off-by: Igor Gnatenko --- modules/rpm.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/rpm.py b/modules/rpm.py index 66cc480e9..2ab88ffe5 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -126,9 +126,9 @@ class RPMModule: fn.write('%s\n' % f) fn.write('\n') if so_installed: - fn.write('%post -p /sbin/ldconfig\n') - fn.write('\n') - fn.write('%postun -p /sbin/ldconfig\n') + fn.write('%post -p /sbin/ldconfig\n') + fn.write('\n') + fn.write('%postun -p /sbin/ldconfig\n') fn.write('\n') fn.write('%changelog\n') fn.write('* %s meson - \n' % datetime.date.today().strftime('%a %b %d %Y')) From 53f0a1ba0755e43226ce9582d4613af6b5c24d91 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 00:44:37 +0300 Subject: [PATCH 17/28] modules/rpm: generate required basic RPM tags Signed-off-by: Igor Gnatenko --- modules/rpm.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/rpm.py b/modules/rpm.py index 2ab88ffe5..b6238b0b4 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -68,6 +68,12 @@ class RPMModule: fn = open('%s.spec' % os.path.join(state.environment.get_build_dir(), proj), 'w+') fn.write('Name: %s\n' % proj) + fn.write('Version: # FIXME\n') + fn.write('Release: 1%{?dist}\n') + fn.write('Summary: # FIXME\n') + fn.write('License: # FIXME\n') + fn.write('\n') + fn.write('Source0: %{name}-%{version}.tar.xz # FIXME\n') fn.write('\n') for compiler in compiler_deps: fn.write('BuildRequires: %s\n' % compiler) @@ -135,6 +141,7 @@ class RPMModule: fn.write('- \n') fn.write('\n') fn.close() + mlog.log('Please, look at RPM spec file and fix FIXME\'s') def initialize(): return RPMModule() From 9d9f90f6ed0414467e06c544ad9f3a4b0c3384ce Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 00:45:02 +0300 Subject: [PATCH 18/28] modules/rpm: add fullstop in description for devel subpkg Signed-off-by: Igor Gnatenko --- modules/rpm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rpm.py b/modules/rpm.py index b6238b0b4..8e5f655ee 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -96,7 +96,7 @@ class RPMModule: fn.write('Requires: %{name}%{?_isa} = %{version}-%{release}\n') fn.write('\n') fn.write('%description devel\n') - fn.write('Development files for %{name}\n') + fn.write('Development files for %{name}.\n') fn.write('\n') fn.write('%prep\n') fn.write('%autosetup\n') From f4cb1181909f9279a51cbf1be363e676d3397b40 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 00:49:38 +0300 Subject: [PATCH 19/28] modules/rpm: simplify isinstance check to oneline Signed-off-by: Igor Gnatenko --- modules/rpm.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/rpm.py b/modules/rpm.py index 8e5f655ee..0408ac8d6 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -34,8 +34,7 @@ class RPMModule: compiler_deps.add('gcc-objc') elif compiler == compilers.GnuObjCPPCompiler: compiler_deps.add('gcc-objc++') - elif isinstance(compiler, compilers.GnuCCompiler) or \ - isinstance(compiler, compilers.GnuCPPCompiler): + elif isinstance(compiler, (compilers.GnuCCompiler, compilers.GnuCPPCompiler)): # Installed by default pass else: From d8c2f187068a8b7b1333dc59b1c9c28df787df9f Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 00:51:09 +0300 Subject: [PATCH 20/28] modules/rpm: rename 4 to 5 in tests dir Signed-off-by: Igor Gnatenko --- manual tests/{4 rpm => 5 rpm}/lib.c | 0 manual tests/{4 rpm => 5 rpm}/lib.h | 0 manual tests/{4 rpm => 5 rpm}/main.c | 0 manual tests/{4 rpm => 5 rpm}/meson.build | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename manual tests/{4 rpm => 5 rpm}/lib.c (100%) rename manual tests/{4 rpm => 5 rpm}/lib.h (100%) rename manual tests/{4 rpm => 5 rpm}/main.c (100%) rename manual tests/{4 rpm => 5 rpm}/meson.build (100%) diff --git a/manual tests/4 rpm/lib.c b/manual tests/5 rpm/lib.c similarity index 100% rename from manual tests/4 rpm/lib.c rename to manual tests/5 rpm/lib.c diff --git a/manual tests/4 rpm/lib.h b/manual tests/5 rpm/lib.h similarity index 100% rename from manual tests/4 rpm/lib.h rename to manual tests/5 rpm/lib.h diff --git a/manual tests/4 rpm/main.c b/manual tests/5 rpm/main.c similarity index 100% rename from manual tests/4 rpm/main.c rename to manual tests/5 rpm/main.c diff --git a/manual tests/4 rpm/meson.build b/manual tests/5 rpm/meson.build similarity index 100% rename from manual tests/4 rpm/meson.build rename to manual tests/5 rpm/meson.build From a7cd29c74b68d34db9066bdfa8a24be1cd8e4667 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 01:50:42 +0300 Subject: [PATCH 21/28] modules/rpm: implement handling includedirs Signed-off-by: Igor Gnatenko --- interpreter.py | 1 + modules/rpm.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/interpreter.py b/interpreter.py index 35722ab25..4ca5e589a 100644 --- a/interpreter.py +++ b/interpreter.py @@ -619,6 +619,7 @@ class ModuleHolder(InterpreterObject): state.project_name = self.interpreter.build.project_name state.compilers = self.interpreter.build.compilers state.targets = self.interpreter.build.targets + state.headers = self.interpreter.build.get_headers() value = fn(state, args, kwargs) return self.interpreter.module_method_callback(value) diff --git a/modules/rpm.py b/modules/rpm.py index 0408ac8d6..97e50bd91 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -62,6 +62,10 @@ class RPMModule: to_delete.append('%%{buildroot}%%{_libdir}/%s' % target.get_filename()) mlog.log('Warning, removing', mlog.bold(target.get_filename()), 'from package because packaging static libs not recommended') + for header in state.headers: + for hdr_src in header.get_sources(): + files_devel.append('%%{_includedir}/%s' % os.path.join( + header.get_install_subdir(), hdr_src)) if len(files_devel) > 0: devel_subpkg = True fn = open('%s.spec' % os.path.join(state.environment.get_build_dir(), proj), From 51a68380480ec8ab092dc57e6ced6d8a51084ba6 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 02:04:32 +0300 Subject: [PATCH 22/28] modules/rpm: own directories for subdirs in headers Signed-off-by: Igor Gnatenko --- modules/rpm.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/rpm.py b/modules/rpm.py index 97e50bd91..5e421cb08 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -63,9 +63,11 @@ class RPMModule: mlog.log('Warning, removing', mlog.bold(target.get_filename()), 'from package because packaging static libs not recommended') for header in state.headers: - for hdr_src in header.get_sources(): - files_devel.append('%%{_includedir}/%s' % os.path.join( - header.get_install_subdir(), hdr_src)) + if len(header.get_install_subdir()) > 0: + files_devel.append('%%{_includedir}/%s/' % header.get_install_subdir()) + else: + for hdr_src in header.get_sources(): + files_devel.append('%%{_includedir}/%s' % hdr_src) if len(files_devel) > 0: devel_subpkg = True fn = open('%s.spec' % os.path.join(state.environment.get_build_dir(), proj), From 8bf4415dbdcffd73337599a2b887c019d0ca2c3c Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 02:04:59 +0300 Subject: [PATCH 23/28] modules/rpm: handle mans Signed-off-by: Igor Gnatenko --- interpreter.py | 1 + modules/rpm.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/interpreter.py b/interpreter.py index 4ca5e589a..ace06383d 100644 --- a/interpreter.py +++ b/interpreter.py @@ -620,6 +620,7 @@ class ModuleHolder(InterpreterObject): state.compilers = self.interpreter.build.compilers state.targets = self.interpreter.build.targets state.headers = self.interpreter.build.get_headers() + state.man = self.interpreter.build.get_man() value = fn(state, args, kwargs) return self.interpreter.module_method_callback(value) diff --git a/modules/rpm.py b/modules/rpm.py index 5e421cb08..7e8214fb4 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -68,6 +68,9 @@ class RPMModule: else: for hdr_src in header.get_sources(): files_devel.append('%%{_includedir}/%s' % hdr_src) + for man in state.man: + for man_file in man.get_sources(): + files.append('%%{_mandir}/man%u/%s.*' % (int(man_file.split('.')[-1]), man_file)) if len(files_devel) > 0: devel_subpkg = True fn = open('%s.spec' % os.path.join(state.environment.get_build_dir(), proj), From 5c6bc7ad5e5abeabcf8e6e55938e3de8bc086f50 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 02:32:17 +0300 Subject: [PATCH 24/28] modules/rpm: use set() instead of list() always to ignore dupes Signed-off-by: Igor Gnatenko --- modules/rpm.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/rpm.py b/modules/rpm.py index 7e8214fb4..bd3d2f318 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -44,33 +44,33 @@ class RPMModule: proj = state.project_name.replace(' ', '_').replace('\t', '_') so_installed = False devel_subpkg = False - files = [] - files_devel = [] - to_delete = [] + files = set() + files_devel = set() + to_delete = set() for target in state.targets.values(): if isinstance(target, build.Executable) and target.need_install: - files.append('%%{_bindir}/%s' % target.get_filename()) + files.add('%%{_bindir}/%s' % target.get_filename()) elif isinstance(target, build.SharedLibrary) and target.need_install: - files.append('%%{_libdir}/%s' % target.get_filename()) + files.add('%%{_libdir}/%s' % target.get_filename()) for alias in target.get_aliaslist(): if alias.endswith('.so'): - files_devel.append('%%{_libdir}/%s' % alias) + files_devel.add('%%{_libdir}/%s' % alias) else: - files.append('%%{_libdir}/%s' % alias) + files.add('%%{_libdir}/%s' % alias) so_installed = True elif isinstance(target, build.StaticLibrary) and target.need_install: - to_delete.append('%%{buildroot}%%{_libdir}/%s' % target.get_filename()) + to_delete.add('%%{buildroot}%%{_libdir}/%s' % target.get_filename()) mlog.log('Warning, removing', mlog.bold(target.get_filename()), 'from package because packaging static libs not recommended') for header in state.headers: if len(header.get_install_subdir()) > 0: - files_devel.append('%%{_includedir}/%s/' % header.get_install_subdir()) + files_devel.add('%%{_includedir}/%s/' % header.get_install_subdir()) else: for hdr_src in header.get_sources(): - files_devel.append('%%{_includedir}/%s' % hdr_src) + files_devel.add('%%{_includedir}/%s' % hdr_src) for man in state.man: for man_file in man.get_sources(): - files.append('%%{_mandir}/man%u/%s.*' % (int(man_file.split('.')[-1]), man_file)) + files.add('%%{_mandir}/man%u/%s.*' % (int(man_file.split('.')[-1]), man_file)) if len(files_devel) > 0: devel_subpkg = True fn = open('%s.spec' % os.path.join(state.environment.get_build_dir(), proj), From 6cc8881a5200f7cdb26b8225fc582bd0b5cbb3bc Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 14:22:34 +0300 Subject: [PATCH 25/28] modules/rpm: use plain set up of compiler and linker flags to avoid using empty configure file Signed-off-by: Igor Gnatenko --- modules/rpm.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/rpm.py b/modules/rpm.py index bd3d2f318..422d13284 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -109,12 +109,15 @@ class RPMModule: fn.write('%prep\n') fn.write('%autosetup\n') fn.write('rm -rf rpmbuilddir && mkdir rpmbuilddir\n') - fn.write('echo "#!/bin/bash" > rpmbuilddir/configure && chmod +x rpmbuilddir/configure\n') fn.write('\n') fn.write('%build\n') fn.write('pushd rpmbuilddir\n') - fn.write(' %configure\n') - fn.write(' meson .. --buildtype=plain\n') + fn.write(' CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS\n') + fn.write(' CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS\n') + fn.write(' FFLAGS="${FFLAGS:-%optflags%{?_fmoddir: -I%_fmoddir}}" ; export FFLAGS\n') + fn.write(' FCFLAGS="${FCFLAGS:-%optflags%{?_fmoddir: -I%_fmoddir}}" ; export FCFLAGS\n') + fn.write(' %{?__global_ldflags:LDFLAGS="${LDFLAGS:-%__global_ldflags}" ; export LDFLAGS ;}\n') + fn.write(' meson .. --buildtype=plain --prefix=%{_prefix}\n') fn.write(' ninja-build -v\n') fn.write('popd\n') fn.write('\n') From 8c5ead3bdf47f77fcb7976193384331da6593944 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 14:42:55 +0300 Subject: [PATCH 26/28] install: implement RPM macros. Closes #55 Signed-off-by: Igor Gnatenko --- install_meson.py | 6 ++++++ macros.meson | 11 +++++++++++ 2 files changed, 17 insertions(+) create mode 100644 macros.meson diff --git a/install_meson.py b/install_meson.py index 6a1efdffe..298de9609 100755 --- a/install_meson.py +++ b/install_meson.py @@ -54,6 +54,7 @@ in_guimanfile = 'man/mesongui.1' out_guimanfile = os.path.join(man_dir, 'mesongui.1.gz') in_confmanfile = 'man/mesonconf.1' out_confmanfile = os.path.join(man_dir, 'mesonconf.1.gz') +rpmmacros_dir = os.path.join(install_root, 'lib/rpm/macros.d') symlink_value = os.path.relpath(bin_script, os.path.dirname(bin_name)) guisymlink_value = os.path.relpath(gui_script, os.path.dirname(gui_name)) @@ -105,3 +106,8 @@ if os.path.exists('modules/__pycache__'): if os.path.exists(module_dir): shutil.rmtree(module_dir) shutil.copytree('modules', module_dir) + +print('Installing RPM macros to %s.' % rpmmacros_dir) +outfilename = os.path.join(rpmmacros_dir, 'macros.meson') +shutil.copyfile('macros.meson', outfilename) +shutil.copystat('macros.meson', outfilename) diff --git a/macros.meson b/macros.meson new file mode 100644 index 000000000..42ad94953 --- /dev/null +++ b/macros.meson @@ -0,0 +1,11 @@ +%__meson /usr/bin/meson + +%meson \ + CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS ; \ + CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS ; \ + FFLAGS="${FFLAGS:-%optflags%{?_fmoddir: -I%_fmoddir}}" ; export FFLAGS ; \ + FCFLAGS="${FCFLAGS:-%optflags%{?_fmoddir: -I%_fmoddir}}" ; export FCFLAGS ; \ + %{?__global_ldflags:LDFLAGS="${LDFLAGS:-%__global_ldflags}" ; export LDFLAGS ;} \ + %__meson \\\ + --prefix=%{_prefix} \\\ + --buildtype=plain From d7bb431e5da2bff51281ae3db0f03557a52507b9 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 14:46:55 +0300 Subject: [PATCH 27/28] modules/rpm: use meson RPM macros Signed-off-by: Igor Gnatenko --- modules/rpm.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/rpm.py b/modules/rpm.py index 422d13284..851333923 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -112,12 +112,7 @@ class RPMModule: fn.write('\n') fn.write('%build\n') fn.write('pushd rpmbuilddir\n') - fn.write(' CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS\n') - fn.write(' CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS\n') - fn.write(' FFLAGS="${FFLAGS:-%optflags%{?_fmoddir: -I%_fmoddir}}" ; export FFLAGS\n') - fn.write(' FCFLAGS="${FCFLAGS:-%optflags%{?_fmoddir: -I%_fmoddir}}" ; export FCFLAGS\n') - fn.write(' %{?__global_ldflags:LDFLAGS="${LDFLAGS:-%__global_ldflags}" ; export LDFLAGS ;}\n') - fn.write(' meson .. --buildtype=plain --prefix=%{_prefix}\n') + fn.write(' %meson ..\n') fn.write(' ninja-build -v\n') fn.write('popd\n') fn.write('\n') From b71d248b28203a294ba6e3ba32ed9c6d36d3209b Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 21 Mar 2015 14:57:53 +0300 Subject: [PATCH 28/28] modules/rpm: handle pkgconfig files Signed-off-by: Igor Gnatenko --- interpreter.py | 1 + modules/rpm.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/interpreter.py b/interpreter.py index ace06383d..9aae7a487 100644 --- a/interpreter.py +++ b/interpreter.py @@ -621,6 +621,7 @@ class ModuleHolder(InterpreterObject): state.targets = self.interpreter.build.targets state.headers = self.interpreter.build.get_headers() state.man = self.interpreter.build.get_man() + state.pkgconfig_gens = self.interpreter.build.pkgconfig_gens value = fn(state, args, kwargs) return self.interpreter.module_method_callback(value) diff --git a/modules/rpm.py b/modules/rpm.py index 851333923..57c1de5f9 100644 --- a/modules/rpm.py +++ b/modules/rpm.py @@ -71,6 +71,8 @@ class RPMModule: for man in state.man: for man_file in man.get_sources(): files.add('%%{_mandir}/man%u/%s.*' % (int(man_file.split('.')[-1]), man_file)) + for pkgconfig in state.pkgconfig_gens: + files_devel.add('%%{_libdir}/pkgconfig/%s.pc' % pkgconfig.filebase) if len(files_devel) > 0: devel_subpkg = True fn = open('%s.spec' % os.path.join(state.environment.get_build_dir(), proj),