diff --git a/setup.py b/setup.py
index c313d52..c0ae61b 100644
--- a/setup.py
+++ b/setup.py
@@ -19,126 +19,127 @@
 from distutils import dep_util
 from distutils import log
 
-from pkgconfig import configure_extension as pkgconfig_configure_extension
+import pkgconfig
 
 
 CURR_DIR = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
 
 
 def bool_from_environ(key: str):
-  value = os.environ.get(key)
-  if not value:
-    return False
-  if value == "1":
-    return True
-  if value == "0":
-    return False
-  raise ValueError(f"Environment variable {key} has invalid value {value}. Please set it to 1, 0 or an empty string")
+    value = os.environ.get(key)
+    if not value:
+        return False
+    if value == "1":
+       return True
+    if value == "0":
+       return False
+    raise ValueError(f"Environment variable {key} has invalid value {value}. Please set it to 1, 0 or an empty string")
 
 
 def read_define(path, macro):
-  """ Return macro value from the given file. """
-  with open(path, 'r') as f:
-    for line in f:
-      m = re.match(rf'#define\s{macro}\s+(.+)', line)
-      if m:
-        return m.group(1)
-  return ''
+    """ Return macro value from the given file. """
+    with open(path, 'r') as f:
+        for line in f:
+            m = re.match(rf'#define\s{macro}\s+(.+)', line)
+            if m:
+                return m.group(1)
+
+    return ''
 
 
 def get_version():
-  """ Return library version string from 'common/version.h' file. """
-  version_file_path = os.path.join(CURR_DIR, 'c', 'common', 'version.h')
-  major = read_define(version_file_path, 'BROTLI_VERSION_MAJOR')
-  minor = read_define(version_file_path, 'BROTLI_VERSION_MINOR')
-  patch = read_define(version_file_path, 'BROTLI_VERSION_PATCH')
-  if not major or not minor or not patch:
-    return ''
-  return f'{major}.{minor}.{patch}'
+    """ Return library version string from 'common/version.h' file. """
+    version_file_path = os.path.join(CURR_DIR, 'c', 'common', 'version.h')
+    major = read_define(version_file_path, 'BROTLI_VERSION_MAJOR')
+    minor = read_define(version_file_path, 'BROTLI_VERSION_MINOR')
+    patch = read_define(version_file_path, 'BROTLI_VERSION_PATCH')
+    if not major or not minor or not patch:
+        return ''
+    return f'{major}.{minor}.{patch}'
 
 
 def get_test_suite():
-  test_loader = unittest.TestLoader()
-  test_suite = test_loader.discover('python', pattern='*_test.py')
-  return test_suite
+    test_loader = unittest.TestLoader()
+    test_suite = test_loader.discover('python', pattern='*_test.py')
+    return test_suite
 
 
 class BuildExt(build_ext):
 
-  def get_source_files(self):
-    filenames = build_ext.get_source_files(self)
-    for ext in self.extensions:
-      filenames.extend(ext.depends)
-    return filenames
+    def get_source_files(self):
+        filenames = build_ext.get_source_files(self)
+        for ext in self.extensions:
+            filenames.extend(ext.depends)
+        return filenames
 
-  def build_extension(self, ext):
-    if ext.sources is None or not isinstance(ext.sources, (list, tuple)):
-      raise errors.DistutilsSetupError(
-        "in 'ext_modules' option (extension '%s'), "
-        "'sources' must be present and must be "
-        "a list of source filenames" % ext.name)
+    def build_extension(self, ext):
+        if ext.sources is None or not isinstance(ext.sources, (list, tuple)):
+            raise errors.DistutilsSetupError(
+            "in 'ext_modules' option (extension '%s'), "
+            "'sources' must be present and must be "
+            "a list of source filenames" % ext.name)
 
-    ext_path = self.get_ext_fullpath(ext.name)
-    depends = ext.sources + ext.depends
-    if not (self.force or dep_util.newer_group(depends, ext_path, 'newer')):
-      log.debug("skipping '%s' extension (up-to-date)", ext.name)
-      return
-    else:
-      log.info("building '%s' extension", ext.name)
+        ext_path = self.get_ext_fullpath(ext.name)
+        depends = ext.sources + ext.depends
+        if not (self.force or dep_util.newer_group(depends, ext_path, 'newer')):
+            log.debug("skipping '%s' extension (up-to-date)", ext.name)
+            return
+        else:
+            log.info("building '%s' extension", ext.name)
 
-    c_sources = []
-    for source in ext.sources:
-      if source.endswith('.c'):
-        c_sources.append(source)
-    extra_args = ext.extra_compile_args or []
+        c_sources = []
+        for source in ext.sources:
+            if source.endswith('.c'):
+                 c_sources.append(source)
+        extra_args = ext.extra_compile_args or []
 
-    objects = []
+        objects = []
 
