From b262b7bba08043769a93e48bd418e79cbba1763c Mon Sep 17 00:00:00 2001 From: Berk Onat Date: Tue, 24 Oct 2017 15:49:11 +0100 Subject: [PATCH] Python setup.py with CMake --- LICENSE | 53 +++++++-- pymolfile/molfile/.lipo | Bin 110974 -> 0 bytes .../molfile_plugins/compile/FindNetCDF.cmake | 102 ++++++++++++++++++ setup.py | 62 ++++++++++- 4 files changed, 205 insertions(+), 12 deletions(-) delete mode 100644 pymolfile/molfile/.lipo create mode 100644 pymolfile/molfile/molfile_plugins/compile/FindNetCDF.cmake diff --git a/LICENSE b/LICENSE index 470e42a..a398893 100644 --- a/LICENSE +++ b/LICENSE @@ -1,12 +1,19 @@ LICENSE for pymolfile --------------------- -All files of pymolfile except the files under vmd_molfile_plugins directory -which are licensed below with "LICENSE for VMD molfile_plugins" are -licensed under the following UIUC Open Source License: - +Exceptions for pymolfile LICENSE: +--------------------------------- +- FindNetCDF.cmake is LICENSE with BSD-2 Clause (See section 'LICENSE for + FindNetCDF.cmake file' in the file and below) +- VMD molfile_plugins under molfile_plugins directory are licensed with + UIUC Open Source Licence (See section 'LICENSE for VMD molfile_plugins' + in this file) + +All files of pymolfile except the files listed above are licensed with +UIUC Open Source License at section 'LICENSE for Pymolfile' in this file + +LICENSE for Pymolfile: ----------------------------------------------------------------------------- - University of Illinois Open Source License Copyright 2017 University of Warwick All rights reserved. @@ -41,12 +48,11 @@ THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE. +----------------------------------------------------------------------------- - -LICENSE for VMD molfile_plugins -------------------------------- - +LICENSE for VMD molfile_plugins: +----------------------------------------------------------------------------- University of Illinois Open Source License Copyright 2006 Theoretical and Computational Biophysics Group, All rights reserved. @@ -81,5 +87,34 @@ THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE. +----------------------------------------------------------------------------- + + +LICENSE for FindNetCDF.cmake file: +----------------------------------------------------------------------------- +Copyright Jed Brown +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +----------------------------------------------------------------------------- diff --git a/pymolfile/molfile/.lipo b/pymolfile/molfile/.lipo deleted file mode 100644 index 6203b131c0616fd693c105831a2b1b23fb8fa669..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110974 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%0AGkN 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 diff --git a/pymolfile/molfile/molfile_plugins/compile/FindNetCDF.cmake b/pymolfile/molfile/molfile_plugins/compile/FindNetCDF.cmake new file mode 100644 index 0000000..669630a --- /dev/null +++ b/pymolfile/molfile/molfile_plugins/compile/FindNetCDF.cmake @@ -0,0 +1,102 @@ +# - Find NetCDF +# Find the native NetCDF includes and library +# +# NETCDF_INCLUDES - where to find netcdf.h, etc +# NETCDF_LIBRARIES - Link these libraries when using NetCDF +# NETCDF_FOUND - True if NetCDF found including required interfaces (see below) +# +# Your package can require certain interfaces to be FOUND by setting these +# +# NETCDF_CXX - require the C++ interface and link the C++ library +# NETCDF_F77 - require the F77 interface and link the fortran library +# NETCDF_F90 - require the F90 interface and link the fortran library +# +# The following are not for general use and are included in +# NETCDF_LIBRARIES if the corresponding option above is set. +# +# NETCDF_LIBRARIES_C - Just the C interface +# NETCDF_LIBRARIES_CXX - C++ interface, if available +# NETCDF_LIBRARIES_F77 - Fortran 77 interface, if available +# NETCDF_LIBRARIES_F90 - Fortran 90 interface, if available +# +# Normal usage would be: +# set (NETCDF_F90 "YES") +# find_package (NetCDF REQUIRED) +# target_link_libraries (uses_f90_interface ${NETCDF_LIBRARIES}) +# target_link_libraries (only_uses_c_interface ${NETCDF_LIBRARIES_C}) + +# Taken from: https://github.com/jedbrown/cmake-modules/blob/master/FindNetCDF.cmake +# +# Below copyright author list is gathered using +# "git shortlog -s FindNetCDF.cmake" +# at Oct 24th, 2017 +# +#Copyright Jed Brown +#All rights reserved. +# +#Redistribution and use in source and binary forms, with or without modification, +#are permitted provided that the following conditions are met: +# +#* Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +#* Redistributions in binary form must reproduce the above copyright notice, this +# list of conditions and the following disclaimer in the documentation and/or +# other materials provided with the distribution. +# +#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +#ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +#ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +if (NETCDF_INCLUDES AND NETCDF_LIBRARIES) + # Already in cache, be silent + set (NETCDF_FIND_QUIETLY TRUE) +endif (NETCDF_INCLUDES AND NETCDF_LIBRARIES) + +find_path (NETCDF_INCLUDES netcdf.h + HINTS NETCDF_DIR ENV NETCDF_DIR) + +find_library (NETCDF_LIBRARIES_C NAMES netcdf) +mark_as_advanced(NETCDF_LIBRARIES_C) + +set (NetCDF_has_interfaces "YES") # will be set to NO if we're missing any interfaces +set (NetCDF_libs "${NETCDF_LIBRARIES_C}") + +get_filename_component (NetCDF_lib_dirs "${NETCDF_LIBRARIES_C}" PATH) + +macro (NetCDF_check_interface lang header libs) + if (NETCDF_${lang}) + find_path (NETCDF_INCLUDES_${lang} NAMES ${header} + HINTS "${NETCDF_INCLUDES}" NO_DEFAULT_PATH) + find_library (NETCDF_LIBRARIES_${lang} NAMES ${libs} + HINTS "${NetCDF_lib_dirs}" NO_DEFAULT_PATH) + mark_as_advanced (NETCDF_INCLUDES_${lang} NETCDF_LIBRARIES_${lang}) + if (NETCDF_INCLUDES_${lang} AND NETCDF_LIBRARIES_${lang}) + list (INSERT NetCDF_libs 0 ${NETCDF_LIBRARIES_${lang}}) # prepend so that -lnetcdf is last + else (NETCDF_INCLUDES_${lang} AND NETCDF_LIBRARIES_${lang}) + set (NetCDF_has_interfaces "NO") + message (STATUS "Failed to find NetCDF interface for ${lang}") + endif (NETCDF_INCLUDES_${lang} AND NETCDF_LIBRARIES_${lang}) + endif (NETCDF_${lang}) +endmacro (NetCDF_check_interface) + +NetCDF_check_interface (CXX netcdfcpp.h netcdf_c++) +NetCDF_check_interface (F77 netcdf.inc netcdff) +NetCDF_check_interface (F90 netcdf.mod netcdff) + +set (NETCDF_LIBRARIES "${NetCDF_libs}" CACHE STRING "All NetCDF libraries required for interface level") + +# handle the QUIETLY and REQUIRED arguments and set NETCDF_FOUND to TRUE if +# all listed variables are TRUE +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (NetCDF DEFAULT_MSG NETCDF_LIBRARIES NETCDF_INCLUDES NetCDF_has_interfaces) + +mark_as_advanced (NETCDF_LIBRARIES NETCDF_INCLUDES) diff --git a/setup.py b/setup.py index c189d0f..6776f7e 100644 --- a/setup.py +++ b/setup.py @@ -14,6 +14,62 @@ except: from Cython.Build import cythonize from Cython.Distutils import build_ext +# from http://www.benjack.io/2017/06/12/python-cpp-tests.html +class CMakeExtension(Extension): + def __init__(self, name, sourcedir=''): + Extension.__init__(self, name, sources=[]) + self.sourcedir = os.path.abspath(sourcedir) + +class CMakeBuild(build_ext): + def run(self): + try: + out = subprocess.check_output(['cmake', '--version']) + except OSError: + raise RuntimeError( + "CMake must be installed to build the following extensions: " + + ", ".join(e.name for e in self.extensions)) + + if platform.system() == "Windows": + cmake_version = LooseVersion(re.search(r'version\s*([\d.]+)', + out.decode()).group(1)) + if cmake_version < '3.1.0': + raise RuntimeError("CMake >= 3.1.0 is required on Windows") + + for ext in self.extensions: + self.build_extension(ext) + + def build_extension(self, ext): + extdir = os.path.abspath( + os.path.dirname(self.get_ext_fullpath(ext.name))) + cmake_args = ['-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + extdir, + '-DPYTHON_EXECUTABLE=' + sys.executable] + + cfg = 'Debug' if self.debug else 'Release' + build_args = ['--config', cfg] + + if platform.system() == "Windows": + cmake_args += ['-DCMAKE_LIBRARY_OUTPUT_DIRECTORY_{}={}'.format( + cfg.upper(), + extdir)] + if sys.maxsize > 2**32: + cmake_args += ['-A', 'x64'] + build_args += ['--', '/m'] + else: + cmake_args += ['-DCMAKE_BUILD_TYPE=' + cfg] + build_args += ['--', '-j2'] + + env = os.environ.copy() + env['CXXFLAGS'] = '{} -DVERSION_INFO=\\"{}\\"'.format( + env.get('CXXFLAGS', ''), + self.distribution.get_version()) + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + subprocess.check_call(['cmake', ext.sourcedir] + cmake_args, + cwd=self.build_temp, env=env) + subprocess.check_call(['cmake', '--build', '.'] + build_args, + cwd=self.build_temp) + print() # Add an empty line for cleaner output + def get_ext_filename_without_platform_suffix(filename): name, ext = os.path.splitext(filename) ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') @@ -41,8 +97,8 @@ CLASSIFIERS = [ "Intended Audience :: Developers", "License :: OSI Approved :: University of Illinois Open Source License (UIUC)", "Programming Language :: C", + "Programming Language :: C++", "Programming Language :: Python", - "Programming Language :: Python :: 2", "Programming Language :: Python :: 3", "Topic :: Scientific/Engineering :: Physics", "Topic :: Scientific/Engineering :: Chemistry", @@ -157,7 +213,7 @@ if __name__ == '__main__': # command_extension={'build_ext': BuildExtWithoutPlatformSuffix} #else: # command_extension={} - command_extension={} + command_extension=dict(build_ext=CMakeBuild) setup( name = "pymolfile", @@ -172,7 +228,7 @@ if __name__ == '__main__': packages = find_packages(), cmdclass= command_extension, ext_modules = [ - #libmolfile_plugin_compile(cmake_libmolfile_plugin_compile), + CMakeExtension('molfile', sourcedir='pymolfile/molfile/'), libpymolfile_module, ], py_modules=["pymolfile"], -- GitLab