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