You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

134 lines
5.1 KiB

  1. #!/usr/bin/env python
  2. #
  3. # Copyright (c) 2015, SmartFile <tcunningham@smartfile.com>
  4. # All rights reserved.
  5. #
  6. # Redistribution and use in source and binary forms, with or without
  7. # modification, are permitted provided that the following conditions are met:
  8. # * Redistributions of source code must retain the above copyright
  9. # notice, this list of conditions and the following disclaimer.
  10. # * Redistributions in binary form must reproduce the above copyright
  11. # notice, this list of conditions and the following disclaimer in the
  12. # documentation and/or other materials provided with the distribution.
  13. # * Neither the name of the organization nor the
  14. # names of its contributors may be used to endorse or promote products
  15. # derived from this software without specific prior written permission.
  16. #
  17. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  18. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  19. # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  20. # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
  21. # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  22. # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  23. # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  24. # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  26. # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. from os import environ
  28. try:
  29. from setuptools import setup, Extension
  30. from setuptools.command.build_ext import build_ext
  31. except ImportError:
  32. from distutils.core import setup, Extension
  33. from distutils.command.build_ext import build_ext
  34. import subprocess
  35. # Use a provided libarchive else default to hard-coded path.
  36. libarchivePrefix = environ.get('LIBARCHIVE_PREFIX')
  37. includePath = f"{libarchivePrefix or '/usr'}/include"
  38. # retreive the version number form SWIG generated file
  39. print("includePath:", (libarchivePrefix, includePath))
  40. cmd = [
  41. 'awk',
  42. '/#define.*ARCHIVE_VERSION_NUMBER/ { if (match($0,"[[:digit:]]+")) print substr($0, RSTART,RLENGTH) }',
  43. f"{includePath}/archive.h"
  44. ]
  45. p = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  46. print("awk output:", p.stdout.decode('utf-8'))
  47. vnum = int(p.stdout)
  48. name = 'python-libarchive-ext'
  49. version = '{}.{}.{}'.format(vnum // 1000000, (vnum // 1000) % 100, vnum % 100)
  50. versrel = version
  51. readme = 'README.rst'
  52. repourl = 'https://github.com/Vadiml1024/python-libarchive'
  53. repobranch = 'extended'
  54. download_url = repourl + f'/tarball/{repobranch}'
  55. long_description = open(readme).read()
  56. class build_ext_extra(build_ext, object):
  57. """
  58. Extend build_ext allowing extra_compile_args and extra_link_args to be set
  59. on the command-line.
  60. """
  61. user_options = build_ext.user_options
  62. user_options.append(('extra-compile-args=', None, 'Extra arguments passed directly to the compiler'))
  63. user_options.append(('extra-link-args=', None, 'Extra arguments passed directly to the linker'))
  64. def initialize_options(self):
  65. build_ext.initialize_options(self)
  66. self.extra_compile_args = None
  67. self.extra_link_args = None
  68. def build_extension(self, ext):
  69. if self.extra_compile_args:
  70. ext.extra_compile_args.append(self.extra_compile_args)
  71. if self.extra_link_args:
  72. ext.extra_link_args.append(self.extra_link_args)
  73. super(build_ext_extra, self).build_extension(ext)
  74. if libarchivePrefix:
  75. extra_compile_args = ['-I{0}/include'.format(libarchivePrefix)]
  76. extra_link_args = ['-Wl,-rpath={0}/lib'.format(libarchivePrefix)]
  77. environ['LDFLAGS'] = '-L{0}/lib {1}'.format(libarchivePrefix, environ.get('LDFLAGS', ''))
  78. else:
  79. extra_compile_args = []
  80. extra_link_args = ['-l:libarchive.so.18']
  81. __libarchive = Extension(
  82. name='libarchive.__libarchive',
  83. sources=['libarchive/_libarchive.i'],
  84. libraries=['archive'],
  85. extra_compile_args=extra_compile_args,
  86. extra_link_args=extra_link_args,
  87. include_dirs=['libarchive'],
  88. )
  89. setup(
  90. name=name,
  91. version=versrel,
  92. description='A libarchive wrapper for Python supporting password protection.',
  93. long_description=long_description,
  94. license='BSD-style license',
  95. platforms=['any'],
  96. author='Vadim Lebedev, Ben Timby, Travis Cunningham, Ryan Johnston, SmartFile',
  97. author_email='vadiml1024@gmail.com',
  98. url=repourl,
  99. download_url=download_url,
  100. packages=['libarchive'],
  101. classifiers=[
  102. 'Development Status :: 4 - Beta',
  103. 'Intended Audience :: Developers',
  104. 'Operating System :: OS Independent',
  105. 'Programming Language :: C',
  106. 'Programming Language :: Python',
  107. 'Topic :: System :: Archiving :: Compression',
  108. 'Topic :: Software Development :: Libraries :: Python Modules',
  109. ],
  110. cmdclass={
  111. 'build_ext': build_ext_extra,
  112. },
  113. ext_modules=[__libarchive],
  114. )