Commit 50daea95 authored by Ian Bruene's avatar Ian Bruene

Revert build to the Old Ways re: python install.

This reverts all of the changes associated with the fix_python_config.py
script. The build will no longer throw up in /usr/ when prefix==/usr/local/
parent 3bb4bf5d
Pipeline #15829257 (#) passed with stages
in 14 minutes and 13 seconds
......@@ -50,6 +50,14 @@ Python 2.x, x >= 6, or Python 3.x, x >= 3::
Python 3. Note that you will need both the ordinary Python
installation and Python dev tools, if your OS makes such a
distinction.
Some OS distros won't find our installed python libraries.
Your shell may need something like this:
export PYTHONPATH=/usr/local/lib/python2.7/site-packages
CentOS 6 is using python 2.6
export PYTHONPATH=/usr/local/lib/python2.6/site-packages
(I put it in my .bashrc)
argparse::
Required for ntpviz when using Python version 2.6
......
......@@ -24,7 +24,8 @@ import time
try:
import ntp.util
except ImportError as e:
sys.stderr.write("ntpheat: can't find Python NTP modules.\n%s\n" % e)
sys.stderr.write("ntpheat: can't find Python NTP modules. "
"-- check PYTHONPATH.\n%s\n" % e)
sys.exit(1)
# Work with argvars
......
......@@ -37,7 +37,8 @@ import time
try:
import ntp.util
except ImportError as e:
sys.stderr.write("ntpheatusb: can't find Python NTP modules.\n%s\n" % e)
sys.stderr.write("ntpheatusb: can't find Python NTP modules. "
"-- check PYTHONPATH.\n%s\n" % e)
sys.exit(1)
......
......@@ -13,7 +13,7 @@ directory to build/main/ntpclients/ and run ./ntpq there. If you get a message
that says
---------------------------------------------------------------------
ntpq: can't find Python NTP library.
ntpq: can't find Python NTP library -- check PYTHONPATH.
---------------------------------------------------------------------
you *may* have a problem. A lot of what was C code in legacy versions
......
......@@ -52,7 +52,7 @@ try:
import ntp.util
except ImportError as e:
sys.stderr.write(
"ntpdig: can't find Python NTP library.\n")
"ntpdig: can't find Python NTP library -- check PYTHONPATH.\n")
sys.stderr.write("%s\n" % e)
sys.exit(1)
......
......@@ -48,7 +48,7 @@ try:
import ntp.util
except ImportError as e:
sys.stderr.write(
"ntploggps: can't find Python NTP library.\n")
"ntploggps: can't find Python NTP library -- check PYTHONPATH.\n")
sys.stderr.write("%s\n" % e)
sys.exit(1)
......
......@@ -35,7 +35,7 @@ try:
import ntp.util
except ImportError as e:
sys.stderr.write(
"ntplogtemp: can't find Python NTP library.\n")
"ntplogtemp: can't find Python NTP library -- check PYTHONPATH.\n")
sys.stderr.write("%s\n" % e)
sys.exit(1)
......
......@@ -40,7 +40,7 @@ try:
import ntp.version
except ImportError as e:
sys.stderr.write(
"ntpmon: can't find Python NTP library.\n")
"ntpmon: can't find Python NTP library -- check PYTHONPATH.\n")
sys.stderr.write("%s\n" % e)
sys.exit(1)
......
......@@ -30,7 +30,7 @@ try:
import ntp.version
except ImportError as e:
sys.stderr.write(
"ntpq: can't find Python NTP library.\n")
"ntpq: can't find Python NTP library -- check PYTHONPATH.\n")
sys.stderr.write("%s\n" % e)
sys.exit(1)
......
from waflib import Utils # pylint: disable=import-error
from wafhelpers.fix_python_config import FixConfig
def options(opt):
......@@ -7,9 +6,8 @@ def options(opt):
def configure(conf):
fixed = FixConfig(conf)
fixed.load('python')
fixed.check_python_version((2, 6, 0))
conf.load('python')
conf.check_python_version((2, 6, 0))
conf.check_python_headers(features='pyext') # Extension-only, no embedded
......
"""Work around waf bugs related to Python config setup."""
import ast, os, sys
from waflib import Utils # pylint: disable=import-error
from waflib.Logs import pprint # pylint: disable=import-error
# NOTE: Everything in this file relates to waf bugs. It can go away once
# the waf bugs are fixed.
# The waf code for setting up PYTHONDIR and PYTHONARCHDIR is broken, because
# get_python_lib() only returns guaranteed usable library locations when the
# 'prefix' argument is absent or None, but waf insists on feeding it the PREFIX
# value. To make matters worse, the design of waf's ConfigSet object makes it
# impossible to get it to return a value of None for any item, so merely
# temporarily patching PREFIX doesn't work. Thus, the most straightforward
# workaround is to duplicate the relevant code with the properly omitted
# 'prefix'.
#
# The downside of the prefixless get_python_lib() is that the result may not
# be FHS-compliant, and may result in conflicts when a base install includes
# this code and another version is installed later. There doesn't seem to be
# a universal solution to this, but it tries to do the best it can by using
# waf's original prefixed result when it appears in the target Python's
# sys.path (with any preexisting PYTHONPATH definition inhibited).
# Unfortunately, it will only appear there if it already exists, even though
# the install itself will create it if needed.
#
# In principle, there might be some value in allowing a prefix to be optionally
# supplied (separately from PREFIX), but given that both values are already
# overridable, there's little need for an additional option.
#
# Naturally, the fix doesn't override user-supplied values, but the fixup runs
# after the version check, using the captured original settings to determine
# whether to override.
# An additional function is temporarily needed to clean up any libraries
# that had been installed to the incorrect PYTHONDIR by former
# versions of the script.
#
# Although this code is a NOP when the old and new install locations are
# identical, for maximum safety the extra deletions are done preinstall
# and postuninstall. This might matter if the old and new locations were
# symlinked together (a possible workaround for the old bug).
#
# Merely removing the libraries doesn't remove the containing directory(s)
# which may have been newly created by the old script. Removing any such
# directories is desirable, but doing so automatically would be too
# dangerous. The compromise is to issue a warning message when an empty
# containing directory is left. This is always done at the end, to avoid
# burying the warning in the install messages.
class FixConfig(object):
"""Methods and state for working around waf's python-config bugs."""
def __init__(self, conf):
"""Initialize state from conf object."""
self.conf = conf
self.opts = None
def get_options(self):
"""Capture values after option processing."""
self.opts = self.conf.env.derive().detach()
def fix_python_libs(self):
"""Fix up library install paths."""
# Remember original setting for "compatibility cleanup".
self.conf.env.OLD_PYTHONDIR = self.conf.env.PYTHONDIR
if Utils.is_win32:
return # No fixups supported on Windows
# Note that get_python_variables() doesn't work for sys.path
path_env = dict(os.environ)
path_env.pop('PYTHONPATH', None) # Ignore any current PYTHONPATH
path_str = self.conf.cmd_and_log(self.conf.env.PYTHON
+ ['-c',
'import sys; print(sys.path)'],
env=path_env)
sys_path = ast.literal_eval(path_str)
if (not ('PYTHONDIR' in self.opts or 'PYTHONDIR' in self.conf.environ)
and self.conf.env.PYTHONDIR not in sys_path):
(pydir,) = self.conf.get_python_variables(
["get_python_lib(plat_specific=0)"]
)
self.conf.env.PYTHONDIR = pydir
if (not ('PYTHONARCHDIR' in self.opts
or 'PYTHONARCHDIR' in self.conf.environ)
and self.conf.env.PYTHONARCHDIR not in sys_path):
(pyarchdir,) = self.conf.get_python_variables(
["get_python_lib(plat_specific=1)"]
)
self.conf.env.PYTHONARCHDIR = pyarchdir or pydir
def load(self, *args, **kwargs):
"""Do the load and capture the options."""
self.conf.load(*args, **kwargs)
self.get_options()
def check_python_version(self, *args, **kwargs):
"""Check version and fix up install paths."""
self.conf.check_python_version(*args, **kwargs)
self.fix_python_libs()
@staticmethod
def cleanup_python_libs(ctx, cmd='preinstall'):
"""Remove any Python libs that were installed to the wrong location."""
if not ctx.env.PYTHONDIR:
return # Here on pre-setup call
if ctx.env.PYTHONDIR == ctx.env.OLD_PYTHONDIR:
return # Here when old bug had no effect
if not os.path.isdir(ctx.env.OLD_PYTHONDIR):
return # Here when old dir doesn't exist or isn't a dir
if cmd in ('preinstall', 'uninstall'):
ctx.exec_command('rm -rf %s/ntp' % ctx.env.OLD_PYTHONDIR)
if cmd == 'preinstall':
return # Skip message where it's not likely to be seen
# See if we may have left an inappropriate empty directory
if not os.listdir(ctx.env.OLD_PYTHONDIR):
pprint('YELLOW',
'May need to manually remove %s' % ctx.env.OLD_PYTHONDIR)
......@@ -24,7 +24,6 @@ from wafhelpers.options import options_cmd
from wafhelpers.probes \
import probe_header_with_prerequisites, probe_function_with_prerequisites
from wafhelpers.test import test_write_log, test_print_log
from wafhelpers.fix_python_config import FixConfig
pprint.__doc__ = None
......@@ -1018,9 +1017,6 @@ def afterparty(ctx):
# expected to work.
if ctx.cmd == 'clean':
ctx.exec_command("rm -f ntpd/version.h ")
if ctx.cmd in ('uninstall', 'install'):
# Make sure libs are removed from the old location
FixConfig.cleanup_python_libs(ctx, ctx.cmd)
for x in ("ntpclients", "tests/pylib",):
# List used to be longer...
path_build = ctx.bldnode.make_node("pylib")
......@@ -1062,10 +1058,6 @@ def build(ctx):
# the build directory never happens. This is how we foil that.
ctx.add_pre_fun(lambda ctx: ctx.exec_command("rm -f pylib/*.py[co]"))
if ctx.cmd == "install":
# Make sure libs are removed from the old location
ctx.add_pre_fun(FixConfig.cleanup_python_libs)
if ctx.env.ENABLE_DOC_USER:
if ctx.variant != "main":
ctx.recurse("docs")
......@@ -1141,8 +1133,8 @@ def build(ctx):
if ctx.cmd == "build":
if "PYTHONPATH" in os.environ:
print("--- PYTHONPATH is set, "
"this may mask or cause library-related problems ---")
print("--- PYTHONPATH is not set, "
"loading the Python ntp library may be troublesome ---")
#
# Boot script setup
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment