# # This file is part of Mapnik (c++ mapping toolkit) # # Copyright (C) 2006 Artem Pavlenko, Jean-Francois Doyon # # Mapnik is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # $Id$ import glob import os Import('env') ABI_VERSION = env['ABI_VERSION'] prefix = env['PREFIX'] lib_dir = os.path.normpath(prefix + '/' + env['LIBDIR_SCHEMA']) install_prefix = env['DESTDIR'] + '/' + prefix filesystem = 'boost_filesystem%s' % env['BOOST_APPEND'] regex = 'boost_regex%s' % env['BOOST_APPEND'] libraries = ['freetype','ltdl','png','tiff','z','jpeg','proj',env['ICU_LIB_NAME'],filesystem,regex] if env['HAS_CAIRO']: # add cairo and cairomm-1.0 to libs libraries.append('cairomm-1.0') libraries.append('cairo') if env['XMLPARSER'] == 'libxml2': libraries.append('xml2') if env['THREADING'] == 'multi': libraries.append('boost_thread%s' % env['BOOST_APPEND']) if env['PLATFORM'] == 'Darwin': if env['HAS_BOOST_SYSTEM']: libraries.append('boost_system%s' % env['BOOST_APPEND']) if env['INTERNAL_LIBAGG']: libraries.insert(0, 'agg') else: libraries.append([lib for lib in env['LIBS'] if lib.startswith('agg')]) if env['PLATFORM'] == 'Darwin': if env['FULL_LIB_PATH']: lib_path = '%s/libmapnik2.dylib' % lib_dir else: lib_path = 'libmapnik2.dylib' linkflags = '-Wl,-install_name,%s' % lib_path linkflags += ' -current_version 0.8.0 -compatibility_version 0.8.0' elif env['PLATFORM'] == 'SunOS' and env['CXX'].startswith('CC'): linkflags = '-R. -h libmapnik.so' else: # Linux and others linkflags = '-Wl,-rpath-link,. -Wl,-soname,libmapnik2.so.' + ("%d.%d" % (ABI_VERSION[0],ABI_VERSION[1])) source = Split( """ color.cpp datasource_cache.cpp box2d.cpp expression_node.cpp expression_string.cpp filter_factory.cpp font_engine_freetype.cpp font_set.cpp graphics.cpp image_cache.cpp image_reader.cpp image_util.cpp layer.cpp line_pattern_symbolizer.cpp map.cpp load_map.cpp memory.cpp params.cpp parse_path.cpp placement_finder.cpp plugin.cpp png_reader.cpp point_symbolizer.cpp polygon_pattern_symbolizer.cpp save_map.cpp shield_symbolizer.cpp text_symbolizer.cpp tiff_reader.cpp wkb.cpp projection.cpp proj_transform.cpp distance.cpp scale_denominator.cpp memory_datasource.cpp stroke.cpp symbolizer.cpp arrow.cpp unicode.cpp glyph_symbolizer.cpp markers_symbolizer.cpp metawriter.cpp """ ) if env['JPEG']: source += Split( """ jpeg_reader.cpp """) if True : # agg backend source += Split( """ agg/agg_renderer.cpp agg/process_building_symbolizer.cpp agg/process_glyph_symbolizer.cpp agg/process_line_symbolizer.cpp agg/process_line_pattern_symbolizer.cpp agg/process_text_symbolizer.cpp agg/process_point_symbolizer.cpp agg/process_polygon_symbolizer.cpp agg/process_polygon_pattern_symbolizer.cpp agg/process_raster_symbolizer.cpp agg/process_shield_symbolizer.cpp agg/process_markers_symbolizer.cpp svg_parser.cpp svg_path_parser.cpp svg_points_parser.cpp svg_transform_parser.cpp marker_cache.cpp """ ) if env['HAS_CAIRO']: env2 = env.Clone() env2.Append(CXXFLAGS = '-DHAVE_CAIRO') env2.ParseConfig('pkg-config --libs --cflags cairomm-1.0') fixup = ['cairo_renderer.cpp','graphics.cpp','image_util.cpp'] for cpp in fixup: if cpp in source: source.remove(cpp) for cpp in fixup: source.insert(0,env2.SharedObject(cpp)) if env['XMLPARSER'] == 'tinyxml': source += Split( """ ../tinyxml/tinystr.cpp ../tinyxml/tinyxml.cpp ../tinyxml/tinyxmlerror.cpp ../tinyxml/tinyxmlparser.cpp """) elif env['XMLPARSER'] == 'libxml2': source += Split( """ libxml2_loader.cpp """) mapnik = env.SharedLibrary('mapnik2', source, LIBS=libraries, LINKFLAGS=linkflags) if env['PLATFORM'] != 'Darwin': # Symlink command, only works if both files are in same directory def symlink(env, target, source): trgt = str(target[0]) src = str(source[0]) if os.path.islink(trgt) or os.path.exists(trgt): os.remove(trgt) os.symlink(os.path.basename(src), trgt) major, minor, micro = ABI_VERSION soFile = "%s.%d.%d.%d" % (os.path.basename(str(mapnik[0])), major, minor, micro) libDir = install_prefix + '/' + env['LIBDIR_SCHEMA'] env.Alias(target='install', source=env.InstallAs(target=os.path.join(libDir, soFile), source=mapnik)) # Install symlinks link1 = env.Command(os.path.join(libDir, "%s.%d.%d" % (os.path.basename(str(mapnik[0])),major, minor)), os.path.join(libDir, soFile), symlink) env.Alias(target='install', source=link1) link2 = env.Command(os.path.join(libDir, os.path.basename(str(mapnik[0]))), os.path.join(libDir, "%s.%d.%d" % (os.path.basename(str(mapnik[0])),major, minor)), symlink) env.Alias(target='install', source=link2) else: env.Alias(target='install', source=env.Install(install_prefix + '/' + env['LIBDIR_SCHEMA'], mapnik)) includes = glob.glob('../include/mapnik/*.hpp') env.Alias(target='install', source=env.Install(install_prefix+'/include/mapnik', includes))