Source code
Revision control
Copy as Markdown
Other Tools
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
with Files("**"):
BUG_COMPONENT = ("Firefox", "General")
with Files("firefox.exe.manifest"):
BUG_COMPONENT = ("Core", "Widget: Win32")
with Files("module.ver"):
BUG_COMPONENT = ("Core", "Widget: Win32")
with Files("splash.rc"):
BUG_COMPONENT = ("Core", "Widget: Win32")
with Files("macbuild/**"):
BUG_COMPONENT = ("Core", "Widget: Cocoa")
with Files("moz.build"):
BUG_COMPONENT = ("Firefox Build System", "General")
with Files("Makefile.in"):
BUG_COMPONENT = ("Firefox Build System", "General")
with Files("generate_channel_prefs.py"):
BUG_COMPONENT = ("Firefox Build System", "General")
with Files("generate_info_plist.py"):
BUG_COMPONENT = ("Firefox Build System", "General")
with Files("profile/channel-prefs.js"):
BUG_COMPONENT = ("Firefox", "Installer")
with Files("profile/firefox.js"):
BUG_COMPONENT = ("Firefox", "General")
DIRS += ["distribution"]
# Neither channel-prefs.js nor firefox.exe want to end up in dist/bin/browser.
DIST_SUBDIR = ""
if CONFIG["MOZ_WIDGET_TOOLKIT"] != "cocoa":
GeneratedFile(
"channel-prefs.js",
script="generate_channel_prefs.py",
inputs=["profile/channel-prefs.js"],
)
FINAL_TARGET_FILES.defaults.pref += ["!channel-prefs.js"]
if CONFIG["MOZ_WIDGET_TOOLKIT"] == "cocoa":
mac_app_name = CONFIG["MOZ_APP_DISPLAYNAME"]
if CONFIG["MOZ_DEBUG"]:
mac_app_name += "Debug"
GeneratedFile(
"Info.plist",
script="generate_info_plist.py",
inputs=["macbuild/Contents/Info.plist.in"],
flags=[mac_app_name],
extra_deps=["!/buildid.h"],
)
GeneratedFile(
"InfoPlist.strings",
script="/python/mozbuild/mozbuild/action/preprocessor.py",
entry_point="generate",
inputs=["macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in"],
flags=[
"-Fsubstitution",
"--output-encoding",
"utf-16",
f"-DMAC_APP_NAME={mac_app_name}",
],
)
ab_cd = CONFIG["MOZ_UI_LOCALE"]
if ab_cd == "zh-TW":
lproj_root = ab_cd.replace("-", "_")
else:
lproj_root = ab_cd.split("-")[0]
branding = f"/{CONFIG['MOZ_BRANDING_DIRECTORY']}"
extra_files = [
(f"{branding}/firefox.icns", "Resources/firefox.icns"),
(f"{branding}/document.icns", "Resources/document.icns"),
(f"{branding}/Assets.car", "Resources/Assets.car"),
]
if CONFIG["MOZ_UPDATER"]:
extra_files.append((
f"!/{FINAL_TARGET}/org.mozilla.updater",
"Library/LaunchServices/org.mozilla.updater",
))
MacOSBundle(
f"!/dist/{CONFIG['MOZ_MACBUNDLE_NAME']}",
skeleton="macbuild/Contents",
info_plist="!Info.plist",
strings="!InfoPlist.strings",
lproj=f"{lproj_root}.lproj",
stage=f"!/{FINAL_TARGET}",
macos_files="!macbuild/Contents/MacOS-files.txt",
macos_copy_files="macbuild/Contents/MacOS-files-copy.in",
binaries=[
(f"!/{FINAL_TARGET}/{CONFIG['MOZ_APP_NAME']}", CONFIG["MOZ_APP_NAME"])
],
extra_files=extra_files,
moves=[
("ChannelPrefs.framework", "Frameworks/ChannelPrefs.framework"),
(
"org.mozilla.dmgInstallHelper",
"Library/LaunchServices/org.mozilla.dmgInstallHelper",
),
],
pkginfo="APPLMOZB",
)
if CONFIG["MOZ_MACBUNDLE_NAME"]:
DIRS += ["macbuild/Contents"]
browser_linkage = "standalone"
if CONFIG["FUZZING_SNAPSHOT"] or CONFIG["AFLFUZZ"]:
browser_linkage = "dependent"
if CONFIG["MOZ_NO_PIE_COMPAT"]:
GeckoProgram(CONFIG["MOZ_APP_NAME"] + "-bin", linkage=browser_linkage)
DIRS += ["no-pie"]
else:
GeckoProgram(CONFIG["MOZ_APP_NAME"], linkage=browser_linkage)
if CONFIG["OS_ARCH"] != "WINNT" and CONFIG["COMPILE_ENVIRONMENT"]:
FINAL_TARGET_FILES += [
(
f"!/{FINAL_TARGET}/" + CONFIG["MOZ_APP_NAME"] + CONFIG["BIN_SUFFIX"],
CONFIG["MOZ_APP_NAME"] + "-bin" + CONFIG["BIN_SUFFIX"],
)
]
# Compile the application data (which changes every build due to the build ID)
# in a separate tiny file so that nsBrowserApp.cpp doesn't need to be
# recompiled on every no-op build.
SOURCES += [
"ApplicationData.cpp",
"nsBrowserApp.cpp",
]
LOCAL_INCLUDES += [
"!/build",
"/toolkit/xre",
"/xpcom/base",
"/xpcom/build",
]
if CONFIG["LIBFUZZER"]:
USE_LIBS += ["fuzzer"]
LOCAL_INCLUDES += [
"/tools/fuzzing/libfuzzer",
]
elif CONFIG["FUZZING_INTERFACES"]:
USE_LIBS += ["fuzzer-interface"]
if CONFIG["MOZ_GECKODRIVER"]:
DEFINES["MOZ_GECKODRIVER"] = True
if CONFIG["CC_TYPE"] == "clang-cl":
# Always enter a Windows program through wmain, whether or not we're
# a console application.
WIN32_EXE_LDFLAGS += ["-ENTRY:wmainCRTStartup"]
if CONFIG["OS_ARCH"] == "WINNT":
RCINCLUDE = "splash.rc"
DIRS += [
"installation_dir_layout",
"pbproxy",
"winlauncher",
]
USE_LIBS += [
"winlauncher",
]
LOCAL_INCLUDES += [
"/browser/app/winlauncher",
]
OS_LIBS += [
"advapi32",
"shell32",
"uuid",
]
DELAYLOAD_DLLS += [
"advapi32.dll",
"oleaut32.dll",
"ole32.dll",
"rpcrt4.dll",
"shell32.dll",
"version.dll",
]
if CONFIG["CC_TYPE"] == "clang-cl":
libpath_flag = "-LIBPATH:"
else:
libpath_flag = "-L"
WIN32_EXE_LDFLAGS += [
libpath_flag + OBJDIR + "/winlauncher/freestanding",
]
# Don't build firefox.exe with CETCOMPAT, because we need to be able to
# only enable it for processes that are not using JIT in xul.dll.
LINK_FLAGS["CETCOMPAT"] = []
if CONFIG["DESKTOP_LAUNCHER_ENABLED"]:
DIRS += [
"desktop-launcher",
]
if CONFIG["OS_ARCH"] == "Darwin":
OS_LIBS += [
"-framework CoreFoundation",
]
# Safari updates on older macOS versions install newer frameworks in this
# folder, among them the AuthenticationServices framework that the
# ASWebAuthenticationSession broker uses. On macOS 10.15 the system copy
# fails to decode the broker's messages. Safari loads its frameworks from
# this folder. Let dyld pick a framework from it when it is newer than the
# system copy.
LDFLAGS += [
"-Wl,-dyld_env,DYLD_VERSIONED_FRAMEWORK_PATH=/Library/Apple/System/Library/StagedFrameworks/Safari",
]
if CONFIG["MOZ_SANDBOX"] and CONFIG["OS_ARCH"] == "WINNT":
# For sandbox includes and the include dependencies those have
LOCAL_INCLUDES += [
"/security/sandbox/chromium",
"/security/sandbox/chromium-shim",
]
USE_LIBS += [
"sandbox_s",
]
OS_LIBS += [
"shlwapi",
"winmm",
]
DELAYLOAD_DLLS += [
"winmm.dll",
"user32.dll",
"userenv.dll",
"usp10.dll",
]
if CONFIG["TARGET_OS"] in ("WINNT", "OSX"):
DIRS += ["nmhproxy"]
# Control the default heap size.
# This is the heap returned by GetProcessHeap().
# As we use the CRT heap, the default size is too large and wastes VM.
#
# The default heap size is 1MB on Win32.
# The heap will grow if need be.
#
if CONFIG["OS_ARCH"] == "WINNT" and CONFIG["CC_TYPE"] not in ("clang", "gcc"):
LDFLAGS += ["/HEAP:0x40000"]
DisableStlWrapping()
if CONFIG["HAVE_CLOCK_MONOTONIC"]:
OS_LIBS += CONFIG["REALTIME_LIBS"]
if CONFIG["MOZ_LINUX_32_SSE2_STARTUP_ERROR"]:
DEFINES["MOZ_LINUX_32_SSE2_STARTUP_ERROR"] = True
# If we are trying to show an error dialog about the lack of SSE2 support,
# make sure that code itself doesn't use SSE2.
COMPILE_FLAGS["OS_CXXFLAGS"] = [
f
for f in COMPILE_FLAGS["OS_CXXFLAGS"]
if not f.startswith("-march=") and f not in ("-msse", "-msse2", "-mfpmath=sse")
] + [
"-march=pentiumpro",
"-mno-sse",
"-mno-sse2",
"-mfpmath=387",
]
for icon in ("firefox", "document", "newwindow", "newtab", "pbmode", "document_pdf"):
DEFINES[icon.upper() + "_ICO"] = '"%s/%s/%s.ico"' % (
TOPSRCDIR,
CONFIG["MOZ_BRANDING_DIRECTORY"],
icon,
)
# User-selectable custom launcher icons (see CustomIconManager.sys.mjs). Unlike
# the branding icons above, these are channel-agnostic decorations, so they live
# in a single shared location rather than per-branding-directory. The same
# source file is also shipped into omni.ja via browser/components/shell/jar.mn
# so the about:settings picker can render a preview of it.
for icon in (
"retro2004",
"retro2017",
"pride",
"minimal-dark",
"minimal-light",
"pixelated",
"momo",
"kit",
):
# Hyphens aren't valid in the C macro name, so map e.g. minimal-dark ->
# CUSTOM_MINIMAL_DARK_ICO.
macro = "CUSTOM_" + icon.upper().replace("-", "_") + "_ICO"
DEFINES[macro] = '"%s/browser/components/shell/icons/%s.ico"' % (
TOPSRCDIR,
icon,
)
if CONFIG["MOZ_ASAN"] or CONFIG["MOZ_DEBUG"]:
WINCONSOLE = True
else:
WINCONSOLE = False
SOURCE_HEADERS += [
"ApplicationData.h",
"BrowserDefines.h",
]