| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| import errno |
| import glob |
| import os |
| import shutil |
| import sys |
| |
| from setuptools import Extension |
| |
| def _create_module(module_name): |
| abs_top_srcdir = '@abs_top_srcdir@' |
| abs_top_builddir = '@abs_top_builddir@' |
| |
| ext_src_dir = os.path.join( |
| 'src', 'python', module_name, 'src', 'mesos', module_name) |
| ext_common_dir = os.path.join( |
| 'src', 'python', 'native_common') |
| |
| leveldb = os.path.join('3rdparty', 'leveldb-1.19') |
| zookeeper = os.path.join('3rdparty', 'zookeeper-3.4.8', 'src', 'c') |
| libprocess = os.path.join('3rdparty', 'libprocess') |
| |
| # Even though a statically compiled libprocess should include glog, |
| # libev, gperftools, and protobuf before installation this isn't the |
| # case, so while a libtool managed build will correctly pull in these |
| # libraries when building the final result, we need to explicitly |
| # include them here (or more precisely, down where we actually include |
| # libev.a and libprofiler.a). |
| glog = os.path.join('3rdparty', 'glog-0.3.3') |
| gperftools = os.path.join('3rdparty', 'gperftools-2.5') |
| protobuf = os.path.join('3rdparty', 'protobuf-3.5.0') |
| |
| # Build the list of source files. Note that each source must be |
| # relative to our current directory (where this script lives). |
| SOURCES = [ |
| os.path.join('src', 'mesos', module_name, file) |
| for file in os.listdir(os.path.join(abs_top_srcdir, ext_src_dir)) |
| if file.endswith('.cpp') |
| ] |
| |
| INCLUDE_DIRS = [ |
| os.path.join(abs_top_srcdir, 'include'), |
| os.path.join(abs_top_builddir, 'include'), |
| # Needed for the *.pb.h protobuf includes. |
| os.path.join(abs_top_builddir, 'include', 'mesos'), |
| os.path.join(abs_top_builddir, 'src'), |
| os.path.join(abs_top_builddir, ext_src_dir), |
| os.path.join(abs_top_builddir, ext_common_dir), |
| os.path.join(abs_top_builddir, protobuf, 'src'), |
| ] |
| |
| LIBRARY_DIRS = [] |
| |
| EXTRA_OBJECTS = [ |
| os.path.join(abs_top_builddir, 'src', '.libs', 'libmesos_no_3rdparty.a'), |
| os.path.join(abs_top_builddir, libprocess, '.libs', 'libprocess.a') |
| ] |
| |
| # For leveldb, we need to check for the presence of libleveldb.a, since |
| # it is possible to disable leveldb inside mesos. |
| libglog = os.path.join(abs_top_builddir, glog, '.libs', 'libglog.a') |
| libleveldb = os.path.join(abs_top_builddir, leveldb, 'out-static', 'libleveldb.a') |
| libzookeeper = os.path.join( |
| abs_top_builddir, zookeeper, '.libs', 'libzookeeper_mt.a') |
| libprotobuf = os.path.join( |
| abs_top_builddir, protobuf, 'src', '.libs', 'libprotobuf.a') |
| |
| if os.path.exists(libleveldb): |
| EXTRA_OBJECTS.append(libleveldb) |
| else: |
| EXTRA_OBJECTS.append('-lleveldb') |
| |
| if os.path.exists(libzookeeper): |
| EXTRA_OBJECTS.append(libzookeeper) |
| else: |
| EXTRA_OBJECTS.append('-lzookeeper_mt') |
| |
| if os.path.exists(libglog): |
| EXTRA_OBJECTS.append(libglog) |
| else: |
| EXTRA_OBJECTS.append('-lglog') |
| |
| if os.path.exists(libprotobuf): |
| EXTRA_OBJECTS.append(libprotobuf) |
| else: |
| EXTRA_OBJECTS.append('-lprotobuf') |
| |
| |
| # libev is a special case because it needs to be enabled only when |
| # libevent *is not* enabled through the top level ./configure. |
| # |
| # TODO(hartem): this entire block MUST be removed once libev is deprecated |
| # in favor of libevent. |
| if '@ENABLE_LIBEVENT_TRUE@' == '#': |
| libev = os.path.join('3rdparty', 'libev-4.22') |
| libev = os.path.join(abs_top_builddir, libev, '.libs', 'libev.a') |
| |
| if os.path.exists(libev): |
| EXTRA_OBJECTS.append(libev) |
| else: |
| EXTRA_OBJECTS.append('-lev') |
| |
| |
| # For gperftools, we need to check for the presence of libprofiler.a, since |
| # it is possible to disable perftools inside libprocess. |
| libprofiler = os.path.join( |
| abs_top_builddir, gperftools, '.libs', 'libprofiler.a') |
| |
| if os.path.exists(libprofiler): |
| EXTRA_OBJECTS.append(libprofiler) |
| |
| |
| # We link different grpc library variants based on whether SSL is enabled. |
| grpc = os.path.join('3rdparty', 'grpc-1.10.0') |
| grpc_variant = '_unsecure' if '@ENABLE_SSL_TRUE@' == '#' else '' |
| libgrpcpp = os.path.join(abs_top_builddir, grpc, 'libs', 'opt', 'libgrpc++%s.a' % grpc_variant) |
| libgrpc = os.path.join(abs_top_builddir, grpc, 'libs', 'opt', 'libgrpc%s.a' % grpc_variant) |
| libgpr = os.path.join(abs_top_builddir, grpc, 'libs', 'opt', 'libgpr.a') |
| |
| if os.path.exists(libgrpcpp): |
| EXTRA_OBJECTS.append(libgrpcpp) |
| else: |
| EXTRA_OBJECTS.append('-lgrpc++%s' % grpc_variant) |
| |
| if os.path.exists(libgrpc): |
| EXTRA_OBJECTS.append(libgrpc) |
| else: |
| EXTRA_OBJECTS.append('-lgrpc%s' % grpc_variant) |
| |
| if os.path.exists(libgpr): |
| EXTRA_OBJECTS.append(libgpr) |
| else: |
| EXTRA_OBJECTS.append('-lgpr') |
| |
| |
| # OSX uses a different linker (llvm-ld) and doesn't support --as-needed |
| # TODO(SteveNiemitz): Feature detect --as-needed instead of looking at |
| # sys.platform. |
| EXTRA_LINK_ARGS = ['-Wl,--as-needed'] if sys.platform != 'darwin' else [] |
| |
| # Add any flags from LDFLAGS. |
| if 'LDFLAGS' in os.environ: |
| for flag in os.environ['LDFLAGS'].split(): |
| EXTRA_LINK_ARGS.append(flag) |
| |
| # Add any libraries from LIBS. |
| if 'LIBS' in os.environ: |
| for library in os.environ['LIBS'].split(): |
| EXTRA_LINK_ARGS.append(library) |
| |
| # Note that we add EXTRA_OBJECTS to our dependency list to make sure |
| # that we rebuild this module when one of them changes (e.g., |
| # libprocess). |
| mesos_module = \ |
| Extension('mesos.%s._%s' % (module_name, module_name), |
| sources = SOURCES, |
| include_dirs = INCLUDE_DIRS, |
| library_dirs = LIBRARY_DIRS, |
| extra_objects = EXTRA_OBJECTS, |
| extra_link_args = EXTRA_LINK_ARGS, |
| depends = EXTRA_OBJECTS, |
| language = 'c++', |
| ) |
| return mesos_module |
| |
| executor_module = _create_module("executor") |
| scheduler_module = _create_module("scheduler") |