initial work on pyconf script
diff --git a/pyconf.py b/pyconf.py new file mode 100755 --- /dev/null +++ b/pyconf.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python + +# Copyright (C) 2013 Brandon Invergo <brandon@invergo.net> +# +# This file is part of pyconfigure. +# +# pyconfigure is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pyconfigure 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pyconfigure. If not, see <http://www.gnu.org/licenses/>. + + +from __future__ import print_function +import os.path +import sys +import getopt +import shutils +import subprocess + + +DATADIR = "/usr/local/share/pyconfigure/" + + +def parse_pkg_info(pkg_info): + pass + + +def gen_configure(pkg_meta, output): + config_src = os.path.join(DATADIR, "configure.ac") + config_dst = os.path.join(output, "configure.ac") + bootstrap = os.path.join(DATADIR, "bootstrap.sh") + with open(config_src, 'r') as h: + config_lines = h.readlines() + init_i = config_lines.index("@AC_INIT_LINE@") + config_lines[init_i] = "AC_INIT([{0}], [{1}], [{2}])".format( + pkg_meta["name"], + pkg_meta["version"], + pkg_meta["email"]) + with open(config_dst, 'w') as h: + for line in config_lines: + h.write(line) + shutils.copy(bootstrap, output) + subprocess.call(["autoreconf", "-fvi", output]) + + +def gen_makefile(pkg_meta, output, prefer_make): + pass + + +def gen_distutils(pkg_meta, output, prefer_make): + pass + + +def print_usage(): + print("""Usage: pyconf [OPTIONS] [TARGET] PKG-INFO +Generate `configure' and installation scripts for a Python program + +OPTIONS + -o, --output=DIR directory to move the generated files + --prefer-make prefer Make for performing installation logic, + otherwise prefer the TARGET + --help show this information +TARGETSl: + distutils (default) + +By default, the generated `Makefile' will be a wrapper around the +TARGET-based script for Python (i.e. distutils' `setup.py' script). +If `--prefer-make' is specified, the TARGET-based Python script will +be a wrapper around `Makefile'. + +For more information on the PKG-INFO file format, see PEP 345. +<http://www.python.org/dev/peps/pep-0345/> + +Report bugs to: bug-pyconfigure@gnu.org +pyconfigure home page: <http://www.gnu.org/software/pyconfigure/> +General help using GNU software: <http://www.gnu.org/get/help/>""") + + +if __name__ == "__main__": + long_args = ["help", "output", "prefer-make"] + try: + opts, args = getopt.gnu_getopt(sys.argv[1:], "ho:", long_args) + except getopt.GetoptError as err: + print(str(err)) + print_usage() + sys.exit(2) + output = os.getcwd() + prefer_make = False + for o, a in opts: + if o in ["-h", "--help"]: + print_usage() + sys.exit() + if o in ["-o", "--output"]: + output = a + if o in ["--prefer-make"]: + prefer_make = True + else: + print("Warning: unhandled option") + if len(args) == 0: + print_usage() + sys.exit(2) + elif len(args) == 1: + target = 0 + pkg_info = args[0] + else: + # do the following with an eye to the future of handling more + # Python packaging systems: + target = {"distutils":0}.get(args[0]) + if target is None: + print("Error: invalid target {0}".format([args[0])) + sys.exit(2) + pkg_info = args[1] + if not os.isfile(pkg_info): + print("Error: PKG-INFO file does not exist") + sys.exit(2) + pkg_meta = parse(pkg_info) + gen_configure(pkg_meta, output) + gen_makefile(pkg_meta, output, prefer_make) + # also with an eye to the future: + [gen_distutils][target](pkg_meta, output, prefer_make)