mapnik icon indicating copy to clipboard operation
mapnik copied to clipboard

How to build Mapnik as libmapnik.a on CentOS 7?

Open tthh7 opened this issue 2 years ago • 2 comments

I noticed there is logic for building statically in src/build.py, but when building, it gives me the following error

scons: *** Two environments with different actions were specified for the same target: /home/xxx/third_party_src/mapnik/plugins/input/csv/csv_utils.o (action 1: g++ -o csv_utils.o -c -std=c++11 -g -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -Wall -pthread -ftemplate-depth-300 -Wsign-compare -Wshadow -O3 -fPIC -rdynamic -DMAPNIK_MEMORY_MAPPED_FILE -DMAPNIK_HAS_DLCFN -DBIGINT -DBOOST_REGEX_HAS_ICU -DHAVE_JPEG -DMAPNIK_USE_PROJ4 -DHAVE_PNG -DHAVE_WEBP -DHAVE_TIFF -DLINUX -DMAPNIK_THREADSAFE -DBOOST_SPIRIT_NO_PREDEFINED_TERMINALS=1 -DBOOST_PHOENIX_NO_PREDEFINED_TERMINALS=1 -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -DNDEBUG -DMAPNIK_STATIC_PLUGIN_CSV -DMAPNIK_STATIC_PLUGIN_GDAL -DMAPNIK_STATIC_PLUGIN_GEOJSON -DMAPNIK_STATIC_PLUGIN_OGR -DMAPNIK_STATIC_PLUGIN_PGRASTER -DMAPNIK_STATIC_PLUGIN_POSTGIS -DMAPNIK_STATIC_PLUGIN_RASTER -DMAPNIK_STATIC_PLUGIN_SHAPE -DMAPNIK_STATIC_PLUGIN_SQLITE -DMAPNIK_STATIC_PLUGIN_TOPOJSON -DMAPNIK_STATIC_PLUGINS -DHAVE_CAIRO -DGRID_RENDERER -DSVG_RENDERER csv_utils.cpp) (action 2: g++ -o csv_utils.o -c -std=c++11 -g -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -Wall -pthread -ftemplate-depth-300 -Wsign-compare -Wshadow -O3 -rdynamic -DMAPNIK_MEMORY_MAPPED_FILE -DMAPNIK_HAS_DLCFN -DBIGINT -DBOOST_REGEX_HAS_ICU -DHAVE_JPEG -DMAPNIK_USE_PROJ4 -DHAVE_PNG -DHAVE_WEBP -DHAVE_TIFF -DLINUX -DMAPNIK_THREADSAFE -DBOOST_SPIRIT_NO_PREDEFINED_TERMINALS=1 -DBOOST_PHOENIX_NO_PREDEFINED_TERMINALS=1 -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -DNDEBUG csv_utils.cpp) File "/home/xxx/third_party_src/mapnik/utils/mapnik-index/build.py", line 56, in make: *** [src/json/libmapnik-json.a] Error 2'

"If I want to build it as libmapnik.a, what should I do?"

tthh7 avatar Nov 11 '23 11:11 tthh7

Hello, I can't tell which version you're trying to build, but here's an example of how I build v3.1.0 on CentOS 7:

export mapnik_version=3.1.0
mkdir --parents /tmp/mapnik_src
cd /tmp/mapnik_src

yum --assumeyes install epel-release centos-release-scl
yum --assumeyes upgrade
yum --assumeyes install \
    boost169-devel \
    bzip2 \
    cairo-devel \
    freetype-devel \
    devtoolset-9-gcc \
    devtoolset-9-gcc-c++ \
    gdal-devel \
    harfbuzz-devel \
    libicu-devel \
    libjpeg-devel \
    libpng-devel \
    libtiff-devel \
    libwebp-devel \
    libxml2-devel \
    make \
    patch \
    postgresql-devel \
    proj-devel \
    python3 \
    sqlite-devel \
    tar \
    zlib-devel

export DESTDIR="/tmp/mapnik"
export GDAL_DATA="$(gdal-config --datadir)"
export JOBS="$(nproc)"
export PROJ_LIB="/usr/share/proj"
export PYTHON="python3"
mkdir --parents ${GDAL_DATA} ${PROJ_LIB}
if [ ! -f SConstruct ]; then \
    curl --silent --location https://github.com/mapnik/mapnik/releases/download/v${mapnik_version}/mapnik-v${mapnik_version}.tar.bz2 \
        | tar --extract --bzip2 --strip-components=1 --file=-
    sed -i 's#BOOST_APPEND = match.groups()\[0\]#BOOST_APPEND = ""#g' SConstruct
fi
source /opt/rh/devtoolset-9/enable
export CUSTOM_DEFINES="-DACCEPT_USE_OF_DEPRECATED_PROJ_API_H"
export CUSTOM_LDFLAGS="-L/usr/lib64/boost169"
bash configure \
    CPP_TESTS=False \
    CUSTOM_CFLAGS="${CUSTOM_CFLAGS:-}" \
    CUSTOM_CXXFLAGS="${CUSTOM_CXXFLAGS:-}" \
    CUSTOM_DEFINES="${CUSTOM_DEFINES:-}" \
    CUSTOM_LDFLAGS="${CUSTOM_LDFLAGS:-}" \
    DEMO=False \
    DESTDIR="${DESTDIR}" \
    FAST=True \
    INPUT_PLUGINS=all \
    LIBDIR_SCHEMA=lib64 \
    OPTIMIZATION=2 \
    PREFIX=/usr \
    SVG2PNG=True \
    XMLPARSER=libxml2
