diff --git a/build.py b/build.py index 96e345f07..688f016c0 100644 --- a/build.py +++ b/build.py @@ -26,6 +26,7 @@ class Build: self.compilers = [] self.tests = [] self.headers = [] + self.man = [] self.static_linker = self.environment.detect_static_linker() def get_project(self): @@ -39,3 +40,6 @@ class Build: def get_headers(self): return self.headers + + def get_man(self): + return self.man diff --git a/builder.py b/builder.py index 07325cdec..d48c5a16b 100755 --- a/builder.py +++ b/builder.py @@ -27,6 +27,7 @@ parser.add_option('--libdir', default='lib', dest='libdir') parser.add_option('--bindir', default='bin', dest='bindir') parser.add_option('--includedir', default='include', dest='includedir') parser.add_option('--datadir', default='share', dest='datadir') +parser.add_option('--mandir' , default='share/man', dest='mandir') class BuilderApp(): builder_filename = 'builder.txt' diff --git a/environment.py b/environment.py index baf086188..ec2d73c72 100755 --- a/environment.py +++ b/environment.py @@ -230,22 +230,25 @@ class Environment(): def get_static_lib_suffix(self): return self.static_lib_suffix - + def get_object_suffix(self): return self.object_suffix - + def get_prefix(self): return self.options.prefix - + def get_libdir(self): return self.options.libdir - + def get_bindir(self): return self.options.bindir - + def get_includedir(self): return self.options.includedir + def get_mandir(self): + return self.options.mandir + # This should be an InterpreterObject. Fix it. class PkgConfigDependency(): pkgconfig_found = False diff --git a/interpreter.py b/interpreter.py index b38bbbc3f..8969d6872 100755 --- a/interpreter.py +++ b/interpreter.py @@ -53,6 +53,22 @@ class Headers(InterpreterObject): def get_sources(self): return self.sources + +class Man(InterpreterObject): + + def __init__(self, sources): + InterpreterObject.__init__(self) + self.sources = sources + self.validate_sources() + + def validate_sources(self): + for s in self.sources: + num = int(s.split('.')[-1]) + if num < 1 or num > 8: + raise InvalidArguments('Man file must have a file extension of a number between 1 and 8') + + def get_sources(self): + return self.sources class BuildTarget(InterpreterObject): @@ -161,7 +177,8 @@ class Interpreter(): 'static_library' : self.func_static_lib, 'shared_library' : self.func_shared_lib, 'add_test' : self.func_add_test, - 'headers' : self.func_headers + 'headers' : self.func_headers, + 'man' : self.func_man } def sanity_check_ast(self): @@ -260,6 +277,14 @@ class Interpreter(): h = Headers(args) self.build.headers.append(h) return h + + def func_man(self, node, args): + for a in args: + if not isinstance(a, str): + raise InvalidArguments('Line %d: Argument %s is not a string.' % (node.lineno(), str(a))) + m = Man(args) + self.build.man.append(m) + return m def build_target(self, node, args, targetclass): for a in args: diff --git a/shellgenerator.py b/shellgenerator.py index 79dab1a3b..6b98b651c 100755 --- a/shellgenerator.py +++ b/shellgenerator.py @@ -73,16 +73,37 @@ echo Run compile.sh before this or bad things will happen. outfile = self.create_shfile(outfilename, message) self.generate_target_install(outfile) self.generate_header_install(outfile) + self.generate_man_install(outfile) outfile.close() def make_subdir(self, outfile, dir): cmdlist = ['mkdir', '-p', dir] - outfile.write(' '.join(shell_quote(cmdlist)) + '\n') + outfile.write(' '.join(shell_quote(cmdlist)) + ' || exit\n') def copy_file(self, outfile, filename, outdir): cpcommand = ['cp', filename, outdir] - cpcommand = ' '.join(shell_quote(cpcommand)) + '\n' + cpcommand = ' '.join(shell_quote(cpcommand)) + ' || exit\n' outfile.write(cpcommand) + + def generate_man_install(self, outfile): + prefix = self.environment.get_prefix() + manroot = os.path.join(prefix, self.environment.get_mandir()) + man = self.build.get_man() + if len(man) != 0: + outfile.write('\necho Installing man pages.\n') + else: + outfile.write('\necho This project has no man pages to install.\n') + for m in man: + for f in m.get_sources(): + num = f.split('.')[-1] + subdir = 'man' + num + absdir = os.path.join(manroot, subdir) + self.make_subdir(outfile, absdir) + srcabs = os.path.join(self.environment.get_source_dir(), f) + dstabs = os.path.join(manroot, + os.path.join(subdir, f + '.gz')) + cmd = "gzip < '%s' > '%s' || exit\n" % (srcabs, dstabs) + outfile.write(cmd) def generate_header_install(self, outfile): prefix = self.environment.get_prefix() @@ -91,12 +112,12 @@ echo Run compile.sh before this or bad things will happen. if len(headers) != 0: outfile.write('\necho Installing headers.\n') else: - outfile.write('\necho This project has no headers to install.') + outfile.write('\necho This project has no headers to install.\n') for h in headers: outdir = os.path.join(incroot, h.get_subdir()) self.make_subdir(outfile, outdir) for f in h.get_sources(): - abspath = os.path.join(self.environment.get_source_dir(), f) + abspath = os.path.join(self.environment.get_source_dir(), f) # FIXME self.copy_file(outfile, abspath, outdir) def generate_target_install(self, outfile): diff --git a/test cases/10 man install/bar.2 b/test cases/10 man install/bar.2 new file mode 100644 index 000000000..9d82d7e15 --- /dev/null +++ b/test cases/10 man install/bar.2 @@ -0,0 +1 @@ +this is a man page of bar.2, its contents are irrelevant \ No newline at end of file diff --git a/test cases/10 man install/builder.txt b/test cases/10 man install/builder.txt new file mode 100644 index 000000000..107f8b5aa --- /dev/null +++ b/test cases/10 man install/builder.txt @@ -0,0 +1,3 @@ +project('man install', 'c') +m1 = man('foo.1') +m2 = man('bar.2') \ No newline at end of file diff --git a/test cases/10 man install/foo.1 b/test cases/10 man install/foo.1 new file mode 100644 index 000000000..647c0970c --- /dev/null +++ b/test cases/10 man install/foo.1 @@ -0,0 +1 @@ +this is a man page of foo.1 its contents are irrelevant