150 lines
5.8 KiB
Python
150 lines
5.8 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
# Mapnik uses the build tool SCons.
|
||
|
|
||
|
# This python file is run to compile a plugin
|
||
|
# It must be called from the main 'SConstruct' file like:
|
||
|
|
||
|
# SConscript('path/to/this/file.py')
|
||
|
|
||
|
# see docs at: http://www.scons.org/wiki/SConscript()
|
||
|
|
||
|
import os
|
||
|
|
||
|
# Give this plugin a name
|
||
|
# here this happens to be the same as the directory
|
||
|
PLUGIN_NAME = 'python'
|
||
|
|
||
|
# Here we pull from the SCons environment exported from the main instance
|
||
|
Import ('plugin_base')
|
||
|
Import ('env')
|
||
|
|
||
|
# the below install details are also pulled from the
|
||
|
# main SConstruct file where configuration happens
|
||
|
|
||
|
# plugins can go anywhere, and be registered in custom locations by Mapnik
|
||
|
# but the standard location is '/usr/local/lib/mapnik/input'
|
||
|
install_dest = env['MAPNIK_INPUT_PLUGINS_DEST']
|
||
|
|
||
|
# clone the environment here
|
||
|
# so that if we modify the env it in this file
|
||
|
# those changes to not pollute other builds later on...
|
||
|
plugin_env = plugin_base.Clone()
|
||
|
|
||
|
# Add the cpp files that need to be compiled
|
||
|
plugin_sources = Split(
|
||
|
"""
|
||
|
%(PLUGIN_NAME)s_datasource.cpp
|
||
|
%(PLUGIN_NAME)s_featureset.cpp
|
||
|
""" % locals()
|
||
|
)
|
||
|
|
||
|
# Add any external libraries this plugin should
|
||
|
# directly link to
|
||
|
libraries = [ '' ] # eg 'libfoo'
|
||
|
|
||
|
libraries.append('mapnik')
|
||
|
libraries.append('boost_system%s' % env['BOOST_APPEND'])
|
||
|
# link libicuuc, but ICU_LIB_NAME is used custom builds of icu can
|
||
|
# have different library names like osx which offers /usr/lib/libicucore.dylib
|
||
|
libraries.append(env['ICU_LIB_NAME'])
|
||
|
|
||
|
libraries.append(env['BOOST_PYTHON_LIB'])
|
||
|
|
||
|
# TODO - do solaris/fedora need direct linking too?
|
||
|
if env['PLATFORM'] == 'Darwin':
|
||
|
if not env['PYTHON_DYNAMIC_LOOKUP']:
|
||
|
libraries.append('png')
|
||
|
if env['JPEG']:
|
||
|
libraries.append('jpeg')
|
||
|
libraries.append(env['ICU_LIB_NAME'])
|
||
|
libraries.append('boost_regex%s' % env['BOOST_APPEND'])
|
||
|
if env['THREADING'] == 'multi':
|
||
|
libraries.append('boost_thread%s' % env['BOOST_APPEND'])
|
||
|
|
||
|
##### Python linking on OS X is tricky ###
|
||
|
# Confounding problems are:
|
||
|
# 1) likelyhood of multiple python installs of the same major.minor version
|
||
|
# because apple supplies python built-in and many users may have installed
|
||
|
# further versions using macports
|
||
|
# 2) boost python directly links to a python version
|
||
|
# 3) the below will directly link _mapnik.so to a python version
|
||
|
# 4) _mapnik.so must link to the same python lib as boost_python.dylib otherwise
|
||
|
# python will Abort with a Version Mismatch error.
|
||
|
# See http://trac.mapnik.org/ticket/453 for the seeds of a better approach
|
||
|
# for now we offer control over method of direct linking...
|
||
|
# The default below is to link against the python dylib in the form of
|
||
|
#/path/to/Python.framework/Python instead of -lpython
|
||
|
|
||
|
# http://developer.apple.com/mac/library/DOCUMENTATION/Darwin/Reference/ManPages/man1/ld.1.html
|
||
|
|
||
|
if env['PYTHON_DYNAMIC_LOOKUP']:
|
||
|
python_link_flag = '-undefined dynamic_lookup'
|
||
|
elif env['FRAMEWORK_PYTHON']:
|
||
|
if env['FRAMEWORK_SEARCH_PATH']:
|
||
|
# if the user has supplied a custom root path to search for
|
||
|
# a given Python framework, then use that to direct the linker
|
||
|
python_link_flag = '-F%s -framework Python -Z' % env['FRAMEWORK_SEARCH_PATH']
|
||
|
else:
|
||
|
# otherwise be as explicit as possible for linking to the same Framework
|
||
|
# as the executable we are building with (or is pointed to by the PYTHON variable)
|
||
|
# otherwise we may accidentally link against either:
|
||
|
# /System/Library/Frameworks/Python.framework/Python/Versions/
|
||
|
# or
|
||
|
# /Library/Frameworks/Python.framework/Python/Versions/
|
||
|
# See: http://trac.mapnik.org/ticket/380
|
||
|
link_prefix = env['PYTHON_SYS_PREFIX']
|
||
|
if '.framework' in link_prefix:
|
||
|
python_link_flag = '-F%s -framework Python -Z' % os.path.dirname(link_prefix.split('.')[0])
|
||
|
elif '/System' in link_prefix:
|
||
|
python_link_flag = '-F/System/Library/Frameworks/ -framework Python -Z'
|
||
|
else:
|
||
|
# should we fall back to -lpython here?
|
||
|
python_link_flag = '-F/ -framework Python'
|
||
|
|
||
|
# if we are not linking to a framework then use the *nix standard approach
|
||
|
else:
|
||
|
# TODO - do we need to pass -L/?
|
||
|
python_link_flag = '-lpython%s' % env['PYTHON_VERSION']
|
||
|
|
||
|
elif env['PLATFORM'] == 'SunOS':
|
||
|
# make sure to explicitly link mapnik.so against
|
||
|
# libmapnik in its installed location
|
||
|
python_link_flag = '-R%s' % env['MAPNIK_LIB_BASE']
|
||
|
else:
|
||
|
# all other platforms we don't directly link python
|
||
|
python_link_flag = ''
|
||
|
|
||
|
if env['CUSTOM_LDFLAGS']:
|
||
|
linkflags = '%s %s' % (env['CUSTOM_LDFLAGS'], python_link_flag)
|
||
|
else:
|
||
|
linkflags = python_link_flag
|
||
|
|
||
|
plugin_env.Append(CPPPATH = env['PYTHON_INCLUDES'])
|
||
|
|
||
|
TARGET = plugin_env.SharedLibrary(
|
||
|
# the name of the target to build, eg 'sqlite.input'
|
||
|
'../%s' % PLUGIN_NAME,
|
||
|
# prefix - normally none used
|
||
|
SHLIBPREFIX='',
|
||
|
# extension, mapnik expects '.input'
|
||
|
SHLIBSUFFIX='.input',
|
||
|
# list of source files to compile
|
||
|
source=plugin_sources,
|
||
|
# libraries to link to
|
||
|
LIBS=libraries,
|
||
|
# any custom linkflags, eg. LDFLAGS
|
||
|
# in this case CUSTOM_LDFLAGS comes
|
||
|
# from Mapnik's main SConstruct file
|
||
|
# and can be removed here if you do
|
||
|
# not need it
|
||
|
LINKFLAGS=env.get('CUSTOM_LDFLAGS')
|
||
|
)
|
||
|
|
||
|
# if 'uninstall' is not passed on the command line
|
||
|
# then we actually create the install targets that
|
||
|
# scons will install if 'install' is passed as an arg
|
||
|
if 'uninstall' not in COMMAND_LINE_TARGETS:
|
||
|
env.Install(install_dest, TARGET)
|
||
|
env.Alias('install', install_dest)
|