diff --git a/SConstruct b/SConstruct index 90917cf7f..4d1bb7788 100644 --- a/SConstruct +++ b/SConstruct @@ -292,11 +292,10 @@ opts.AddVariables( ('CUSTOM_CXXFLAGS', 'Custom C++ flags, e.g. -I if you have headers in a nonstandard directory ', ''), ('CUSTOM_LDFLAGS', 'Custom linker flags, e.g. -L if you have libraries in a nonstandard directory ', ''), EnumVariable('LINKING', "Set library format for libmapnik",'shared', ['shared','static']), - EnumVariable('RUNTIME_LINK', "Set preference for linking dependecies",'shared', ['shared','static']), + EnumVariable('RUNTIME_LINK', "Set preference for linking dependencies",'shared', ['shared','static']), EnumVariable('OPTIMIZATION','Set g++ optimization level','3', ['0','1','2','3','4','s']), # Note: setting DEBUG=True will override any custom OPTIMIZATION level BoolVariable('DEBUG', 'Compile a debug version of Mapnik', 'False'), - BoolVariable('XML_DEBUG', 'Compile a XML verbose debug version of mapnik', 'False'), ListVariable('INPUT_PLUGINS','Input drivers to include',DEFAULT_PLUGINS,PLUGINS.keys()), ('WARNING_CXXFLAGS', 'Compiler flags you can set to reduce warning levels which are placed after -Wall.', ''), @@ -379,7 +378,7 @@ opts.AddVariables( BoolVariable('COLOR_PRINT', 'Print build status information in color', 'True'), BoolVariable('SAMPLE_INPUT_PLUGINS', 'Compile and install sample plugins', 'False'), ) - + # variables to pickle after successful configure step # these include all scons core variables as well as custom # env variables needed in SConscript files @@ -424,6 +423,15 @@ pickle_store = [# Scons internal variables 'SAMPLE_INPUT_PLUGINS', 'PKG_CONFIG_PATH', 'PATH_INSERT', + 'MAPNIK_LIB_DIR', + 'MAPNIK_LIB_DIR_DEST', + 'INSTALL_PREFIX', + 'MAPNIK_INPUT_PLUGINS', + 'MAPNIK_INPUT_PLUGINS_DEST', + 'MAPNIK_FONTS', + 'MAPNIK_FONTS_DEST', + 'MAPNIK_LIB_BASE', + 'MAPNIK_LIB_BASE_DEST' ] # Add all other user configurable options to pickle pickle_store @@ -928,9 +936,6 @@ if not preconfigured: mode = 'debug mode' else: mode = 'release mode' - - if env['XML_DEBUG']: - mode += ' (with XML debug on)' env['PLATFORM'] = platform.uname()[0] color_print(4,"Configuring on %s in *%s*..." % (env['PLATFORM'],mode)) @@ -944,14 +949,27 @@ if not preconfigured: env['HAS_LIBXML2'] = False env['SVN_REVISION'] = None env['LIBMAPNIK_LIBS'] = [] + env['LIBDIR_SCHEMA'] = LIBDIR_SCHEMA + env['PLUGINS'] = PLUGINS + env['MAPNIK_LIB_DIR'] = os.path.normpath(env['PREFIX'] + os.path.sep + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME']) + env['INSTALL_PREFIX'] = os.path.normpath(os.path.realpath(env['DESTDIR'])) + \ + os.path.realpath(env['PREFIX']) + env['MAPNIK_LIB_BASE_DEST'] = os.path.normpath(env['INSTALL_PREFIX'] + os.path.sep + env['LIBDIR_SCHEMA']) + env['MAPNIK_LIB_DIR_DEST'] = os.path.join(env['MAPNIK_LIB_BASE_DEST'],env['LIB_DIR_NAME']) + env['MAPNIK_LIB_BASE'] = os.path.join(env['PREFIX'],env['LIBDIR_SCHEMA']) + env['MAPNIK_INPUT_PLUGINS'] = os.path.join(env['MAPNIK_LIB_DIR'],"input") + env['MAPNIK_INPUT_PLUGINS_DEST'] = os.path.join(env['MAPNIK_LIB_DIR_DEST'],"input") + if env['SYSTEM_FONTS']: + env['MAPNIK_FONTS'] = os.path.normpath(env['SYSTEM_FONTS']) + env['MAPNIK_FONTS_DEST'] = os.path.normpath(env['SYSTEM_FONTS']) + else: + env['MAPNIK_FONTS'] = os.path.join(env['MAPNIK_LIB_DIR'],'fonts') + env['MAPNIK_FONTS_DEST'] = os.path.join(env['MAPNIK_LIB_DIR'],'fonts') + if env['LINKING'] == 'static': env['MAPNIK_LIB_NAME'] = '${LIBPREFIX}mapnik2${LIBSUFFIX}' else: env['MAPNIK_LIB_NAME'] = '${SHLIBPREFIX}mapnik2${SHLIBSUFFIX}' - - - env['LIBDIR_SCHEMA'] = LIBDIR_SCHEMA - env['PLUGINS'] = PLUGINS if env['PKG_CONFIG_PATH']: env['ENV']['PKG_CONFIG_PATH'] = os.path.realpath(env['PKG_CONFIG_PATH']) @@ -1183,6 +1201,7 @@ if not preconfigured: # Decide which libagg to use # if we are using internal agg, then prepend to make sure # we link locally + if env['INTERNAL_LIBAGG']: env.Prepend(CPPPATH = '#agg/include') env.Prepend(LIBPATH = '#agg') @@ -1301,10 +1320,7 @@ if not preconfigured: # Common debugging flags. debug_flags = '-g -DDEBUG -DMAPNIK_DEBUG' ndebug_flags = '-DNDEBUG' - - if env['XML_DEBUG']: - common_cxx_flags += '-DMAPNIK_XML_DEBUG ' - + # Customizing the C++ compiler flags depending on: # (1) the C++ compiler used; and # (2) whether debug binaries are requested. @@ -1357,14 +1373,14 @@ if not preconfigured: env['PYTHON_SYS_PREFIX'] = os.popen('''%s -c "import sys; print sys.prefix"''' % env['PYTHON']).read().strip() env['PYTHON_VERSION'] = os.popen('''%s -c "import sys; print sys.version"''' % env['PYTHON']).read()[0:3] env['PYTHON_INCLUDES'] = env['PYTHON_SYS_PREFIX'] + '/include/python' + env['PYTHON_VERSION'] - env['PYTHON_SITE_PACKAGES'] = env['DESTDIR'] + '/' + env['PYTHON_SYS_PREFIX'] + '/' + env['LIBDIR_SCHEMA'] + '/python' + env['PYTHON_VERSION'] + '/site-packages/' + env['PYTHON_SITE_PACKAGES'] = env['DESTDIR'] + os.path.sep + env['PYTHON_SYS_PREFIX'] + os.path.sep + env['LIBDIR_SCHEMA'] + '/python' + env['PYTHON_VERSION'] + '/site-packages/' # if user-requested custom prefix fall back to manual concatenation for building subdirectories if env['PYTHON_PREFIX']: py_relative_install = env['LIBDIR_SCHEMA'] + '/python' + env['PYTHON_VERSION'] + '/site-packages/' - env['PYTHON_INSTALL_LOCATION'] = env['DESTDIR'] + '/' + env['PYTHON_PREFIX'] + '/' + py_relative_install + env['PYTHON_INSTALL_LOCATION'] = env['DESTDIR'] + os.path.sep + env['PYTHON_PREFIX'] + os.path.sep + py_relative_install else: - env['PYTHON_INSTALL_LOCATION'] = env['DESTDIR'] + '/' + env['PYTHON_SITE_PACKAGES'] + env['PYTHON_INSTALL_LOCATION'] = env['DESTDIR'] + os.path.sep + env['PYTHON_SITE_PACKAGES'] if py3: is_64_bit = '''%s -c "import sys; print(sys.maxsize == 9223372036854775807)"''' % env['PYTHON'] @@ -1483,7 +1499,7 @@ if not HELP_REQUESTED: SetOption("num_jobs", env['JOBS']) # Build agg first, doesn't need anything special - if env['INTERNAL_LIBAGG']: + if env['RUNTIME_LINK'] == 'shared' and env['INTERNAL_LIBAGG']: SConscript('agg/SConscript') # Build the core library @@ -1507,20 +1523,18 @@ if not HELP_REQUESTED: # build internal shape and raster plugins SConscript('plugins/input/%s/SConscript' % plugin) else: - color_print(1,"Notice: depedencies not met for plugin '%s', not building..." % plugin) + color_print(1,"Notice: dependencies not met for plugin '%s', not building..." % plugin) - # todo - generalize this path construction, also used in plugin SConscript... - plugin_dir = os.path.normpath(env['DESTDIR'] + '/' + env['PREFIX'] + '/' + env['LIBDIR_SCHEMA'] + env['LIB_DIR_NAME']) - create_uninstall_target(env, plugin_dir, False) - create_uninstall_target(env, plugin_dir + '/input' , False) - create_uninstall_target(env, plugin_dir + '/fonts' , False) + create_uninstall_target(env, env['MAPNIK_LIB_DIR_DEST'], False) + create_uninstall_target(env, env['MAPNIK_LIB_DIR_DEST'] + '/input' , False) + create_uninstall_target(env, env['MAPNIK_LIB_DIR_DEST'] + '/fonts' , False) # before installing plugins, wipe out any previously # installed plugins that we are no longer building if 'install' in COMMAND_LINE_TARGETS: for plugin in PLUGINS.keys(): if plugin not in env['REQUESTED_PLUGINS']: - plugin_path = os.path.join(plugin_dir,'input','%s.input' % plugin) + plugin_path = os.path.join(env['MAPNIK_LIB_DIR_DEST'],'input','%s.input' % plugin) if os.path.exists(plugin_path): color_print(1,"Notice: removing out of date plugin: '%s'" % plugin_path) os.unlink(plugin_path) diff --git a/src/SConscript b/src/SConscript index fda80ffc3..43ee492c8 100644 --- a/src/SConscript +++ b/src/SConscript @@ -23,6 +23,7 @@ import os import sys import glob +from copy import copy from subprocess import Popen, PIPE Import('env') @@ -39,16 +40,14 @@ def call(cmd, silent=True): def ldconfig(*args,**kwargs): call('ldconfig') + +if env['LINKING'] == 'static': + lib_env.Append(CXXFLAGS="-fPIC") + mapnik_lib_link_flag = '' 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'] @@ -70,10 +69,12 @@ if env['PLATFORM'] in ('Darwin','SunOS'): if env['HAS_BOOST_SYSTEM']: lib_env['LIBS'].append('boost_system%s' % env['BOOST_APPEND']) -if env['INTERNAL_LIBAGG']: - lib_env['LIBS'].insert(0, 'agg') -else: - lib_env['LIBS'].append([lib for lib in env['LIBS'] if lib.startswith('agg')]) + +if not env['LINKING'] == 'static': + if env['INTERNAL_LIBAGG']: + lib_env['LIBS'].insert(0, 'agg') + else: + lib_env['LIBS'].append([lib for lib in env['LIBS'] if lib.startswith('agg')]) if env['PLATFORM'] == 'Darwin': @@ -83,7 +84,7 @@ else: if env['PLATFORM'] == 'Darwin': if env['FULL_LIB_PATH']: - lib_path = '%s/%s' % (lib_dir,mapnik_libname) + lib_path = '%s/%s' % (env['MAPNIK_LIB_BASE'],mapnik_libname) else: lib_path = mapnik_libname mapnik_lib_link_flag += ' -Wl,-install_name,%s' % lib_path @@ -188,6 +189,10 @@ source += Split( """ ) +if env['RUNTIME_LINK'] == "static": + source += glob.glob('../agg/src/' + '*.cpp') + #source.append(File('../agg/libagg.a')) + # grid backend source += Split( """ @@ -284,7 +289,7 @@ else: mapnik = lib_env.SharedLibrary('mapnik2', source, LINKFLAGS=linkflags) # cache libraries value for other builds to use -env['LIBMAPNIK_LIBS'] = lib_env['LIBS'] +env['LIBMAPNIK_LIBS'] = copy(lib_env['LIBS']) if env['PLATFORM'] != 'Darwin': # Symlink command, only works if both files are in same directory @@ -299,8 +304,7 @@ if env['PLATFORM'] != 'Darwin': 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'] - target = os.path.join(libDir, soFile) + target = os.path.join(env['MAPNIK_LIB_BASE_DEST'], soFile) if 'uninstall' not in COMMAND_LINE_TARGETS: result = env.InstallAs(target=target, source=mapnik) @@ -310,8 +314,8 @@ if env['PLATFORM'] != 'Darwin': # Install symlinks - target1 = os.path.join(libDir, "%s.%d.%d" % (os.path.basename(str(mapnik[0])),major, minor)) - target2 = os.path.join(libDir, os.path.basename(str(mapnik[0]))) + target1 = os.path.join(env['MAPNIK_LIB_BASE_DEST'], "%s.%d.%d" % (os.path.basename(str(mapnik[0])),major, minor)) + target2 = os.path.join(env['MAPNIK_LIB_BASE_DEST'], os.path.basename(str(mapnik[0]))) if 'uninstall' not in COMMAND_LINE_TARGETS: if 'install' in COMMAND_LINE_TARGETS: link1 = env.Command(target1, target, symlink) @@ -324,7 +328,7 @@ if env['PLATFORM'] != 'Darwin': env['create_uninstall_target'](env, target) else: - target_path = os.path.normpath(install_prefix + '/' + env['LIBDIR_SCHEMA']) + target_path = env['MAPNIK_LIB_BASE_DEST'] if 'uninstall' not in COMMAND_LINE_TARGETS: result = env.Install(target_path, mapnik) env.Alias(target='install', source=result) @@ -336,10 +340,10 @@ svg_includes = glob.glob('../include/mapnik/svg/*.hpp') wkt_includes = glob.glob('../include/mapnik/wkt/*.hpp') grid_includes = glob.glob('../include/mapnik/grid/*.hpp') -inc_target = os.path.normpath(install_prefix+'/include/mapnik') -svg_inc_target = os.path.normpath(install_prefix+'/include/mapnik/svg') -wkt_inc_target = os.path.normpath(install_prefix+'/include/mapnik/wkt') -grid_inc_target = os.path.normpath(install_prefix+'/include/mapnik/grid') +inc_target = os.path.normpath(env['INSTALL_PREFIX']+'/include/mapnik') +svg_inc_target = os.path.normpath(env['INSTALL_PREFIX']+'/include/mapnik/svg') +wkt_inc_target = os.path.normpath(env['INSTALL_PREFIX']+'/include/mapnik/wkt') +grid_inc_target = os.path.normpath(env['INSTALL_PREFIX']+'/include/mapnik/grid') if 'uninstall' not in COMMAND_LINE_TARGETS: env.Alias(target='install', source=env.Install(inc_target, includes))