Spaces:
Running
Running
JunchuanYu
commited on
Commit
·
3e8ed69
1
Parent(s):
5de9fdb
Upload 5 files
Browse files- lib/Dockerfile.wheels +190 -0
- lib/Makefile +7 -0
- lib/build-linux-wheels.sh +23 -0
- lib/gdalinit.py +40 -0
- lib/setup.py +353 -0
lib/Dockerfile.wheels
ADDED
@@ -0,0 +1,190 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# An image for building manylinux1 wheels equivalent to those that
|
2 |
+
# https://github.com/sgillies/frs-wheel-builds makes for macosx.
|
3 |
+
#
|
4 |
+
# TODO: Figure out how to make the builds for osx!
|
5 |
+
#
|
6 |
+
# Note well: a very limited set of format drivers are included in these
|
7 |
+
# wheels. See the GDAL configuration below for details.
|
8 |
+
|
9 |
+
FROM quay.io/pypa/manylinux1_x86_64
|
10 |
+
|
11 |
+
RUN sed -i 's/enabled=1/enabled=0/' /etc/yum/pluginconf.d/fastestmirror.conf \
|
12 |
+
&& sed -i 's/mirrorlist/#mirrorlist/' /etc/yum.repos.d/CentOS-Base.repo \
|
13 |
+
&& sed -i 's|#baseurl=http://mirror.centos.org/centos/$releasever|baseurl=http://vault.centos.org/5.11|' /etc/yum.repos.d/CentOS-Base.repo
|
14 |
+
|
15 |
+
RUN yum update -y && yum install -y curl-devel json-c-devel zlib-devel libtiff-devel postgresql-devel
|
16 |
+
|
17 |
+
# Install openssl
|
18 |
+
RUN mkdir -p /src \
|
19 |
+
&& cd /src \
|
20 |
+
&& curl -f -L -O https://www.openssl.org/source/openssl-1.0.2o.tar.gz \
|
21 |
+
&& echo "ec3f5c9714ba0fd45cb4e087301eb1336c317e0d20b575a125050470e8089e4d openssl-1.0.2o.tar.gz" > checksum \
|
22 |
+
&& sha256sum -c checksum \
|
23 |
+
&& tar zxf openssl-1.0.2o.tar.gz \
|
24 |
+
&& cd /src/openssl-1.0.2o \
|
25 |
+
&& ./config no-shared no-ssl2 no-async -fPIC -O2 \
|
26 |
+
&& make -j 4 \
|
27 |
+
&& make install \
|
28 |
+
&& rm -rf /src
|
29 |
+
|
30 |
+
# Install curl
|
31 |
+
RUN mkdir -p /src \
|
32 |
+
&& cd /src \
|
33 |
+
&& curl -f -L -O http://curl.askapache.com/download/curl-7.73.0.tar.bz2 \
|
34 |
+
&& tar jxf curl-7.73.0.tar.bz2 \
|
35 |
+
&& cd /src/curl-7.73.0 \
|
36 |
+
&& LIBS=-ldl CFLAGS="-O2 -Wl,-S" ./configure --with-ssl=/usr/local/ssl \
|
37 |
+
&& make -j 4 \
|
38 |
+
&& make install \
|
39 |
+
&& rm -rf /src
|
40 |
+
|
41 |
+
# Install geos
|
42 |
+
RUN mkdir -p /src \
|
43 |
+
&& cd /src \
|
44 |
+
&& curl -f -L -O http://download.osgeo.org/geos/geos-3.9.0.tar.bz2 \
|
45 |
+
&& tar jxf geos-3.9.0.tar.bz2 \
|
46 |
+
&& cd /src/geos-3.9.0 \
|
47 |
+
&& CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ./configure \
|
48 |
+
&& make -j 4 \
|
49 |
+
&& make install \
|
50 |
+
&& rm -rf /src
|
51 |
+
|
52 |
+
# Install jasper
|
53 |
+
RUN mkdir -p /src \
|
54 |
+
&& cd /src \
|
55 |
+
&& curl -f -L -O http://download.osgeo.org/gdal/jasper-1.900.1.uuid.tar.gz \
|
56 |
+
&& tar xzf jasper-1.900.1.uuid.tar.gz \
|
57 |
+
&& cd /src/jasper-1.900.1.uuid \
|
58 |
+
&& ./configure --disable-debug --enable-shared \
|
59 |
+
&& make -j 4 \
|
60 |
+
&& make install \
|
61 |
+
&& rm -rf /src
|
62 |
+
|
63 |
+
# proj4
|
64 |
+
RUN mkdir -p /src \
|
65 |
+
&& cd /src \
|
66 |
+
&& curl -f -L -O http://download.osgeo.org/proj/proj-4.9.3.tar.gz \
|
67 |
+
&& tar xzf proj-4.9.3.tar.gz \
|
68 |
+
&& cd /src/proj-4.9.3 \
|
69 |
+
&& ./configure CFLAGS="-O2 -Wl,-S" \
|
70 |
+
&& make -j 4 \
|
71 |
+
&& make install \
|
72 |
+
&& rm -rf /src
|
73 |
+
|
74 |
+
# cmake
|
75 |
+
RUN cd /usr/local/src \
|
76 |
+
&& curl -f -L -O http://www.cmake.org/files/v3.13/cmake-3.13.5.tar.gz \
|
77 |
+
&& tar xzf cmake-3.13.5.tar.gz \
|
78 |
+
&& cd cmake-3.13.5 \
|
79 |
+
&& ./bootstrap --prefix=/usr/local/cmake \
|
80 |
+
&& make -j 4; make install
|
81 |
+
|
82 |
+
# openjpeg
|
83 |
+
RUN mkdir -p /src \
|
84 |
+
&& cd /src \
|
85 |
+
&& curl -f -L -O https://github.com/uclouvain/openjpeg/archive/v2.4.0.tar.gz \
|
86 |
+
&& tar xzf v2.4.0.tar.gz \
|
87 |
+
&& cd /src/openjpeg-2.4.0 \
|
88 |
+
&& mkdir -p build \
|
89 |
+
&& cd build \
|
90 |
+
&& /usr/local/cmake/bin/cmake .. -DBUILD_THIRDPARTY:BOOL=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local \
|
91 |
+
&& make -j 4 install \
|
92 |
+
&& make clean \
|
93 |
+
&& rm -rf /src
|
94 |
+
|
95 |
+
# hdf5
|
96 |
+
RUN cd /usr/local/src \
|
97 |
+
&& curl -f -L -O https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.12/hdf5-1.12.0/src/hdf5-1.12.0.tar.gz \
|
98 |
+
&& tar xzf hdf5-1.12.0.tar.gz \
|
99 |
+
&& cd hdf5-1.12.0 \
|
100 |
+
&& ./configure --prefix=/usr/local --enable-shared --enable-build-mode=production CFLAGS="-O2 -Wl,-S" \
|
101 |
+
&& make -j 4 \
|
102 |
+
&& make install
|
103 |
+
|
104 |
+
## netcdf
|
105 |
+
RUN cd /usr/local/src \
|
106 |
+
&& curl -f -L -O ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-4.6.1.tar.gz \
|
107 |
+
&& tar xzf netcdf-4.6.1.tar.gz \
|
108 |
+
&& cd netcdf-4.6.1 \
|
109 |
+
&& CFLAGS="-I/usr/local/include -O2 -Wl,-S" CXXFLAGS="-I/usr/local/include -O2 -Wl,-S" LDFLAGS="-L/usr/local/lib" ./configure \
|
110 |
+
&& make -j 4 \
|
111 |
+
&& make install
|
112 |
+
|
113 |
+
## expat
|
114 |
+
RUN cd /usr/local/src \
|
115 |
+
&& curl -f -L -O https://github.com/libexpat/libexpat/releases/download/R_2_2_10/expat-2.2.10.tar.bz2 \
|
116 |
+
&& tar xjf expat-2.2.10.tar.bz2 \
|
117 |
+
&& cd expat-2.2.10 \
|
118 |
+
&& CFLAGS="-O2 -Wl,-S" ./configure --prefix=/usr/local \
|
119 |
+
&& make -j 4 \
|
120 |
+
&& make install
|
121 |
+
|
122 |
+
## webp
|
123 |
+
RUN cd /usr/local/src \
|
124 |
+
&& curl -f -L -O https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.2.0.tar.gz \
|
125 |
+
&& tar xzf libwebp-1.2.0.tar.gz \
|
126 |
+
&& cd libwebp-1.2.0 \
|
127 |
+
&& CFLAGS="-O2 -Wl,-S" ./configure --prefix=/usr/local \
|
128 |
+
&& make -j 4 \
|
129 |
+
&& make install
|
130 |
+
|
131 |
+
# gdal
|
132 |
+
RUN mkdir -p /src \
|
133 |
+
&& cd /src \
|
134 |
+
&& curl -f -L -O http://download.osgeo.org/gdal/2.4.4/gdal-2.4.4.tar.gz \
|
135 |
+
&& tar xzf gdal-2.4.4.tar.gz \
|
136 |
+
&& cd /src/gdal-2.4.4 \
|
137 |
+
&& CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ./configure \
|
138 |
+
--with-threads \
|
139 |
+
--disable-debug \
|
140 |
+
--disable-static \
|
141 |
+
--without-grass \
|
142 |
+
--without-libgrass \
|
143 |
+
--without-jpeg12 \
|
144 |
+
--with-libtiff \
|
145 |
+
--with-jpeg \
|
146 |
+
--with-pg \
|
147 |
+
--with-gif \
|
148 |
+
--with-png \
|
149 |
+
--with-webp \
|
150 |
+
--with-geotiff=internal \
|
151 |
+
--with-sqlite3=/usr \
|
152 |
+
--with-pcraster=internal \
|
153 |
+
--with-pcidsk=internal \
|
154 |
+
--with-bsb \
|
155 |
+
--with-grib \
|
156 |
+
--with-pam \
|
157 |
+
--with-geos=/usr/local/bin/geos-config \
|
158 |
+
--with-static-proj4=/usr/local \
|
159 |
+
--with-expat=/usr/local \
|
160 |
+
--with-libjson-c \
|
161 |
+
--with-libiconv-prefix=/usr \
|
162 |
+
--with-libz=/usr \
|
163 |
+
--with-curl=/usr/local/bin/curl-config \
|
164 |
+
--with-netcdf=/usr/local/netcdf \
|
165 |
+
--with-openjpeg \
|
166 |
+
--with-jasper=/usr/local \
|
167 |
+
--with-hdf5=/usr/local \
|
168 |
+
--without-python \
|
169 |
+
--without-hdf4 \
|
170 |
+
&& make -j 12 \
|
171 |
+
&& make install
|
172 |
+
|
173 |
+
# Bake dev requirements into the Docker image for faster builds
|
174 |
+
ADD requirements.txt /tmp/requirements.txt
|
175 |
+
RUN for PYBIN in /opt/python/*/bin; do \
|
176 |
+
$PYBIN/pip install -U pip || true; \
|
177 |
+
$PYBIN/pip install -r /tmp/requirements.txt || true; \
|
178 |
+
done
|
179 |
+
|
180 |
+
# Replace SWIG's setup.py with this modified one, which gets numpy in
|
181 |
+
# there as a dependency.
|
182 |
+
ADD setup.py /src/gdal-2.4.4/swig/python/setup.py
|
183 |
+
|
184 |
+
# Replace the osgeo module __init__.py with this modified one, which
|
185 |
+
# sets the GDAL_DATA and PROJ_LIB variables on import to where they've
|
186 |
+
# been copied to.
|
187 |
+
ADD gdalinit.py /src/gdal-2.4.4/swig/python/osgeo/__init__.py
|
188 |
+
|
189 |
+
WORKDIR /io
|
190 |
+
CMD ["/io/build-linux-wheels.sh"]
|
lib/Makefile
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# GDAL python bindings make file.
|
2 |
+
|
3 |
+
SHELL = /bin/bash
|
4 |
+
|
5 |
+
wheels: Dockerfile.wheels build-linux-wheels.sh
|
6 |
+
docker build -f Dockerfile.wheels -t gdal-wheelbuilder .
|
7 |
+
docker run -v `pwd`:/io gdal-wheelbuilder
|
lib/build-linux-wheels.sh
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
set -e
|
3 |
+
|
4 |
+
GDAL_BUILD_PATH=/src/gdal-2.4.4/swig/python
|
5 |
+
ORIGINAL_PATH=$PATH
|
6 |
+
UNREPAIRED_WHEELS=/tmp/wheels
|
7 |
+
|
8 |
+
# Enable devtoolset-2 for C++11
|
9 |
+
source /opt/rh/devtoolset-2/enable
|
10 |
+
|
11 |
+
# Compile wheels
|
12 |
+
pushd ${GDAL_BUILD_PATH}
|
13 |
+
for PYBIN in /opt/python/*/bin; do
|
14 |
+
export PATH=${PYBIN}:$ORIGINAL_PATH
|
15 |
+
rm -rf build
|
16 |
+
CFLAGS="-std=c++11" python setup.py bdist_wheel -d ${UNREPAIRED_WHEELS} || true
|
17 |
+
done
|
18 |
+
popd
|
19 |
+
|
20 |
+
# Bundle GEOS into the wheels
|
21 |
+
for whl in ${UNREPAIRED_WHEELS}/*.whl; do
|
22 |
+
auditwheel repair ${whl} -w wheels || true
|
23 |
+
done
|
lib/gdalinit.py
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# __init__ for osgeo package.
|
2 |
+
import os
|
3 |
+
import sys
|
4 |
+
|
5 |
+
# making the osgeo package version the same as the gdal version:
|
6 |
+
from sys import version_info
|
7 |
+
if version_info >= (2,6,0):
|
8 |
+
def swig_import_helper():
|
9 |
+
from os.path import dirname
|
10 |
+
import imp
|
11 |
+
fp = None
|
12 |
+
try:
|
13 |
+
fp, pathname, description = imp.find_module('_gdal', [dirname(__file__)])
|
14 |
+
except ImportError:
|
15 |
+
import _gdal
|
16 |
+
return _gdal
|
17 |
+
if fp is not None:
|
18 |
+
try:
|
19 |
+
_mod = imp.load_module('_gdal', fp, pathname, description)
|
20 |
+
finally:
|
21 |
+
fp.close()
|
22 |
+
return _mod
|
23 |
+
_gdal = swig_import_helper()
|
24 |
+
del swig_import_helper
|
25 |
+
else:
|
26 |
+
import _gdal
|
27 |
+
|
28 |
+
__version__ = _gdal.__version__ = _gdal.VersionInfo("RELEASE_NAME")
|
29 |
+
|
30 |
+
# Set gdal and proj data directories.
|
31 |
+
if 'GDAL_DATA' not in os.environ:
|
32 |
+
whl_datadir = os.path.abspath(os.path.join(os.path.dirname(__file__), "gdal_data"))
|
33 |
+
share_datadir = os.path.join(sys.prefix, 'share/gdal')
|
34 |
+
if os.path.exists(os.path.join(whl_datadir, 'pcs.csv')):
|
35 |
+
os.environ['GDAL_DATA'] = whl_datadir
|
36 |
+
elif os.path.exists(os.path.join(share_datadir, 'pcs.csv')):
|
37 |
+
os.environ['GDAL_DATA'] = share_datadir
|
38 |
+
if 'PROJ_LIB' not in os.environ:
|
39 |
+
whl_datadir = os.path.abspath(os.path.join(os.path.dirname(__file__), "proj_data"))
|
40 |
+
os.environ['PROJ_LIB'] = whl_datadir
|
lib/setup.py
ADDED
@@ -0,0 +1,353 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
|
4 |
+
# Setup script for GDAL Python bindings.
|
5 |
+
# Inspired by psycopg2 setup.py file
|
6 |
+
# http://www.initd.org/tracker/psycopg/browser/psycopg2/trunk/setup.py
|
7 |
+
# Howard Butler [email protected]
|
8 |
+
|
9 |
+
|
10 |
+
gdal_version = '2.4.4'
|
11 |
+
|
12 |
+
import sys
|
13 |
+
import shutil
|
14 |
+
import os
|
15 |
+
|
16 |
+
from glob import glob
|
17 |
+
|
18 |
+
# ---------------------------------------------------------------------------
|
19 |
+
# Switches
|
20 |
+
# ---------------------------------------------------------------------------
|
21 |
+
|
22 |
+
HAVE_NUMPY=False
|
23 |
+
HAVE_SETUPTOOLS = False
|
24 |
+
BUILD_FOR_CHEESESHOP = False
|
25 |
+
GNM_ENABLED = False
|
26 |
+
|
27 |
+
# ---------------------------------------------------------------------------
|
28 |
+
# Default build options
|
29 |
+
# (may be overridden with setup.cfg or command line switches).
|
30 |
+
# ---------------------------------------------------------------------------
|
31 |
+
|
32 |
+
include_dirs = ['../../port', '../../gcore', '../../alg', '../../ogr/', '../../ogr/ogrsf_frmts', '../../gnm', '../../apps']
|
33 |
+
library_dirs = ['../../.libs', '../../']
|
34 |
+
libraries = ['gdal']
|
35 |
+
|
36 |
+
# ---------------------------------------------------------------------------
|
37 |
+
# Helper Functions
|
38 |
+
# ---------------------------------------------------------------------------
|
39 |
+
|
40 |
+
# Function to find numpy's include directory
|
41 |
+
def get_numpy_include():
|
42 |
+
if HAVE_NUMPY:
|
43 |
+
return numpy.get_include()
|
44 |
+
else:
|
45 |
+
return '.'
|
46 |
+
|
47 |
+
def copy_data_tree(datadir, destdir):
|
48 |
+
try:
|
49 |
+
shutil.rmtree(destdir)
|
50 |
+
except OSError:
|
51 |
+
pass
|
52 |
+
shutil.copytree(datadir, destdir)
|
53 |
+
|
54 |
+
# ---------------------------------------------------------------------------
|
55 |
+
# Imports
|
56 |
+
# ---------------------------------------------------------------------------
|
57 |
+
|
58 |
+
try:
|
59 |
+
import numpy
|
60 |
+
HAVE_NUMPY = True
|
61 |
+
# check version
|
62 |
+
numpy_major = numpy.__version__.split('.')[0]
|
63 |
+
if int(numpy_major) < 1:
|
64 |
+
print("numpy version must be > 1.0.0")
|
65 |
+
HAVE_NUMPY = False
|
66 |
+
else:
|
67 |
+
# print ('numpy include', get_numpy_include())
|
68 |
+
if get_numpy_include() =='.':
|
69 |
+
print("numpy headers were not found! Array support will not be enabled")
|
70 |
+
HAVE_NUMPY=False
|
71 |
+
except ImportError:
|
72 |
+
pass
|
73 |
+
|
74 |
+
fixer_names = [
|
75 |
+
'lib2to3.fixes.fix_import',
|
76 |
+
'lib2to3.fixes.fix_next',
|
77 |
+
'lib2to3.fixes.fix_renames',
|
78 |
+
'lib2to3.fixes.fix_unicode',
|
79 |
+
'lib2to3.fixes.fix_ws_comma',
|
80 |
+
'lib2to3.fixes.fix_xrange',
|
81 |
+
]
|
82 |
+
extra = {}
|
83 |
+
try:
|
84 |
+
from setuptools import setup
|
85 |
+
from setuptools import Extension
|
86 |
+
HAVE_SETUPTOOLS = True
|
87 |
+
except ImportError:
|
88 |
+
from distutils.core import setup, Extension
|
89 |
+
|
90 |
+
try:
|
91 |
+
from distutils.command.build_py import build_py_2to3 as build_py
|
92 |
+
from distutils.command.build_scripts import build_scripts_2to3 as build_scripts
|
93 |
+
except ImportError:
|
94 |
+
from distutils.command.build_py import build_py
|
95 |
+
from distutils.command.build_scripts import build_scripts
|
96 |
+
else:
|
97 |
+
build_py.fixer_names = fixer_names
|
98 |
+
build_scripts.fixer_names = fixer_names
|
99 |
+
else:
|
100 |
+
if sys.version_info >= (3,):
|
101 |
+
from lib2to3.refactor import get_fixers_from_package
|
102 |
+
|
103 |
+
all_fixers = set(get_fixers_from_package('lib2to3.fixes'))
|
104 |
+
exclude_fixers = sorted(all_fixers.difference(fixer_names))
|
105 |
+
|
106 |
+
extra['use_2to3'] = True
|
107 |
+
extra['use_2to3_fixers'] = []
|
108 |
+
extra['use_2to3_exclude_fixers'] = exclude_fixers
|
109 |
+
|
110 |
+
class gdal_config_error(Exception): pass
|
111 |
+
|
112 |
+
|
113 |
+
from distutils.command.build_ext import build_ext
|
114 |
+
from distutils.ccompiler import get_default_compiler
|
115 |
+
|
116 |
+
def fetch_config(option, gdal_config='gdal-config'):
|
117 |
+
|
118 |
+
command = gdal_config + " --%s" % option
|
119 |
+
|
120 |
+
try:
|
121 |
+
import subprocess
|
122 |
+
command, args = command.split()[0], command.split()[1]
|
123 |
+
from sys import version_info
|
124 |
+
if version_info >= (3,0,0):
|
125 |
+
try:
|
126 |
+
p = subprocess.Popen([command, args], stdout=subprocess.PIPE)
|
127 |
+
except OSError:
|
128 |
+
import sys
|
129 |
+
e = sys.exc_info()[1]
|
130 |
+
raise gdal_config_error(e)
|
131 |
+
r = p.stdout.readline().decode('ascii').strip()
|
132 |
+
else:
|
133 |
+
exec("""try:
|
134 |
+
p = subprocess.Popen([command, args], stdout=subprocess.PIPE)
|
135 |
+
except OSError, e:
|
136 |
+
raise gdal_config_error, e""")
|
137 |
+
r = p.stdout.readline().strip()
|
138 |
+
p.stdout.close()
|
139 |
+
p.wait()
|
140 |
+
|
141 |
+
except ImportError:
|
142 |
+
|
143 |
+
import popen2
|
144 |
+
|
145 |
+
p = popen2.popen3(command)
|
146 |
+
r = p[0].readline().strip()
|
147 |
+
if not r:
|
148 |
+
raise Warning(p[2].readline())
|
149 |
+
|
150 |
+
return r
|
151 |
+
|
152 |
+
class gdal_ext(build_ext):
|
153 |
+
|
154 |
+
GDAL_CONFIG = 'gdal-config'
|
155 |
+
user_options = build_ext.user_options[:]
|
156 |
+
user_options.extend([
|
157 |
+
('gdal-config=', None,
|
158 |
+
"The name of the gdal-config binary and/or a full path to it"),
|
159 |
+
])
|
160 |
+
|
161 |
+
def initialize_options(self):
|
162 |
+
build_ext.initialize_options(self)
|
163 |
+
|
164 |
+
self.numpy_include_dir = get_numpy_include()
|
165 |
+
self.gdaldir = None
|
166 |
+
self.gdal_config = self.GDAL_CONFIG
|
167 |
+
self.already_raised_no_config_error = False
|
168 |
+
|
169 |
+
def get_compiler(self):
|
170 |
+
return self.compiler or get_default_compiler()
|
171 |
+
|
172 |
+
def get_gdal_config(self, option):
|
173 |
+
try:
|
174 |
+
return fetch_config(option, gdal_config = self.gdal_config)
|
175 |
+
except gdal_config_error:
|
176 |
+
# If an error is thrown, it is possibly because
|
177 |
+
# the gdal-config location given in setup.cfg is
|
178 |
+
# incorrect, or possibly the default -- ../../apps/gdal-config
|
179 |
+
# We'll try one time to use the gdal-config that might be
|
180 |
+
# on the path. If that fails, we're done, however.
|
181 |
+
if not self.already_raised_no_config_error:
|
182 |
+
self.already_raised_no_config_error = True
|
183 |
+
return fetch_config(option)
|
184 |
+
|
185 |
+
def finalize_options(self):
|
186 |
+
if self.include_dirs is None:
|
187 |
+
self.include_dirs = include_dirs
|
188 |
+
if self.library_dirs is None:
|
189 |
+
self.library_dirs = library_dirs
|
190 |
+
if self.libraries is None:
|
191 |
+
if self.get_compiler() == 'msvc':
|
192 |
+
libraries.remove('gdal')
|
193 |
+
libraries.append('gdal_i')
|
194 |
+
self.libraries = libraries
|
195 |
+
|
196 |
+
build_ext.finalize_options(self)
|
197 |
+
|
198 |
+
self.include_dirs.append(self.numpy_include_dir)
|
199 |
+
|
200 |
+
if self.get_compiler() == 'msvc':
|
201 |
+
return True
|
202 |
+
|
203 |
+
self.gdaldir = self.get_gdal_config('prefix')
|
204 |
+
self.library_dirs.append(os.path.join(self.gdaldir,'lib'))
|
205 |
+
self.include_dirs.append(os.path.join(self.gdaldir,'include'))
|
206 |
+
|
207 |
+
|
208 |
+
extra_link_args = []
|
209 |
+
extra_compile_args = []
|
210 |
+
|
211 |
+
if sys.platform == 'darwin' and [int(x) for x in os.uname()[2].split('.')] >= [11, 0, 0]:
|
212 |
+
# since MacOS X 10.9, clang no longer accepts -mno-fused-madd
|
213 |
+
#extra_compile_args.append('-Qunused-arguments')
|
214 |
+
os.environ['ARCHFLAGS'] = '-Wno-error=unused-command-line-argument-hard-error-in-future'
|
215 |
+
|
216 |
+
gdal_module = Extension('osgeo._gdal',
|
217 |
+
sources=['extensions/gdal_wrap.cpp'],
|
218 |
+
extra_compile_args = extra_compile_args,
|
219 |
+
extra_link_args = extra_link_args)
|
220 |
+
|
221 |
+
gdalconst_module = Extension('osgeo._gdalconst',
|
222 |
+
sources=['extensions/gdalconst_wrap.c'],
|
223 |
+
extra_compile_args = extra_compile_args,
|
224 |
+
extra_link_args = extra_link_args)
|
225 |
+
|
226 |
+
osr_module = Extension('osgeo._osr',
|
227 |
+
sources=['extensions/osr_wrap.cpp'],
|
228 |
+
extra_compile_args = extra_compile_args,
|
229 |
+
extra_link_args = extra_link_args)
|
230 |
+
|
231 |
+
ogr_module = Extension('osgeo._ogr',
|
232 |
+
sources=['extensions/ogr_wrap.cpp'],
|
233 |
+
extra_compile_args = extra_compile_args,
|
234 |
+
extra_link_args = extra_link_args)
|
235 |
+
|
236 |
+
|
237 |
+
array_module = Extension('osgeo._gdal_array',
|
238 |
+
sources=['extensions/gdal_array_wrap.cpp'],
|
239 |
+
extra_compile_args = extra_compile_args,
|
240 |
+
extra_link_args = extra_link_args)
|
241 |
+
|
242 |
+
gnm_module = Extension('osgeo._gnm',
|
243 |
+
sources=['extensions/gnm_wrap.cpp'],
|
244 |
+
extra_compile_args = extra_compile_args,
|
245 |
+
extra_link_args = extra_link_args)
|
246 |
+
|
247 |
+
ext_modules = [gdal_module,
|
248 |
+
gdalconst_module,
|
249 |
+
osr_module,
|
250 |
+
ogr_module]
|
251 |
+
|
252 |
+
py_modules = ['gdal',
|
253 |
+
'ogr',
|
254 |
+
'osr',
|
255 |
+
'gdalconst']
|
256 |
+
|
257 |
+
if os.path.exists('setup_vars.ini'):
|
258 |
+
with open('setup_vars.ini') as f:
|
259 |
+
lines = f.readlines()
|
260 |
+
if 'GNM_ENABLED=yes' in lines or 'GNM_ENABLED=yes\n' in lines:
|
261 |
+
GNM_ENABLED = True
|
262 |
+
|
263 |
+
if GNM_ENABLED:
|
264 |
+
ext_modules.append(gnm_module)
|
265 |
+
py_modules.append('gnm')
|
266 |
+
|
267 |
+
|
268 |
+
if HAVE_NUMPY:
|
269 |
+
ext_modules.append(array_module)
|
270 |
+
py_modules.append('gdalnumeric')
|
271 |
+
|
272 |
+
packages = ["osgeo",]
|
273 |
+
|
274 |
+
readme = str(open('README.rst','rb').read())
|
275 |
+
|
276 |
+
name = 'GDAL'
|
277 |
+
version = gdal_version
|
278 |
+
author = "Frank Warmerdam"
|
279 |
+
author_email = "[email protected]"
|
280 |
+
maintainer = "Howard Butler"
|
281 |
+
maintainer_email = "[email protected]"
|
282 |
+
description = "GDAL: Geospatial Data Abstraction Library"
|
283 |
+
license = "MIT"
|
284 |
+
url="http://www.gdal.org"
|
285 |
+
|
286 |
+
classifiers = [
|
287 |
+
'Development Status :: 5 - Production/Stable',
|
288 |
+
'Intended Audience :: Developers',
|
289 |
+
'Intended Audience :: Science/Research',
|
290 |
+
'License :: OSI Approved :: MIT License',
|
291 |
+
'Operating System :: OS Independent',
|
292 |
+
'Programming Language :: Python :: 2',
|
293 |
+
'Programming Language :: Python :: 3',
|
294 |
+
'Programming Language :: C',
|
295 |
+
'Programming Language :: C++',
|
296 |
+
'Topic :: Scientific/Engineering :: GIS',
|
297 |
+
'Topic :: Scientific/Engineering :: Information Analysis',
|
298 |
+
|
299 |
+
]
|
300 |
+
|
301 |
+
|
302 |
+
if BUILD_FOR_CHEESESHOP:
|
303 |
+
data_files = [("osgeo/data/gdal", glob(os.path.join("../../data", "*")))]
|
304 |
+
else:
|
305 |
+
data_files = None
|
306 |
+
|
307 |
+
exclude_package_data = {'':['GNUmakefile']}
|
308 |
+
|
309 |
+
# Copy gdal/proj data.
|
310 |
+
copy_data_tree('/usr/local/share/gdal', 'osgeo/gdal_data')
|
311 |
+
copy_data_tree('/usr/local/share/proj', 'osgeo/proj_data')
|
312 |
+
|
313 |
+
if HAVE_SETUPTOOLS:
|
314 |
+
setup( name = name,
|
315 |
+
version = gdal_version,
|
316 |
+
author = author,
|
317 |
+
author_email = author_email,
|
318 |
+
maintainer = maintainer,
|
319 |
+
maintainer_email = maintainer_email,
|
320 |
+
long_description = readme,
|
321 |
+
description = description,
|
322 |
+
license = license,
|
323 |
+
classifiers = classifiers,
|
324 |
+
py_modules = py_modules,
|
325 |
+
packages = packages,
|
326 |
+
url=url,
|
327 |
+
data_files = data_files,
|
328 |
+
zip_safe = False,
|
329 |
+
exclude_package_data = exclude_package_data,
|
330 |
+
cmdclass={'build_ext':gdal_ext},
|
331 |
+
ext_modules = ext_modules,
|
332 |
+
install_requires=['numpy=={}'.format(numpy.__version__)],
|
333 |
+
package_data={'osgeo': ['gdal_data/*', 'proj_data/*']},
|
334 |
+
**extra )
|
335 |
+
else:
|
336 |
+
setup( name = name,
|
337 |
+
version = gdal_version,
|
338 |
+
author = author,
|
339 |
+
author_email = author_email,
|
340 |
+
maintainer = maintainer,
|
341 |
+
maintainer_email = maintainer_email,
|
342 |
+
long_description = readme,
|
343 |
+
description = description,
|
344 |
+
license = license,
|
345 |
+
classifiers = classifiers,
|
346 |
+
py_modules = py_modules,
|
347 |
+
packages = packages,
|
348 |
+
data_files = data_files,
|
349 |
+
url=url,
|
350 |
+
cmdclass={'build_ext':gdal_ext,
|
351 |
+
'build_py': build_py,
|
352 |
+
'build_scripts': build_scripts},
|
353 |
+
ext_modules = ext_modules )
|