pysetup.mk: Run commands on multiple `python's, possibly in parallel.
[runlisp] / mdwsetup.py
index 45772fb..0bce572 100644 (file)
@@ -34,6 +34,13 @@ import distutils.core as DC
 import distutils.log as DL
 
 ###--------------------------------------------------------------------------
+### Compatibility hacks.
+
+def with_metaclass(meta, *supers):
+  return meta("#<anonymous base %s>" % meta.__name__,
+              supers or (object,), dict())
+
+###--------------------------------------------------------------------------
 ### Random utilities.
 
 def uniquify(seq):
@@ -73,9 +80,12 @@ def progoutput(command):
   The COMMAND must produce exactly one line of output, and must exit with
   status zero.
   """
-  kid = SUB.Popen(command, stdout = SUB.PIPE)
-  out = kid.stdout.readline()
-  junk = kid.stdout.read()
+  kid = SUB.Popen(command, stdout = SUB.PIPE, universal_newlines = True)
+  try:
+    out = kid.stdout.readline()
+    junk = kid.stdout.read(1)
+  finally:
+    kid.stdout.close()
   if junk != '': raise ValueError \
     ("Child process `%s' produced unspected output %r" % (command, junk))
   rc = kid.wait()
@@ -104,14 +114,17 @@ def pkg_config(pkg, version):
 
   spec = '%s >= %s' % (pkg, version)
 
-  for word in progoutput(['pkg-config', '--cflags', spec]).split():
+  try: cflags = OS.environ["%s_CFLAGS" % pkg]
+  except KeyError: cflags = progoutput(['pkg-config', '--cflags', spec])
+  for word in cflags.split():
     if word.startswith('-I'): INCLUDEDIRS.append(word[2:])
-    else: weird('--cflags', word)
-
-  for word in progoutput(['pkg-config', '--libs', spec]).split():
+    else: weird('CFLAGS', word)
+  try: libs = OS.environ["%s_LIBS" % pkg]
+  except KeyError: libs = progoutput(['pkg-config', '--libs', spec])
+  for word in libs.split():
     if word.startswith('-L'): LIBDIRS.append(word[2:])
     elif word.startswith('-l'): LIBS.append(word[2:])
-    else: weird('--libs', word)
+    else: weird('LIBS', word)
 
 ###--------------------------------------------------------------------------
 ### Substituting variables in files.
@@ -221,7 +234,7 @@ class CommandClass (type):
     else: CMDS[name] = c
     return c
 
-class Command (DC.Command, object):
+class Command (with_metaclass(CommandClass, DC.Command, object)):
   """
   Base class for `mdwsetup' command classes.
 
@@ -244,9 +257,9 @@ class distdir (Command):
   description = "print the distribution directory name to stdout"
   def run(me):
     d = me.distribution
-    print '%s-%s' % (d.get_name(), d.get_version())
+    print('%s-%s' % (d.get_name(), d.get_version()))
 
-class build_gen(Command):
+class build_gen (Command):
   """
   Generate files, according to the `genfiles'.
 
@@ -275,7 +288,7 @@ class build (_build, Command):
   sub_commands = [('build_gen', lambda me: me.distribution.genfiles)]
   sub_commands += _build.sub_commands
 
-class clean_gen(Command):
+class clean_gen (Command):
   """
   Remove the generated files, as listed in `genfiles'.
 
@@ -287,7 +300,7 @@ class clean_gen(Command):
     d = me.distribution
     for g in d.genfiles: g.clean(dry_run_p = me.dry_run)
 
-class clean_others(Command):
+class clean_others (Command):
   """
   Remove the files listed in the `cleanfiles' argument to `setup'.
   """