#!env python3 pkgver = '91.0' nightly_ver = '93.0a1' # # build.py - try move functionality away from that too big/horrible build script. # import optparse import sys import os import glob import time start_time = time.time() parser = optparse.OptionParser() parser.add_option('-x', '--cross', dest='cross_compile', default=False, action="store_true") parser.add_option('-n', '--no-execute', dest='no_execute', default=False, action="store_true") parser.add_option('-l', '--no-librewolf', dest='no_librewolf', default=False, action="store_true") parser.add_option('-s', '--src', dest='src', default='release') parser.add_option('-t', '--distro', dest='distro', default='autodetect') parser.add_option('-T', '--token', dest='token', default='') parser.add_option('-3', '--i386', dest='i386', default=False, action="store_true") parser.add_option('-P', '--settings-pane', dest='settings_pane', default=False, action="store_true") options, remainder = parser.parse_args() # try autodetecting options.distro if options.distro == 'autodetect': options.distro = 'win' if os.path.isdir('/Applications'): options.distro = 'osx' elif os.path.isdir('/etc'): options.distro = 'rpm' if os.path.isdir('/etc/apt'): options.distro = 'deb' def script_exit(statuscode): if (time.time() - start_time) > 60: # print elapsed time elapsed = time.strftime("%H:%M:%S", time.gmtime(time.time() - start_time)) print(f"\n\aElapsed time: {elapsed}") sys.exit(statuscode) def enter_srcdir(): dir = "firefox-{}".format(pkgver) if options.src == 'nightly': dir = 'mozilla-unified' elif options.src == 'tor-browser': dir = 'tor-browser' elif options.src == 'gecko-dev': dir = 'gecko-dev' print("cd {}".format(dir)) if not options.no_execute: try: os.chdir(dir) except: print("fatal error: can't change to '{}' folder.".format(dir)) script_exit(1) def leave_srcdir(): print("cd ..") if not options.no_execute: os.chdir("..") def exec(cmd): if cmd != '': print(cmd) if not options.no_execute: retval = os.system(cmd) if retval != 0: print("fatal error: command '{}' failed".format(cmd)) script_exit(1) def patch(patchfile): cmd = "patch -p1 -i {}".format(patchfile) print("\n*** -> {}".format(cmd)) if not options.no_execute: retval = os.system(cmd) if retval != 0: print("fatal error: patch '{}' failed".format(patchfile)) script_exit(1) # # Utilities: # def execute_update_submodules(): exec("git submodule update --recursive") exec("git submodule foreach git pull origin master") exec("git submodule foreach git merge origin master") def execute_git_init(): if options.src != 'release': print("fatal error: git_init only works with the release source (--src release)") script_exit(1) enter_srcdir() exec("rm -rf .git") exec("git init") exec("git config core.safecrlf false") exec("git config commit.gpgsign false") exec("git add -f * .[a-z]*") exec("git commit -am initial") leave_srcdir() def execute_deps_deb(): deps1 = "python python-dev python3 python3-dev python3-distutils clang pkg-config libpulse-dev gcc" deps2 = "curl wget nodejs libpango1.0-dev nasm yasm zip m4 libgtk-3-dev libgtk2.0-dev libdbus-glib-1-dev" deps3 = "libxt-dev python3-pip mercurial automake autoconf libtool m4" exec("apt install -y {} {} {}".format(deps1,deps2,deps3)) def execute_deps_rpm(): deps1 = "python3 python3-distutils-extra clang pkg-config gcc curl wget nodejs nasm yasm zip m4" deps2 = "python3-zstandard python-zstandard python-devel python3-devel gtk3-devel llvm gtk2-devel dbus-glib-devel libXt-devel pulseaudio-libs-devel" exec("dnf -y install {} {}".format(deps1,deps2)) def execute_deps_pkg(): deps = "wget gmake m4 python3 py37-sqlite3 pkgconf llvm node nasm zip unzip yasm" exec("pkg install {}".format(deps)) def execute_rustup(): # rust needs special love: https://www.atechtown.com/install-rust-language-on-debian-10/ exec("curl https://sh.rustup.rs -sSf | sh") exec("cargo install cbindgen") def execute_mach_env(): enter_srcdir() exec("bash ./mach create-mach-environment") leave_srcdir() def execute_reset(): if options.src == 'release': path = "firefox-{}/.git/index".format(pkgver) if not os.path.isfile(path): print("fatal error: cannot reset '--src release' sources as it's not under version control.") script_exit(1) enter_srcdir() exec("git reset --hard") leave_srcdir() elif options.src == 'nightly': enter_srcdir() exec("hg up -C") exec("hg purge") exec("hg pull -u") leave_srcdir() elif options.src == 'tor-browser': enter_srcdir() exec("git reset --hard") leave_srcidr() elif options.src == 'gecko-dev': enter_srcdir() exec("git reset --hard") leave_srcdir() # # Targets: # def execute_fetch(): if options.src == 'release': exec("rm -f firefox-{}.source.tar.xz".format(pkgver)) exec("wget -q https://archive.mozilla.org/pub/firefox/releases/{}/source/firefox-{}.source.tar.xz".format(pkgver, pkgver)) elif options.src == 'nightly': if not os.path.isdir('mozilla-unified'): exec("rm -f bootstrap.py") exec("rm -rf mozilla-unified") exec("wget -q https://hg.mozilla.org/mozilla-central/raw-file/default/python/mozboot/bin/bootstrap.py") exec("python3 bootstrap.py --no-interactive --application-choice=browser") elif options.src == 'tor-browser': if not os.path.isdir('tor-browser'): exec("rm -rf tor-browser") exec("git clone --no-checkout --recursive https://git.torproject.org/tor-browser.git") patch("../patches/tb-mozconfig-win10.patch") enter_srcdir() exec("git checkout tor-browser-89.0-10.5-1-build1") exec("git submodule update --recursive") leave_srcdir() elif options.src == 'gecko-dev': if not os.path.isdir('gecko-dev'): exec("rm -rf gecko-dev") exec("git clone --depth=1 https://github.com/mozilla/gecko-dev.git") def execute_extract(): if options.src == 'release': exec("rm -rf firefox-{}".format(pkgver)) exec("tar xf firefox-{}.source.tar.xz".format(pkgver)) def execute_build(): enter_srcdir() exec("bash ./mach build") leave_srcdir() def execute_package(): enter_srcdir() exec("bash ./mach package") leave_srcdir() # # LibreWolf specific: # def create_mozconfig(contents): if not options.no_execute: f = open('mozconfig', 'w') f.write(contents) if not options.distro == 'win': f.write("\nac_add_options --with-app-name=foxgirl") if options.distro == 'osx' and options.cross_compile: f.write("\nac_add_options --target=aarch64") if options.i386: f.write("\nac_add_options --target=i386") f.write("\n") f.close() def execute_lw_do_patches(): if options.no_librewolf: return if not options.src in ['release','nightly','gecko-dev']: return enter_srcdir() # create the right mozconfig file.. create_mozconfig(mozconfig_release) # macos : if have compatibilty osx api headers, add that to mozconfig_release dir = os.environ['HOME'] + '/.mozbuild/macos-sdk/MacOSX11.1.sdk' if os.path.isdir(dir): with open('mozconfig','a') as f: f.write("\nac_add_options --with-macos-sdk=$HOME/.mozbuild/macos-sdk/MacOSX11.1.sdk") f.close() # copy branding files.. exec("cp -vr ../common/source_files/* .") exec("cp -v ../files/configure.sh browser/branding/librewolf") patches = [] if options.src == 'release': # production patches patches = [ "../common/patches/context-menu.patch", "../common/patches/remove_addons.patch", "../common/patches/megabar.patch", "../common/patches/mozilla-vpn-ad.patch", "../common/patches/allow_dark_preference_with_rfp.patch", "../common/patches/about-dialog.patch", # sed patches.. "../common/patches/sed-patches/allow-searchengines-non-esr.patch", "../common/patches/sed-patches/disable-pocket.patch", "../common/patches/sed-patches/remove-internal-plugin-certs.patch", "../common/patches/sed-patches/stop-undesired-requests.patch", ] elif options.src == 'nightly' or options.src == 'gecko-dev': # patches for future releases are caught with nightly patches = [ "../common/patches/context-menu.patch", "../patches/remove_addons-91.0a1-nightly.patch", ##"../common/patches/megabar.patch", "../patches/vpn-patch-91.0a1-nightly.patch", "../common/patches/allow_dark_preference_with_rfp.patch", "../common/patches/about-dialog.patch", # sed patches.. "../common/patches/sed-patches/allow-searchengines-non-esr.patch", "../common/patches/sed-patches/disable-pocket.patch", "../common/patches/sed-patches/remove-internal-plugin-certs.patch", ##"../common/patches/sed-patches/stop-undesired-requests.patch", ] for p in patches: patch(p) # local windows patches for p in ["../patches/browser-confvars.patch", "../patches/package-manifest.patch"]: patch(p) # insert the settings pane source (experimental) if options.settings_pane: exec('rm -rf librewolf-pref-pane') exec('git clone https://gitlab.com/ohfp/librewolf-pref-pane.git') exec('cp -vrf librewolf-pref-pane/browser/* browser') # this code ultimately does not work, it remains stuck on 'tab-overflow-indicator.svg' exec('touch browser/themes/shared/newInstall.css') exec('touch browser/themes/shared/newInstallPage.css') exec('cp browser/themes/shared/icons/pin-12.svg browser/themes/shared/icons/pin-tab.svg') exec('cp browser/themes/shared/icons/stop-to-reload.svg browser/themes/shared/icons/stop.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/icons/unpin-tab.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/controlcenter/fingerprinters.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/controlcenter/tracker-image.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/controlcenter/tracker-image-disabled.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/customizableui/menu-arrow.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/illustrations/blue-berror.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/illustrations/error-connection-failure.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/illustrations/error-server-not-found.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/illustrations/error-session-restore.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/notification-icons/canvas-blocked.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/notification-icons/canvas.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/notification-icons/indexedDB.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/notification-icons/popup-subitem.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/notification-icons/update.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/notification-icons/webauthn.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/notification-icons/block-cryptominer.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/notification-icons/block-social.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/notification-icons/block-fingerprinter.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/icons/back-12.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/controlcenter/3rdpartycookies-disabled.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/controlcenter/cryptominers-disabled.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/controlcenter/fingerprinters-disabled.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/controlcenter/socialblock-disabled.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/preferences/no-search-results.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/icons/restore-session.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/icons/quit.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/icons/reload.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/icons/send-to-device.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/icons/sign-out.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/icons/tab-12.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/icons/zoom-in.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/tabbrowser/indicator-tab-attention.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/tabbrowser/tab-audio-blocked.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/tabbrowser/tab-overflow-indicator.png') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/update-circle-fill-12.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/incontent-icons/welcome-back.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/places/folder.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/places/history.svg') exec('cp browser/themes/shared/icons/stop.svg browser/themes/shared/warning.svg') pass # EON (end of nightmare) leave_srcdir() def get_objdir(): pattern = "obj-*" retval = glob.glob(pattern) if options.no_execute: return "obj-XXX" if len(retval) != 1: print("fatal error: in execute_lw_post_build(): cannot glob build output folder '{}'".format(pattern)) script_exit(1) return retval[0] def execute_lw_post_build(): if options.no_librewolf: return enter_srcdir() dirname = get_objdir() distfolder = "dist/bin" if options.distro == 'osx': distfolder = 'dist/LibreWolf.app/Contents/Resources' if not options.no_execute: os.makedirs("{}/{}/defaults/pref".format(dirname,distfolder), exist_ok=True) os.makedirs("{}/{}/distribution".format(dirname,distfolder), exist_ok=True) exec("cp -v ../settings/defaults/pref/local-settings.js {}/{}/defaults/pref/".format(dirname,distfolder)) exec("cp -v ../settings/distribution/policies.json {}/{}/distribution/".format(dirname,distfolder)) exec("cp -v ../settings/foxgirl.cfg {}/{}/".format(dirname,distfolder)) leave_srcdir() def execute_lw_artifacts(): if options.no_librewolf: return enter_srcdir() if options.distro == 'win': exe = ".exe" ospkg = "win64" dirname = "{}/dist/firefox".format(get_objdir()) elif options.distro == 'deb': exe = "" ospkg = "deb" dirname = "{}/dist/firefox".format(get_objdir()) elif options.distro == 'rpm': exe = "" ospkg = "rpm" dirname = "{}/dist/firefox".format(get_objdir()) elif options.distro == 'osx': #exe = "" #ospkg = "osx" #dirname = "{}/dist/firefox".format(get_objdir()) exec("cp {}/dist/librewolf*.dmg ..".format(get_objdir())) leave_srcdir() return exec("rm -rf ../firefox ../librewolf") exec("cp -rv {} ..".format(dirname)) leave_srcdir() librewolfdir = "librewolf" if options.distro == 'osx': librewolfdir = 'librewolf/Librewolf.app' exec("mv firefox librewolf") if options.distro != 'osx': exec("mv -v {}/firefox{} {}/librewolf{}".format(librewolfdir,exe,librewolfdir,exe)); exec("rm -rf {}/maintainanceservice* {}/pingsender* {}/firefox.*.xml {}/precomplete {}/removed-files {}/uninstall" .format(librewolfdir,librewolfdir,librewolfdir,librewolfdir,librewolfdir,librewolfdir,librewolfdir)) exec("cp -v common/source_files/browser/branding/librewolf/firefox.ico {}/librewolf.ico".format(librewolfdir)) if options.distro != 'win': exec("cp -v files/register-librewolf files/start-librewolf files/start-librewolf.desktop.in librewolf") # create zip filename if options.src == 'release': zipname = "librewolf-{}.en-US.{}.zip".format(pkgver,ospkg) elif options.src == 'nightly': zipname = "librewolf-{}.en-US.{}-nightly.zip".format(nightly_ver,ospkg) elif options.src == 'gecko-dev': zipname = "librewolf-{}.en-US.{}-gecko-dev.zip".format(nightly_ver,ospkg) # 'windows portable' zip stuff.. if options.distro == 'win': # we need tmp to tell us what portable folder to make if options.src == 'release': tmp = pkgver else: tmp = nightly_ver exec("rm -rf librewolf-{}".format(tmp)) #exec("mkdir -p librewolf-{}/Profiles/Default librewolf-{}/LibreWolf".format(pkgver,pkgver)) os.makedirs("librewolf-{}/Profiles/Default".format(tmp), exist_ok=True) os.makedirs("librewolf-{}/LibreWolf".format(tmp), exist_ok=True) exec("cp -vr librewolf/* librewolf-{}/LibreWolf".format(tmp)) exec("rm -f librewolf-portable.exe") exec("wget -q https://gitlab.com/librewolf-community/browser/windows/uploads/8347381f01806245121adcca11b7f35c/librewolf-portable.exe") exec("mv librewolf-portable.exe librewolf-{}".format(tmp)) exec("rm -f {}".format(zipname)) exec("zip -qr9 {} librewolf-{}".format(zipname,tmp)) # 'normal' zip file.. else: exec("rm -f {}".format(zipname)) exec("zip -qr9 {} librewolf".format(zipname)) # create installer if options.distro == 'win': setupname = "librewolf-{}.en-US.win64-setup.exe".format(pkgver) if options.src == 'nightly': if os.path.isfile(setupname): exec("rm -f tmp.exe") exec("mv {} tmp.exe".format(setupname)) setupname = "librewolf-{}.en-US.win64-nightly-setup.exe".format(nightly_ver) elif options.src == 'gecko-dev': if os.path.isfile(setupname): exec("rm -f tmp.exe") exec("mv {} tmp.exe".format(setupname)) setupname = "librewolf-{}.en-US.win64-gecko-dev-setup.exe".format(nightly_ver) exec("rm -f {} tmp.nsi".format(setupname)) s = pkgver if options.src == 'nightly' or options.src == 'gecko-dev': s = nightly_ver exec("sed \"s/pkg_version/{}/g\" < setup.nsi > tmp.nsi".format(s)) exec("makensis-3.01.exe -V1 tmp.nsi") exec("rm -f tmp.nsi") from_name = 'librewolf-{}.en-US.win64-setup.exe'.format(s) if from_name != setupname: exec("mv {} {}".format(from_name,setupname)) if os.path.isfile("tmp.exe"): exec("mv tmp.exe librewolf-{}.en-US.win64-setup.exe".format(pkgver)) def do_upload(filename): exec("echo \".\" >> upload.txt") exec("curl --request POST --header \"PRIVATE-TOKEN: {}\" --form \"file=@{}\" \"https://gitlab.com/api/v4/projects/13852981/uploads\" >> upload.txt".format(options.token,filename)) exec("echo \".\" >> upload.txt") def execute_upload(): if options.token =='': print("fatal error: You must specify a private token when using the 'upload' command.") script_exit(1) if options.distro == 'win': ospkg = "win64" elif options.distro == 'deb': ospkg = "deb" elif options.distro == 'rpm': ospkg = "rpm" elif options.distro == 'osx': ospkg = "osx" zip_filename = "librewolf-{}.en-US.{}.zip".format(pkgver,ospkg) setup_filename = "librewolf-{}.en-US.{}-setup.exe".format(pkgver,ospkg) nightly_setup_filename = "librewolf-{}.en-US.{}-gecko-dev.zip".format(nightly_ver,ospkg) if not os.path.isfile(zip_filename): print("fatal error: File '{}' not found.".format(zip_filename)) script_exit(1) if not os.path.isfile(setup_filename): print("fatal error: File '{}' not found.".format(setup_filename)) script_exit(1) if not os.path.isfile(nightly_setup_filename): print("fatal error: File '{}' not found.".format(nightly_setup_filename)) script_exit(1) exec("sha256sum {} {} {} > sha256sums.txt".format(zip_filename,setup_filename,nightly_setup_filename)) exec("rm -f upload.txt") do_upload(setup_filename) do_upload(zip_filename) do_upload(nightly_setup_filename) do_upload("sha256sums.txt") print("upload.txt: Upload JSON api results are in the file \'upload.txt\'.") # # Main targets: # def execute_all(): execute_fetch() execute_extract() execute_lw_do_patches() execute_build() execute_lw_post_build() execute_package() execute_lw_artifacts() def execute_clean(): exec("rm -rf librewolf-{} librewolf-{}".format(pkgver,nightly_ver)) exec("rm -rf librewolf bootstrap.py tmp.nsi tmp.exe sha256sums.txt upload.txt librewolf-portable.exe") for filename in glob.glob("librewolf-*"): try: os.remove(filename) except: pass def execute_veryclean(): exec("rm -rf firefox-{}.source.tar.xz mozilla-unified tor-browser gecko-dev".format(pkgver)) exec("rm -rf firefox-{}".format(pkgver)) execute_clean() # # main commandline interface # def main(): if options.src == 'tor-browser': options.no_librewolf = True if len(remainder) > 0: if not options.src in ['release','nightly','tor-browser','gecko-dev']: print("error: option --src invalid value") script_exit(1) if not options.distro in ['deb','rpm', 'win','osx']: print("error: option --distro invalid value") script_exit(1) for arg in remainder: if arg == 'all': execute_all() elif arg == 'clean': execute_clean() elif arg == 'veryclean': execute_veryclean() # Targets: elif arg == 'fetch': execute_fetch() elif arg == 'extract': execute_extract() elif arg == 'lw_do_patches': execute_lw_do_patches() elif arg == 'build': execute_build() elif arg == 'lw_post_build': execute_lw_post_build() elif arg == 'package': execute_package() elif arg == 'lw_artifacts': execute_lw_artifacts() # Utilities elif arg == 'update_submodules': execute_update_submodules() elif arg == 'upload': execute_upload() elif arg == 'git_init': execute_git_init() elif arg == 'deps_deb': execute_deps_deb() elif arg == 'deps_rpm': execute_deps_rpm() elif arg == 'deps_pkg': execute_deps_pkg() elif arg == 'rustup': execute_rustup() elif arg == 'mach_env': execute_mach_env() elif arg == 'reset': execute_reset() else: print("error: unknown command on command line: ", arg) script_exit(1) else: # Print help message print(help_message.format(options.distro)) # # Large multiline strings # help_message = """# Use: build.py [] clean | all | | # Options: -n,--no-execute - print commands, don't execute them -l,--no-librewolf - skip LibreWolf specific stages. -x,--cross - crosscompile from linux, implies -t win -s,--src - release,nightly,tor-browser,gecko-dev (default=release) -t,--distro - deb,rpm,win,osx (default={}) -T,--token - private token used to upload to gitlab.com -3,--i386 - build 32-bit -P,--settings-pane - build with the experimental settings pane # Targets: all - all steps from fetch to producing setup.exe clean - clean everything, including extracted/fetched sources veryclean - clean like above, and also remove build artifacts. fetch - wget or hg clone or git pull extract - when using wget, extract the archive. lw_do_patches - [librewolf] patch the source build - build the browser lw_post_build - [librewolf] insert our settings package - package the browser into zip/apk lw_artifacts - [librewolf] build setup.exe # Utilities: update_submodules - git update submodules upload - upload the build artifacts to gitlab.com git_init - put the source folder in a .git repository reset - use git/mercurial to revert changes to a clean state deps_deb - install dependencies with apt deps_rpm - install dependencies with dnf deps_pkg - install dependencies on freebsd rustup - update rust mach_env - create mach environment """ # # mozconfig files: # mozconfig_release = """ ac_add_options --enable-application=browser # This supposedly speeds up compilation (We test through dogfooding anyway) ac_add_options --disable-tests ac_add_options --disable-debug ac_add_options --enable-release ac_add_options --enable-hardening ac_add_options --enable-rust-simd ac_add_options --enable-optimize # Branding ac_add_options --enable-update-channel=release # theming bugs: ac_add_options --with-app-name=librewolf # theming bugs: ac_add_options --with-app-basename=LibreWolf ac_add_options --with-branding=browser/branding/librewolf ac_add_options --with-distribution-id=io.gitlab.librewolf-community ac_add_options --with-unsigned-addon-scopes=app,system ac_add_options --allow-addon-sideload #export MOZ_REQUIRE_SIGNING=0 # Features ac_add_options --disable-crashreporter ac_add_options --disable-updater # Disables crash reporting, telemetry and other data gathering tools mk_add_options MOZ_CRASHREPORTER=0 mk_add_options MOZ_DATA_REPORTING=0 mk_add_options MOZ_SERVICES_HEALTHREPORT=0 mk_add_options MOZ_TELEMETRY_REPORTING=0 # testing.. # MOZ_APP_NAME=librewolf # This gives the same theming issue as --with-app-name=librewolf """ main() script_exit(0)