make PYTHON="${PYTHON}"

At this point, libmapnik.a does not exist.

find . -name libmapnik.a

Initially configuring with LINKING=static seems to cause the build to fail, however, when running the last two commands again with LINKING=static it does build libmapnik.a successfully.

bash configure \
    CPP_TESTS=False \
    CUSTOM_CFLAGS="${CUSTOM_CFLAGS:-}" \
    CUSTOM_CXXFLAGS="${CUSTOM_CXXFLAGS:-}" \
    CUSTOM_DEFINES="${CUSTOM_DEFINES:-}" \
    CUSTOM_LDFLAGS="${CUSTOM_LDFLAGS:-}" \
    LINKING=static \
    DEMO=False \
    DESTDIR="${DESTDIR}" \
    FAST=True \
    INPUT_PLUGINS=all \
    LIBDIR_SCHEMA=lib64 \
    OPTIMIZATION=2 \
    PREFIX=/usr \
    SVG2PNG=True \
    XMLPARSER=libxml2
make PYTHON="${PYTHON}"
find . -name libmapnik.a
./src/libmapnik.a

hummeltech avatar Nov 18 '23 18:11 hummeltech

您好,我不知道您要构建哪个版本,但这是我如何v3.1.0在 CentOS 7 上构建的示例:

export mapnik_version=3.1.0
mkdir --parents /tmp/mapnik_src
cd /tmp/mapnik_src

yum --assumeyes install epel-release centos-release-scl
yum --assumeyes upgrade
yum --assumeyes install \
    boost169-devel \
    bzip2 \
    cairo-devel \
    freetype-devel \
    devtoolset-9-gcc \
    devtoolset-9-gcc-c++ \
    gdal-devel \
    harfbuzz-devel \
    libicu-devel \
    libjpeg-devel \
    libpng-devel \
    libtiff-devel \
    libwebp-devel \
    libxml2-devel \
    make \
    patch \
    postgresql-devel \
    proj-devel \
    python3 \
    sqlite-devel \
    tar \
    zlib-devel

export DESTDIR="/tmp/mapnik"
export GDAL_DATA="$(gdal-config --datadir)"
export JOBS="$(nproc)"
export PROJ_LIB="/usr/share/proj"
export PYTHON="python3"
mkdir --parents ${GDAL_DATA} ${PROJ_LIB}
if [ ! -f SConstruct ]; then \
    curl --silent --location https://github.com/mapnik/mapnik/releases/download/v${mapnik_version}/mapnik-v${mapnik_version}.tar.bz2 \
        | tar --extract --bzip2 --strip-components=1 --file=-
    sed -i 's#BOOST_APPEND = match.groups()\[0\]#BOOST_APPEND = ""#g' SConstruct
fi
source /opt/rh/devtoolset-9/enable
export CUSTOM_DEFINES="-DACCEPT_USE_OF_DEPRECATED_PROJ_API_H"
export CUSTOM_LDFLAGS="-L/usr/lib64/boost169"
bash configure \
    CPP_TESTS=False \
    CUSTOM_CFLAGS="${CUSTOM_CFLAGS:-}" \
    CUSTOM_CXXFLAGS="${CUSTOM_CXXFLAGS:-}" \
    CUSTOM_DEFINES="${CUSTOM_DEFINES:-}" \
    CUSTOM_LDFLAGS="${CUSTOM_LDFLAGS:-}" \
    DEMO=False \
    DESTDIR="${DESTDIR}" \
    FAST=True \
    INPUT_PLUGINS=all \
    LIBDIR_SCHEMA=lib64 \
    OPTIMIZATION=2 \
    PREFIX=/usr \
    SVG2PNG=True \
    XMLPARSER=libxml2
make PYTHON="${PYTHON}"

此时,libmapnik.a不存在。

find . -name libmapnik.a

最初配置LINKING=static似乎会导致构建失败,但是,当再次运行最后两个命令时,LINKING=static它确实构建libmapnik.a成功。

bash configure \
    CPP_TESTS=False \
    CUSTOM_CFLAGS="${CUSTOM_CFLAGS:-}" \
    CUSTOM_CXXFLAGS="${CUSTOM_CXXFLAGS:-}" \
    CUSTOM_DEFINES="${CUSTOM_DEFINES:-}" \
    CUSTOM_LDFLAGS="${CUSTOM_LDFLAGS:-}" \
    LINKING=static \
    DEMO=False \
    DESTDIR="${DESTDIR}" \
    FAST=True \
    INPUT_PLUGINS=all \
    LIBDIR_SCHEMA=lib64 \
    OPTIMIZATION=2 \
    PREFIX=/usr \
    SVG2PNG=True \
    XMLPARSER=libxml2
make PYTHON="${PYTHON}"
find . -name libmapnik.a
./src/libmapnik.a

Thank you very much for your patient explanation. I am using version 3.0.19. Following the method you provided, I have successfully obtained the libmapnik.a file. Thanks

tthh7 avatar Nov 23 '23 07:11 tthh7