# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# vim: set filetype=python:
# 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
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

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("macversion.py"):
    BUG_COMPONENT = ("Core", "Widget: Cocoa")
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("profile/channel-prefs.js"):
    BUG_COMPONENT = ("Firefox", "Installer")
with Files("profile/firefox.js"):
    BUG_COMPONENT = ("Firefox", "General")

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)

SOURCES += [
    "nsBrowserApp.cpp",
]

# Neither channel-prefs.js nor firefox.exe want to end up in dist/bin/browser.
DIST_SUBDIR = ""

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["OS_ARCH"] == "Darwin":
    OS_LIBS += [
        "-framework CoreFoundation",
    ]

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 += [
        "winmm",
    ]
    DELAYLOAD_DLLS += [
        "winmm.dll",
        "user32.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.
#
# Set it to 256k.  See bug 127069.
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
    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")
    ] + [
        "-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,
    )

if CONFIG["MOZ_ASAN"] or CONFIG["MOZ_DEBUG"]:
    WINCONSOLE = True
else:
    WINCONSOLE = False
