#!/usr/bin/env python
# $Id: setup.py,v 1.36.2.13 2007/03/23 12:06:32 marcusva Exp $
# setup script for ocempgui
import distutils.sysconfig
from distutils.core import setup, Extension
from distutils.command.install_data import install_data
import os, sys, glob, time
VERSION = "0.2.7"
# Minimum requirements.
ATK_MINIMUM = "1.12.1"
PYGAME_MINIMUM = (1, 7, 1)
PYTHON_MINIMUM = (2, 3)
PAPI_VERSION = "\"0.0.3\""
PAPI_DEBUG = "1"
##
# General configuration stuff.
##
def check_pkgconfig ():
"""Checks for the pkg-config utility."""
# TODO: unchecked code, verify it using a Win32 environment.
if sys.platform == "win32":
return os.system ("pkg-config > NUL") == 0
else:
return os.system ("pkg-config 2> /dev/null") == 256
def pkg_get_flags (package, flags, repl=None):
"""Gets the general compiler flags for a specific package using the
pkg-config utility."""
pipe = os.popen ("pkg-config %s %s" % (flags, package), "r")
data = pipe.readline ().strip ()
pipe.close ()
if repl:
return data.replace (repl, "").split ()
return data.split ()
def pkg_get_all_cflags (name):
"""Gets all necessary flags for a compiler using the pkg-config
utility."""
return pkg_get_flags (name, "--cflags-only-I", "-I"), \
pkg_get_flags (name, "--libs-only-L", "-L"), \
pkg_get_flags (name, "--libs-only-l", "-l")
def get_directory_list (base):
"""Gets a list of subdirectories for the given base path."""
# Get the needed ocempgui directory.
realpath = os.path.split (os.path.abspath (sys.argv[0]))[0]
# First get all the directories.
paths = glob.glob (os.path.join (realpath, base, "*"))
dirpaths = []
for x in paths:
if os.path.isdir (x):
dirpaths += get_directory_list (os.path.join (base, x))
# Although this should not happen, guarantee, that there is no CVS
# target.
dirpaths = [x for x in dirpaths if x.find ("CVS") == -1]
# Do not forget the main directory.
dirpaths = [os.path.join (realpath, base)] + dirpaths
return dirpaths
def get_installation_files (base, installpath, filedict):
"""Create a nice list from it suitable for the data_files section of the
distutils setup."""
# Get the needed ocempgui directory.
realpath = os.path.split (os.path.abspath (sys.argv[0]))[0]
filelist = []
for key in filedict:
# We also need to get rid of the current directory prefix and
# set it it to the correct installation prefix.
try:
path = key.split (os.path.join (realpath, base, ""))[1]
except IndexError:
# We got the main directory.
path = ""
path = os.path.join (installpath, path)
# Add the files.
files = []
for installfile in filedict[key]:
installfile = installfile.split (os.path.join (realpath, ""), 1)[1]
files.append (installfile)
filelist.append ((path, files))
return filelist
##
# Installation routines.
##
def adjust_paths (datadir, files):
"""Adjusts the datadir paths in the style using files."""
path = os.path.join (datadir, "share", "ocempgui")
for f in files:
fd = open (f, "r+")
lines = fd.readlines ()
for i, l in enumerate (lines):
lines[i] = l.replace ("@DATAPATH@", path)
fd.seek (0)
fd.writelines (lines)
fd.close ()
class InstallData (install_data):
"""Overrides the install_data behaviour to adjust the data paths."""
def run (self):
install_lib = self.get_finalized_command ("install_lib")
files = [os.path.join (install_lib.install_dir, "ocempgui", "widgets",
"Constants.py")]
adjust_paths (self.install_dir, files)
install_data.run (self)
# Update the .pyc file (s).
install_lib.byte_compile (files)
def get_papi_defines ():
"""Builds the defines list for the C Compiler."""
val = [("DEBUG", PAPI_DEBUG), ("VERSION", PAPI_VERSION)]
if sys.platform == "win32":
val.append (("IS_WIN32", "1"))
return val
def get_papi_files ():
"""Gets the list of file to use for building the papi accessibility
module."""
path = os.path.join ("ocempgui", "access", "papi")
files = glob.glob (os.path.join (path, "*.c"))
return files
def get_data_files ():
"""Gets a list of the files beneath data/ to install."""
installpath = os.path.join ("share", "ocempgui")
path = "data"
dirs = get_directory_list (path)
filedict = {}
for path in dirs:
files = glob.glob (os.path.join (path, "*.*"))
if files:
filedict[path] = files
return get_installation_files ("data", installpath, filedict)
def get_documentation_files ():
"""Gets a list of files to install as documentation."""
installpath = os.path.join ("share", "doc", "ocempgui")
docpaths = get_directory_list ("doc")
# Traverse all the directories in the docpath an get the needed files.
# Every file installed from the docs will have a suffix.
filedict = {}
for path in docpaths:
files = glob.glob (os.path.join (path, "*.*"))
if files:
filedict[path] = files
return get_installation_files ("doc", installpath, filedict)
def run_checks ():
# Python version check.
if sys.version_info < PYTHON_MINIMUM: # major, minor check
raise Exception ("You should have at least Python >= %d.%d.x "
"installed." % PYTHON_MINIMUM)
# Pygame versioning checks.
pygame_version = None
try:
import pygame
if pygame.version.vernum < PYGAME_MINIMUM:
raise Exception ("You should have at least Pygame >= %d.%d.%d "
"installed" % PYGAME_MINIMUM)
pygame_version = pygame.version.ver
except ImportError:
pass
# Environment checks for the PAPI interfaces.
papi = False
atk_version = "not found"
if not check_pkgconfig ():
papi = False
else:
val = pkg_get_flags ("atk", "--modversion")
if val:
atk_version = val[0]
if atk_version >= ATK_MINIMUM:
papi = True
print "\nThe following information will be used to build OcempGUI:"
print "\t Python: %d.%d.%d" % sys.version_info[0:3]
print "\t Pygame: %s" % pygame_version
print "\t ATK: %s" % atk_version
print "\t Build Papi: %s\n" % papi
return papi
if __name__ == "__main__":
want_papi = False
try:
want_papi = run_checks ()
except Exception, detail:
print "Error:", detail
sys.exit (1)
docfiles = get_documentation_files ()
datafiles = get_data_files ()
setupdata = {
"name" : "OcempGUI",
"version" : VERSION,
"description": "Ocean Empire User Interface Library",
"author": "Marcus von Appen",
"author_email": "marcus@sysfault.org",
"license": "BSD license",
"url": "http://ocemp.sourceforge.net/gui.html",
"packages": ["ocempgui",
"ocempgui.access",
"ocempgui.draw",
"ocempgui.events",
"ocempgui.object",
"ocempgui.widgets",
"ocempgui.widgets.components",
"ocempgui.widgets.images"],
"data_files" : datafiles + docfiles,
"cmdclass" : { "install_data" : InstallData },
}
if not want_papi:
# Do not build the accessibility extension.
setup (**setupdata)
else:
# Try to build the setup with the extension.
includes, libdirs, libs = pkg_get_all_cflags ("atk")
gmodflags = pkg_get_all_cflags ("gmodule-2.0")
includes += gmodflags[0]
libdirs += gmodflags[1]
libs += gmodflags[2]
includes += distutils.sysconfig.get_python_inc ()
defines = get_papi_defines ()
warn_flags = ["-W", "-Wall", "-Wpointer-arith", "-Wcast-qual",
"-Winline", "-Wcast-align", "-Wconversion",
"-Wstrict-prototypes", "-Wmissing-prototypes",
"-Wmissing-declarations", "-Wnested-externs",
"-Wshadow", "-Wredundant-decls"
]
compile_args = warn_flags + ["-std=c99","-g"]
papi = Extension ("ocempgui.access.papi", sources=get_papi_files (),
include_dirs=includes, library_dirs=libdirs,
libraries=libs, language="c",
define_macros=defines,
extra_compile_args=compile_args)
setupdata["ext_modules"] = [papi]
setup (**setupdata)
syntax highlighted by Code2HTML, v. 0.9.1