Jelajahi Sumber

macOS support in utilikit (#210)

tectiv3 7 tahun lalu
induk
melakukan
2d563a6ddc

+ 4 - 0
.gitignore

@@ -11,3 +11,7 @@ __pycache__/
 
 # Ignore downloaded syzygy archive
 /syzygy-*.tar.gz
+
+# Ignore macOS Finder meta
+.DS_Store
+.tm_properties

+ 49 - 2
BUILDING.md

@@ -154,8 +154,55 @@ See `build.py` for more on customizing the build environment or process.
 
 #### Build
 
-    # Change directory to ungoogled-chromium's root directory
-    python3 build.py
+# Change directory to ungoogled-chromium's root directory
+
+```
+export UTILIKIT_CONFIG_TYPE=macos
+./utilikit/check_requirements.py --common --quilt --macos
+mkdir build/
+mkdir build/sandbox
+mkdir build/downloads
+./utilikit/prepare_sources.py
+./utilikit/substitute_domains.py
+./utilikit/generate_build_files.py macos --apply-domain-substitution
+cd build/sandbox
+quilt push -a
+./tools/gn/bootstrap/bootstrap.py -v
+./out/Release/gn gen out/Release  --fail-on-unused-args
+```
+#### Modify args.gn inside `out/Release` to look like this
+```
+is_debug = false
+treat_warnings_as_errors=false
+fatal_linker_warnings=false
+use_ozone=false
+use_sysroot=false
+enable_remoting=false
+enable_nacl=false
+enable_nacl_nonsfi=false
+safe_browsing_mode=0
+enable_webrtc=false
+enable_hangout_services_extension=false
+fieldtrial_testing_like_official_build=true
+proprietary_codecs=true
+ffmpeg_branding="Chrome"
+enable_google_now=false
+enable_one_click_signin=false
+enable_hotwording=false
+google_api_key=""
+google_default_client_id=""
+google_default_client_secret=""
+use_official_google_api_keys=false
+remove_webcore_debug_symbols=true
+enable_widevine=true
+symbol_level=0
+enable_iterator_debugging=false
+```
+##### and finally:
+```
+ninja -C out/Release chrome
+```
+
 
 ### Arch Linux
 

+ 104 - 0
utilikit/_build_files_generators/macos.py

@@ -0,0 +1,104 @@
+# -*- coding: UTF-8 -*-
+
+# ungoogled-chromium: Modifications to Google Chromium for removing Google
+# integration and enhancing privacy, control, and transparency
+# Copyright (C) 2017  Eloston
+#
+# This file is part of ungoogled-chromium.
+#
+# ungoogled-chromium is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# ungoogled-chromium is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with ungoogled-chromium.  If not, see <http://www.gnu.org/licenses/>.
+
+"""macOS-specific build files generation code"""
+
+import string
+import locale
+import datetime
+import re
+import distutils.dir_util
+import os
+import shutil
+
+from .. import _common
+from .. import substitute_domains as _substitute_domains
+
+# Private definitions
+
+def _get_packaging_resources():
+    return _common.get_resources_dir() / _common.PACKAGING_DIR / "macos"
+
+def _traverse_directory(directory):
+    """Traversal of an entire directory tree in random order"""
+    iterator_stack = list()
+    iterator_stack.append(directory.iterdir())
+    while iterator_stack:
+        current_iter = iterator_stack.pop()
+        for path in current_iter:
+            yield path
+            if path.is_dir():
+                iterator_stack.append(current_iter)
+                iterator_stack.append(path.iterdir())
+                break
+
+class _BuildFileStringTemplate(string.Template):
+    """
+    Custom string substitution class
+
+    Inspired by
+    http://stackoverflow.com/questions/12768107/string-substitutions-using-templates-in-python
+    """
+
+    pattern = r"""
+    {delim}(?:
+      (?P<escaped>{delim}) |
+      _(?P<named>{id})      |
+      {{(?P<braced>{id})}}   |
+      (?P<invalid>{delim}((?!_)|(?!{{)))
+    )
+    """.format(delim=re.escape("$ungoog"), id=string.Template.idpattern)
+
+def _escape_string(value):
+    return value.replace('"', '\\"')
+
+def _get_parsed_gn_flags(gn_flags):
+    def _shell_line_generator(gn_flags):
+        for key, value in gn_flags.items():
+            yield "defines+=" + _escape_string(key) + "=" + _escape_string(value)
+    return os.linesep.join(_shell_line_generator(gn_flags))
+
+# Public definitions
+
+def generate_build_files(resources, output_dir, build_output, apply_domain_substitution):
+    """
+    Generates the `macos` directory in `output_dir` using resources from
+    `resources`
+    """
+    build_file_subs = dict(
+        changelog_version="{}-{}".format(*resources.read_version()),
+        build_output=build_output,
+        gn_flags=_get_parsed_gn_flags(resources.read_gn_flags())
+    )
+
+    macos_dir = output_dir / "macos"
+    macos_dir.mkdir(exist_ok=True)
+
+    distutils.dir_util.copy_tree(str(resources.get_patches_dir()),
+                                 str(macos_dir / _common.PATCHES_DIR))
+    patch_order = resources.read_patch_order()
+    if apply_domain_substitution:
+        _substitute_domains.substitute_domains(
+            _substitute_domains.get_parsed_domain_regexes(resources.read_domain_regex_list()),
+            patch_order, macos_dir / _common.PATCHES_DIR, log_warnings=False)
+    _common.write_list(macos_dir / _common.PATCHES_DIR / "series",
+                       patch_order)
+

+ 1 - 0
utilikit/_common.py

@@ -261,6 +261,7 @@ def get_resources_dir():
 def get_resource_obj():
     """Returns a resource object"""
     config_type = os.environ.get(_ENV_PREFIX + "CONFIG_TYPE")
+    print("Config type {}".format(config_type))
     if not config_type:
         raise ValueError(_ENV_PREFIX + "CONFIG_TYPE environment variable must be defined")
     if config_type == "custom":

+ 9 - 0
utilikit/generate_build_files.py

@@ -58,6 +58,15 @@ def _add_subparsers(subparsers):
     debian_subparser.add_argument("--apply-domain-substitution", action="store_true",
                                   help="Use domain substitution")
     debian_subparser.set_defaults(callback=_debian_callback)
+    def _macos_callback(resources, output_dir, args):
+        from ._build_files_generators import macos
+        macos.generate_build_files(resources, output_dir, args.build_output, args.apply_domain_substitution)
+    macos_subparser = subparsers.add_parser("macos", help="Generator for macos")
+    macos_subparser.add_argument("--build-output", metavar="DIRECTORY", default="out/Default",
+                                  help="The Chromium build output directory")
+    macos_subparser.add_argument("--apply-domain-substitution", action="store_true",
+                                  help="Use domain substitution")
+    macos_subparser.set_defaults(callback=_macos_callback)
 
 def _main():
     parser = argparse.ArgumentParser(description=__doc__)