1"""The build configuration file for Python-Poppler-Qt5, used by sip.""" 2 3from os.path import join 4import re 5import subprocess 6from pyqtbuild import PyQtBindings, PyQtProject 7from sipbuild import Option 8import PyQt5 9 10 11class PythonPopplerQt5(PyQtProject): 12 """The Project class.""" 13 14 def __init__(self): 15 super().__init__() 16 self.bindings_factories = [PopplerQt5Bindings] 17 18 def update(self, tool): 19 """Allows SIP to find PyQt5 .sip files.""" 20 super().update(tool) 21 self.sip_include_dirs.append(join(PyQt5.__path__[0], 'bindings')) 22 23 24class PopplerQt5Bindings(PyQtBindings): 25 """The Poppler-Qt5 Bindings class.""" 26 27 def __init__(self, project): 28 super().__init__(project, name='Poppler-Qt5', 29 sip_file='poppler-qt5.sip', 30 qmake_QT=['xml']) 31 32 def get_options(self): 33 """Our custom options that a user can pass to sip-build.""" 34 options = super().get_options() 35 options.append( 36 Option('poppler_version', 37 help='version of the poppler library', 38 metavar='VERSION')) 39 return options 40 41 @staticmethod 42 def run_pkg_config(option): 43 output = subprocess.check_output( 44 ['pkg-config', option, 'poppler-qt5'], 45 text=True) 46 return output.rstrip() 47 48 def apply_user_defaults(self, tool): 49 # Set include_dirs, library_dirs and libraries based on pkg-config data 50 cflags = self.run_pkg_config('--cflags-only-I').split() 51 libs = self.run_pkg_config('--libs').split() 52 self.include_dirs.extend( 53 flag[2:] for flag in cflags if flag.startswith('-I')) 54 self.library_dirs.extend( 55 flag[2:] for flag in libs if flag.startswith('-L')) 56 self.libraries.extend( 57 flag[2:] for flag in libs if flag.startswith('-l')) 58 59 # Generate version.sip file 60 if self.poppler_version is not None: 61 poppler_qt5_version = self.poppler_version 62 else: 63 poppler_qt5_version = self.run_pkg_config('--modversion') 64 poppler_qt5_version = tuple(map(int, poppler_qt5_version.split('.'))) 65 python_poppler_qt5_version = self.project.version_str.split('.') 66 format_dict = { 67 'vlen': 'i' * len(python_poppler_qt5_version), 68 'vargs': ', '.join(python_poppler_qt5_version), 69 'pvlen': 'i' * len(poppler_qt5_version), 70 'pvargs': ', '.join(map(str, poppler_qt5_version)), 71 } 72 with open('version.sip.in') as template_file: 73 version_sip_template = template_file.read() 74 with open('version.sip', 'w') as version_file: 75 version_file.write(version_sip_template.format(**format_dict)) 76 77 # Add Poppler version tag 78 if poppler_qt5_version: 79 with open('timeline.sip') as timeline_file: 80 timeline = timeline_file.read() 81 for match in re.finditer(r'POPPLER_V(\d+)_(\d+)_(\d+)', timeline): 82 if poppler_qt5_version < tuple(map(int, match.group(1, 2, 3))): 83 break 84 tag = match.group() 85 else: 86 tag = 'POPPLER_V0_20_0' 87 self.tags.append(tag) 88 self.tags.append("WS_X11") 89 super().apply_user_defaults(tool) 90