-
Notifications
You must be signed in to change notification settings - Fork 165
/
wscript
189 lines (154 loc) · 7.05 KB
/
wscript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
import os
from glob import glob
from os import unlink, symlink, popen, uname, environ
from os.path import exists
from shutil import copy2 as copy
from subprocess import call
# node-wafadmin
import Options
import Utils
TARGET = '_mapnik'
TARGET_FILE = '%s.node' % TARGET
built = 'build/default/%s' % TARGET_FILE
dest = 'mapnik/%s' % TARGET_FILE
settings = 'mapnik/settings.js'
# only works with Mapnik2/trunk..
# make False to guess at Mapnik 0.7.x configuration (your mileage may vary)
AUTOCONFIGURE = True
# this goes into a settings.js file beside the C++ _mapnik.node
settings_template = """
module.exports.paths = {
'fonts': '%s',
'input_plugins': '%s',
};
"""
def write_mapnik_settings(fonts='',input_plugins=''):
open(settings,'w').write(settings_template % (fonts,input_plugins))
def ensure_min_mapnik_revision(conf,revision=2397):
# mapnik-config was basically written for node-mapnik
# so a variety of kinks mean that we need a very
# recent version for things to work properly
# http://trac.mapnik.org/log/trunk/utils/mapnik-config
#TODO - if we require >=2503 then we can check return type not "Usage" string...
if popen("%s --libs" % conf.env['MAPNIK_CONFIG']).read().startswith('Usage') \
or popen("%s --input-plugins" % conf.env['MAPNIK_CONFIG']).read().startswith('Usage') \
or popen("%s --svn-revision" % conf.env['MAPNIK_CONFIG']).read().startswith('Usage'):
Utils.pprint('YELLOW', 'mapnik-config version is too old, mapnik > %s is required for auto-configuring build' % revision)
conf.fatal('please upgrade to mapnik trunk')
failed = False
found_ver = None
try:
found_ver = int(popen("%s --svn-revision" % conf.env['MAPNIK_CONFIG']).readline().strip())
if not found_ver >= revision:
failed = True
print found_ver,revision
else:
Utils.pprint('GREEN', 'Sweet, found viable mapnik svn-revision r%s (via mapnik-config)' % (found_ver))
except Exception,e:
print e
failed = True
if failed:
if found_ver:
msg = 'mapnik-config version is too old, mapnik > r%s is required for auto-configuring build, found only r%s' % (revision,found_ver)
else:
msg = 'mapnik-config version is too old, mapnik > r%s is required for auto-configuring build' % revision
Utils.pprint('YELLOW', msg)
conf.fatal('please upgrade to mapnik trunk')
def set_options(opt):
opt.tool_options("compiler_cxx")
#opt.add_option('-D', '--debug', action='store_true', default=False, dest='debug')
def configure(conf):
conf.check_tool("compiler_cxx")
conf.check_tool("node_addon")
settings_dict = {}
# use mapnik-config to build against mapnik2/trunk
if AUTOCONFIGURE:
# future auto-support for mapnik frameworks..
path_list = environ.get('PATH', '').split(os.pathsep)
path_list.append('/Library/Frameworks/Mapnik.framework/Programs')
mapnik_config = conf.find_program('mapnik-config', var='MAPNIK_CONFIG', path_list=path_list, mandatory=True)
ensure_min_mapnik_revision(conf)
# todo - check return value of popen other we can end up with
# return of 'Usage: mapnik-config [OPTION]'
linkflags = popen("%s --libs" % mapnik_config).readline().strip().split(' ')[:2]
#linkflags.append('-F/Library/')
#linkflags.append('-framework Mapnik')
#linkflags.append('-Z')
conf.env.append_value("LINKFLAGS", linkflags)
# uneeded currently as second item from mapnik-config is -lmapnik2
#conf.env.append_value("LIB_MAPNIK", "mapnik2")
# TODO - too much potential pollution here, need to limit this upstream
cxxflags = popen("%s --cflags" % mapnik_config).readline().strip().split(' ')
conf.env.append_value("CXXFLAGS_MAPNIK", cxxflags)
#ldflags = []
#conf.env.append_value("LDFLAGS", ldflags)
# settings for fonts and input plugins
settings_dict['input_plugins'] = popen("%s --input-plugins" % mapnik_config).readline().strip()
settings_dict['fonts'] = popen("%s --fonts" % mapnik_config).readline().strip()
else:
prefix = "/usr/local"
import platform
if platform.dist()[0] in ('Ubuntu','debian'):
LIBDIR_SCHEMA='lib'
elif platform.uname()[4] == 'x86_64' and platform.system() == 'Linux':
LIBDIR_SCHEMA='lib64'
elif platform.uname()[4] == 'ppc64':
LIBDIR_SCHEMA='lib64'
else:
LIBDIR_SCHEMA='lib'
MAPNIK2 = False
# manual configure of Mapnik 0.7.x, as only trunk provides a mapnik-config
# mapnik 0.7.x
if MAPNIK2:
# libmapnik2
conf.env.append_value("LIB_MAPNIK", "mapnik2")
else:
conf.env.append_value("LIB_MAPNIK", "mapnik")
# add path of mapnik lib
conf.env.append_value("LIBPATH_MAPNIK", "%s/%s" % (prefix,LIBDIR_SCHEMA))
ldflags = []
if platform.uname()[0] == "Darwin":
ldflags.append('-L/usr/X11/lib/')
#libs = ['-lboost_thread','-lboost_regex','-libpng12','-libjpeg']
#if uname()[0] == 'Darwin':
# pass #libs.append('-L/usr/X11/lib/','-libicuuc')
if ldflags:
conf.env.append_value("LDFLAGS", ldflags)
# add path of mapnik headers
conf.env.append_value("CPPPATH_MAPNIK", "%s/include" % prefix)
# add paths for freetype, boost, icu, as needed
cxxflags = popen("freetype-config --cflags").readline().strip().split(' ')
cxxflags.append('-I/usr/include')
cxxflags.append('-I/usr/local/include')
conf.env.append_value("CXXFLAGS_MAPNIK", cxxflags)
# settings for fonts and input plugins
if MAPNIK2:
settings_dict['input_plugins'] = "%s/%s/mapnik2/input" % (prefix,LIBDIR_SCHEMA)
settings_dict['fonts'] = "%s/%s/mapnik2/fonts" % (prefix,LIBDIR_SCHEMA)
else:
settings_dict['input_plugins'] = "%s/lib/mapnik/input" % prefix
settings_dict['fonts'] = "%s/lib/mapnik/fonts" % prefix
write_mapnik_settings(**settings_dict)
def build(bld):
obj = bld.new_task_gen("cxx", "shlib", "node_addon", install_path=None)
obj.cxxflags = ["-DNDEBUG", "-O3", "-g", "-Wall", "-DBOOST_SPIRIT_THREADSAFE", "-DMAPNIK_THREADSAFE","-ansi","-finline-functions","-Wno-inline"]
obj.target = TARGET
obj.source = "src/%s.cc" % TARGET
obj.uselib = "MAPNIK"
files = glob('mapnik/*')
# loop to make sure we can install
# directories as well as files
for f in files:
if os.path.isdir(f):
bld.install_files('${PREFIX}/lib/node/%s' % f, '%s/*' % f)
else:
bld.install_files('${PREFIX}/lib/node/mapnik/', f)
def shutdown():
if Options.commands['clean']:
if exists(TARGET): unlink(TARGET)
if Options.commands['clean']:
if exists(dest):
unlink(dest)
else:
if exists(built):
copy(built,dest)