# -*- 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/. @template def Libxul_defines(): LIBRARY_DEFINES["MOZILLA_INTERNAL_API"] = True LIBRARY_DEFINES["IMPL_LIBXUL"] = True if not CONFIG["JS_SHARED_LIBRARY"]: LIBRARY_DEFINES["STATIC_EXPORTABLE_JS_API"] = True @template def Libxul(name, output_category=None): if CONFIG["MOZ_WIDGET_TOOLKIT"] in ("cocoa", "uikit"): # This is going to be a framework named "XUL", not an ordinary library named # "libxul.dylib" GeckoFramework(name, output_category=output_category, linkage=None) SHARED_LIBRARY_NAME = "XUL" else: GeckoSharedLibrary(name, output_category=output_category, linkage=None) SHARED_LIBRARY_NAME = "xul" DELAYLOAD_DLLS += [ "avrt.dll", "comdlg32.dll", "credui.dll", "d3d11.dll", "D3DCompiler_47.dll", "dhcpcsvc.dll", "dnsapi.dll", "dwmapi.dll", "dxgi.dll", "gdi32.dll", "hid.dll", "imm32.dll", "iphlpapi.dll", "msi.dll", "msimg32.dll", "netapi32.dll", "ole32.dll", "oleaut32.dll", "secur32.dll", "setupapi.dll", "shell32.dll", "shlwapi.dll", "urlmon.dll", "user32.dll", "userenv.dll", "usp10.dll", "uxtheme.dll", "wininet.dll", "winspool.drv", "wtsapi32.dll", ] if CONFIG["ACCESSIBILITY"]: DELAYLOAD_DLLS += ["oleacc.dll"] if CONFIG["MOZ_WEBRTC"]: DELAYLOAD_DLLS += ["msdmo.dll"] if CONFIG["OS_ARCH"] == "WINNT": DELAYLOAD_DLLS += [ "api-ms-win-core-winrt-l1-1-0.dll", "api-ms-win-core-winrt-string-l1-1-0.dll", ] if CONFIG["OS_ARCH"] == "WINNT" and CONFIG["ACCESSIBILITY"]: LOCAL_INCLUDES += ["!/accessible/interfaces/gecko/"] if CONFIG["OS_ARCH"] == "WINNT": LOCAL_INCLUDES += [ "/widget/windows", "/xpcom/base", ] RCINCLUDE = "/toolkit/library/xulrunner.rc" # Show a breakdown of linker time. (Too verbose for local builds.) if CONFIG["CC_TYPE"] == "clang-cl" and not CONFIG["DEVELOPER_OPTIONS"]: LDFLAGS += ["-time"] Libxul_defines() if CONFIG["MOZ_NEEDS_LIBATOMIC"]: OS_LIBS += ["atomic"] # TouchBar-related classes are only available in the 10.12.2 SDK and later. # We need to weak link these classes until we've upgraded our SDK to at # least 10.12.2. # We're also linking against libresolv to solve bug 1367932. if CONFIG["OS_ARCH"] == "Darwin": LDFLAGS += ["-Wl,-U,_OBJC_CLASS_$_NSTouchBar"] LDFLAGS += ["-Wl,-U,_OBJC_CLASS_$_NSSharingServicePickerTouchBarItem"] LDFLAGS += ["-Wl,-U,_OBJC_METACLASS_$_NSTouchBar"] LDFLAGS += ["-Wl,-U,_OBJC_CLASS_$_NSCustomTouchBarItem"] LDFLAGS += ["-Wl,-U,_OBJC_CLASS_$_NSPopoverTouchBarItem"] LDFLAGS += ["-lresolv"] if CONFIG["MOZ_DEBUG_SYMBOLS"] and CONFIG["CC_TYPE"] == "clang-cl": LDFLAGS += ["-NATVIS:%s/toolkit/library/gecko.natvis" % TOPSRCDIR] if CONFIG["RUSTC_NATVIS_LDFLAGS"]: LDFLAGS += CONFIG["RUSTC_NATVIS_LDFLAGS"] if CONFIG["OS_ARCH"] == "Linux" and CONFIG["OS_TARGET"] != "Android": GeneratedFile( "symverscript", script="/build/gen_symverscript.py", inputs=["../symverscript.in"], flags=["xul%s" % CONFIG["MOZILLA_SYMBOLVERSION"]], ) SYMBOLS_FILE = "!symverscript" # The real libxul definition is in ./build/moz.build, but we define a # xul library here such that # FINAL_LIBRARY = 'xul' refers to here, which # is then linked to both build/libxul and gtest/libxul. Library("xul") STATIC_LIBRARY_NAME = "xul_s" # Use a FINAL_LIBRARY for Libxul_defines to propagate from there. They wouldn't # propagate from here. FINAL_LIBRARY = "xul-real" if CONFIG["OS_ARCH"] == "WINNT": SOURCES += [ "nsDllMain.cpp", ] LOCAL_INCLUDES += [ "/config", # need widget/windows for resource.h (included from widget.rc) "/widget/windows", ] if CONFIG["OS_ARCH"] == "WINNT" and CONFIG["CC_TYPE"] not in ("clang", "gcc"): LOCAL_INCLUDES += [ "/xpcom/base", ] DIRS += [ "build", "gtest", ] if CONFIG["OS_ARCH"] == "WINNT": DIRS += ["dummydll"] # js needs to come after xul for now, because it is an archive and its content # is discarded when it comes first. USE_LIBS += [ "js", ] USE_LIBS += [ "lgpllibs", "nspr", "nss", "psshparser", "sqlite", "zlib", ] if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": # The mozgtk library is a workaround that makes Gtk+ use libwayland-client # instead of mozwayland. The reason it works is that by being a dependency # of libxul, mozgtk appears in dependentlibs.list, preceding mozwayland # (which is important and guaranteed by the USE_LIBS order in this file). # That, in turn, makes firefox dlopen() mozgtk before mozwayland, which # will trigger the loading of the Gtk+ libraries (mozgtk depending on them). # Those libraries, if they depend on libwayland-client, will use the symbols # from libwayland-client because mozwayland is not loaded yet. # When eventually libxul is loaded after both mozgtk and mozwayland, it will # get symbols from libwayland-client too. # In the case where Gtk+ doesn't have wayland support, libwayland-client is # not loaded, and libxul ends up using the mozwayland symbols. USE_LIBS += [ "mozgtk", ] OS_LIBS += CONFIG["MOZ_GTK3_LIBS"] if CONFIG["MOZ_WAYLAND"]: USE_LIBS += [ "mozwayland", ] if CONFIG["MOZ_JPROF"]: USE_LIBS += [ "jprof", ] if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk" or CONFIG["MOZ_TREE_FREETYPE"]: USE_LIBS += [ "freetype", ] if CONFIG["MOZ_WIDGET_TOOLKIT"] == "cocoa": CXXFLAGS += CONFIG["TK_CFLAGS"] if CONFIG["MOZ_WEBRTC"]: if CONFIG["OS_TARGET"] == "WINNT": OS_LIBS += [ "secur32", "iphlpapi", "strmiids", "dmoguids", "wmcodecdspuuid", "amstrmid", "msdmo", "wininet", ] if CONFIG["MOZ_WIDGET_TOOLKIT"] == "cocoa": OS_LIBS += [ "-framework OpenGL", "-framework SystemConfiguration", "-framework AVFoundation", "-framework CoreMedia", "-framework IOKit", "-F%s" % CONFIG["MACOS_PRIVATE_FRAMEWORKS_DIR"], "-framework CoreUI", "-framework CoreSymbolication", "cups", ] if CONFIG["MOZ_WMF"]: OS_LIBS += [ "mfuuid", "wmcodecdspuuid", "strmiids", ] if CONFIG["OS_ARCH"] == "FreeBSD": OS_LIBS += [ "util", ] if CONFIG["OS_ARCH"] == "WINNT": OS_LIBS += [ "crypt32", "shell32", "ntdll", "ole32", "version", "winspool", ] if CONFIG["OS_ARCH"] == "Linux" and CONFIG["OS_TARGET"] != "Android": OS_LIBS += [ "rt", ] if CONFIG["MOZ_ANDROID_GOOGLE_VR"]: OS_LIBS += [ "-L%s" % CONFIG["MOZ_ANDROID_GOOGLE_VR_LIBS"], "-lgvr", ] if CONFIG["MOZ_SYSTEM_JPEG"]: OS_LIBS += CONFIG["MOZ_JPEG_LIBS"] if CONFIG["MOZ_SYSTEM_PNG"]: OS_LIBS += CONFIG["MOZ_PNG_LIBS"] if CONFIG["MOZ_SYSTEM_WEBP"]: OS_LIBS += CONFIG["MOZ_WEBP_LIBS"] if CONFIG["MOZ_SYSTEM_LIBEVENT"]: OS_LIBS += CONFIG["MOZ_LIBEVENT_LIBS"] if CONFIG["MOZ_SYSTEM_LIBVPX"]: OS_LIBS += CONFIG["MOZ_LIBVPX_LIBS"] if not CONFIG["MOZ_TREE_PIXMAN"]: OS_LIBS += CONFIG["MOZ_PIXMAN_LIBS"] if CONFIG["HAVE_CLOCK_MONOTONIC"]: OS_LIBS += CONFIG["REALTIME_LIBS"] OS_LIBS += CONFIG["ICONV_LIBS"] if CONFIG["MOZ_WIDGET_TOOLKIT"] in ("cocoa", "uikit"): OS_LIBS += CONFIG["TK_LIBS"] if CONFIG["OS_ARCH"] == "OpenBSD": OS_LIBS += [ "sndio", ] if CONFIG["MOZ_ENABLE_DBUS"]: OS_LIBS += CONFIG["MOZ_DBUS_GLIB_LIBS"] if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk": OS_LIBS += [l for l in CONFIG["TK_LIBS"] if l not in ("-lgtk-3", "-lgdk-3")] OS_LIBS += CONFIG["MOZ_X11_LIBS"] OS_LIBS += CONFIG["MOZ_PANGO_LIBS"] if CONFIG["MOZ_ENABLE_LIBPROXY"]: OS_LIBS += CONFIG["MOZ_LIBPROXY_LIBS"] if CONFIG["OS_ARCH"] == "FreeBSD": OS_LIBS += [ "util", ] if CONFIG["OS_ARCH"] == "Darwin": OS_LIBS += [ # Link to Metal as required by the Metal gfx-hal backend "-weak_framework Metal", "-weak_framework MediaPlayer", ] if CONFIG["OS_ARCH"] == "WINNT": OS_LIBS += [ "shell32", "ole32", "version", "winspool", "comdlg32", "imm32", "msimg32", "netapi32", "shlwapi", "ws2_32", "dnsapi", "dwmapi", "iphlpapi", "uxtheme", "setupapi", "secur32", "sensorsapi", "portabledeviceguids", "wininet", "wintrust", "wtsapi32", "locationapi", "sapi", "dxguid", "dhcpcsvc", # gfx-rs supports D3D11 and D3D12, but we are not linking to them implicitly # "d3d11", # should be explicitly linked by gfx-backend-d3d11 #'d3d12', # should be explicitly linked by d3d12-rs "d3dcompiler", ] if CONFIG["CC_TYPE"] == "clang-cl": OS_LIBS += [ "runtimeobject", ] if CONFIG["ACCESSIBILITY"]: OS_LIBS += [ "oleacc", ] # Prevent winapi-rs from statically linking LIBRARY_DEFINES["WINAPI_NO_BUNDLED_LIBRARIES"] = True if CONFIG["MOZ_WIDGET_TOOLKIT"] == "windows": OS_LIBS += [ "usp10", "oleaut32", ] # The buildid is refreshed on every (incremental) build. But we want to avoid # rebuilding libxul every time, so instead of having a source file that # #include's buildid.h, which would have a dependency on it, and that would # thus trigger make to rebuild everything, we generate a source with the # buildid hard coded in it. Then we make that source file depend on all the # objects files that constitute libxul, so that if any of the files linked into # libxul is rebuilt, we refresh the buildid and link it into libxul. if CONFIG["COMPILE_ENVIRONMENT"]: SOURCES += ["!buildid.cpp"] if CONFIG["MOZ_WIDGET_TOOLKIT"] in ("cocoa", "uikit"): libxul_list = "XUL" else: libxul_list = "%sxul_%s" % ( CONFIG["DLL_PREFIX"], CONFIG["DLL_SUFFIX"].lstrip(".").replace(".", "_"), ) GeneratedFile( "buildid.cpp", script="gen_buildid.py", inputs=["!build/%s.list" % libxul_list] )