-    macros = ext.define_macros[:]
-    if platform.system() == 'Darwin':
-      macros.append(('OS_MACOSX', '1'))
-    elif self.compiler.compiler_type == 'mingw32':
-      # On Windows Python 2.7, pyconfig.h defines "hypot" as "_hypot",
-      # This clashes with GCC's cmath, and causes compilation errors when
-      # building under MinGW: http://bugs.python.org/issue11566
-      macros.append(('_hypot', 'hypot'))
-    for undef in ext.undef_macros:
-      macros.append((undef,))
+        macros = ext.define_macros[:]
+        if platform.system() == 'Darwin':
+            macros.append(('OS_MACOSX', '1'))
+        elif self.compiler.compiler_type == 'mingw32':
+            # On Windows Python 2.7, pyconfig.h defines "hypot" as "_hypot",
+            # This clashes with GCC's cmath, and causes compilation errors when
+            # building under MinGW: http://bugs.python.org/issue11566
+            macros.append(('_hypot', 'hypot'))
+        for undef in ext.undef_macros:
+            macros.append((undef,))
 
-    objs = self.compiler.compile(
-        c_sources,
-        output_dir=self.build_temp,
-        macros=macros,
-        include_dirs=ext.include_dirs,
-        debug=self.debug,
-        extra_postargs=extra_args,
-        depends=ext.depends)
-    objects.extend(objs)
+        objs = self.compiler.compile(
+            c_sources,
+            output_dir=self.build_temp,
+            macros=macros,
+            include_dirs=ext.include_dirs,
+            debug=self.debug,
+            extra_postargs=extra_args,
+            depends=ext.depends)
+        objects.extend(objs)
 
-    self._built_objects = objects[:]
-    if ext.extra_objects:
-      objects.extend(ext.extra_objects)
-    extra_args = ext.extra_link_args or []
-    # when using GCC on Windows, we statically link libgcc and libstdc++,
-    # so that we don't need to package extra DLLs
-    if self.compiler.compiler_type == 'mingw32':
-        extra_args.extend(['-static-libgcc', '-static-libstdc++'])
+        self._built_objects = objects[:]
+        if ext.extra_objects:
+            objects.extend(ext.extra_objects)
+        extra_args = ext.extra_link_args or []
+        # when using GCC on Windows, we statically link libgcc and libstdc++,
+        # so that we don't need to package extra DLLs
+        if self.compiler.compiler_type == 'mingw32':
+            extra_args.extend(['-static-libgcc', '-static-libstdc++'])
 
-    ext_path = self.get_ext_fullpath(ext.name)
-    # Detect target language, if not provided
-    language = ext.language or self.compiler.detect_language(c_sources)
+        ext_path = self.get_ext_fullpath(ext.name)
+        # Detect target language, if not provided
+        language = ext.language or self.compiler.detect_language(c_sources)
 
-    self.compiler.link_shared_object(
-        objects,
-        ext_path,
-        libraries=self.get_libraries(ext),
-        library_dirs=ext.library_dirs,
-        runtime_library_dirs=ext.runtime_library_dirs,
-        extra_postargs=extra_args,
-        export_symbols=self.get_export_symbols(ext),
-        debug=self.debug,
-        build_temp=self.build_temp,
-        target_lang=language)
+        self.compiler.link_shared_object(
+            objects,
+            ext_path,
+            libraries=self.get_libraries(ext),
+            library_dirs=ext.library_dirs,
+            runtime_library_dirs=ext.runtime_library_dirs,
+            extra_postargs=extra_args,
+            export_symbols=self.get_export_symbols(ext),
+            debug=self.debug,
+            build_temp=self.build_temp,
+            target_lang=language)
 
 
 NAME = 'Brotli'
@@ -186,23 +187,34 @@
 PY_MODULES = ['brotli']
 
 USE_SYSTEM_BROTLI = bool_from_environ('USE_SYSTEM_BROTLI')
-print(f"[BROTLI] USE_SYSTEM_BROTLI={USE_SYSTEM_BROTLI}")
+
 if USE_SYSTEM_BROTLI:
-    brotli_extension = Extension(
-                            '_brotli',
-                            sources=[
-                                'python/_brotli.c'
-                            ]
-                        )
-
     REQUIRED_BROTLI_SYSTEM_LIBRARIES = ["libbrotlicommon", "libbrotlienc", "libbrotlidec"]
-    pkgconfig_configure_extension(brotli_extension, " ".join(REQUIRED_BROTLI_SYSTEM_LIBRARIES))
 
-    print(f"[BROTLI] {brotli_extension.include_dirs}")
-    print(f"[BROTLI] {brotli_extension.library_dirs}")
-    print(f"[BROTLI] {brotli_extension.libraries}")
-    print(f"[BROTLI] {brotli_extension.extra_compile_args}")
-    print(f"[BROTLI] {brotli_extension.extra_link_args}")
+    define_macros = []
+    include_dirs = []
+    libraries = []
+    library_dirs = []
+
+    for required_system_library in REQUIRED_BROTLI_SYSTEM_LIBRARIES:
+        package_configuration = pkgconfig.parse(required_system_library)
+
+        define_macros += package_configuration["define_macros"]
+        include_dirs += package_configuration["include_dirs"]
+        libraries += package_configuration["libraries"]
+        library_dirs += package_configuration["library_dirs"]
+
+    brotli_extension = Extension(
+        '_brotli',
+        sources=[
+            'python/_brotli.c'
+        ],
+        include_dirs=include_dirs,
+        define_macros=define_macros,
+        libraries=libraries,
+        library_dirs=library_dirs
+    )
+
 
     EXT_MODULES = [brotli_extension]
 else:
