Newer
Older
minerva / Meta / gn / secondary / Ladybird / BUILD.gn
@minerva minerva on 13 Jul 16 KB Initial commit
import("//Ladybird/compile_qt_resource_file.gni")
import("//Ladybird/enable_qt.gni")
import("//Ladybird/link_qt.gni")
import("//Ladybird/moc_qt_objects.gni")

group("Ladybird") {
  if (current_os == "mac") {
    deps = [ ":Ladybird.app" ]
  } else {
    deps = [ ":ladybird_executable" ]
  }
}

moc_qt_objects("generate_moc") {
  sources = [
    "Qt/Application.h",
    "Qt/AutoComplete.h",
    "Qt/BrowserWindow.h",
    "Qt/EventLoopImplementationQtEventTarget.h",
    "Qt/FindInPageWidget.h",
    "Qt/InspectorWidget.h",
    "Qt/LocationEdit.h",
    "Qt/Settings.h",
    "Qt/SettingsDialog.h",
    "Qt/Tab.h",
    "Qt/TabBar.h",
    "Qt/TaskManagerWindow.h",
    "Qt/WebContentView.h",
  ]
}

compile_qt_resource_file("compile_resource_file") {
  sources = [ "Qt/ladybird.qrc" ]
}

link_qt("ladybird_qt_components") {
  qt_components = [
    "Core",
    "Gui",
    "Widgets",
    "Network",
  ]
}

config("ladybird_config") {
  include_dirs = [
    "//Userland",
    "//Userland/Applications",
    "//Userland/Services",
  ]
  defines = [ "AK_DONT_REPLACE_STD" ]
}

ladybird_helper_processes = [
  "ImageDecoder",
  "RequestServer",
  "SQLServer",
  "WebContent",
  "WebWorker",
]

executable("ladybird_executable") {
  configs += [ ":ladybird_config" ]
  data_deps = ladybird_helper_processes
  deps = [
    "//AK",
    "//Userland/Libraries/LibCore",
    "//Userland/Libraries/LibFileSystem",
    "//Userland/Libraries/LibGfx",
    "//Userland/Libraries/LibIPC",
    "//Userland/Libraries/LibImageDecoderClient",
    "//Userland/Libraries/LibJS",
    "//Userland/Libraries/LibMain",
    "//Userland/Libraries/LibProtocol",
    "//Userland/Libraries/LibSQL",
    "//Userland/Libraries/LibURL",
    "//Userland/Libraries/LibWeb",
    "//Userland/Libraries/LibWebView",
  ]
  sources = [
    "HelperProcess.cpp",
    "Utilities.cpp",
  ]

  if (enable_qt) {
    configs += [ ":ladybird_qt_components" ]

    sources += [
      "Qt/Application.cpp",
      "Qt/AutoComplete.cpp",
      "Qt/BrowserWindow.cpp",
      "Qt/EventLoopImplementationQt.cpp",
      "Qt/EventLoopImplementationQtEventTarget.cpp",
      "Qt/FindInPageWidget.cpp",
      "Qt/Icon.cpp",
      "Qt/InspectorWidget.cpp",
      "Qt/LocationEdit.cpp",
      "Qt/Settings.cpp",
      "Qt/SettingsDialog.cpp",
      "Qt/StringUtils.cpp",
      "Qt/TVGIconEngine.cpp",
      "Qt/Tab.cpp",
      "Qt/TabBar.cpp",
      "Qt/TaskManagerWindow.cpp",
      "Qt/WebContentView.cpp",
      "Qt/main.cpp",
    ]

    sources += get_target_outputs(":generate_moc") +
               get_target_outputs(":compile_resource_file")

    deps += [
      ":compile_resource_file",
      ":generate_moc",
    ]
  } else {
    sources += [
      "AppKit/Application/Application.mm",
      "AppKit/Application/ApplicationBridge.cpp",
      "AppKit/Application/ApplicationDelegate.mm",
      "AppKit/Application/EventLoopImplementation.mm",
      "AppKit/UI/Event.mm",
      "AppKit/UI/Inspector.mm",
      "AppKit/UI/InspectorController.mm",
      "AppKit/UI/LadybirdWebView.mm",
      "AppKit/UI/LadybirdWebViewBridge.cpp",
      "AppKit/UI/Palette.mm",
      "AppKit/UI/SearchPanel.mm",
      "AppKit/UI/Tab.mm",
      "AppKit/UI/TabController.mm",
      "AppKit/UI/TaskManager.mm",
      "AppKit/UI/TaskManagerController.mm",
      "AppKit/Utilities/Conversions.mm",
      "AppKit/main.mm",
    ]

    deps += [ "//Userland/Libraries/LibUnicode" ]

    cflags_objcc = [
      "-fobjc-arc",
      "-Wno-deprecated-anon-enum-enum-conversion",  # Required for CGImageCreate
    ]

    include_dirs = [
      "AppKit",
      "//Userland",
    ]

    frameworks = [
      "Cocoa.framework",
      "UniformTypeIdentifiers.framework",
    ]
  }

  if (current_os == "mac") {
    sources += [ "MachPortServer.cpp" ]
    deps += [ "//Userland/Libraries/LibThreading" ]
  } else {
    data_deps += [
      ":ladybird_copy_config_resources",
      ":ladybird_copy_emoji",
      ":ladybird_copy_fonts",
      ":ladybird_copy_icons_16x16",
      ":ladybird_copy_icons_32x32",
      ":ladybird_copy_icons_browser",
      ":ladybird_copy_themes",
      ":ladybird_copy_web_resources",
      ":ladybird_copy_web_templates",
    ]
  }

  output_name = "Ladybird"
}

executable("headless-browser") {
  include_dirs = [ "//Userland/Services" ]
  configs += [ ":ladybird_config" ]
  deps = [
    "//AK",
    "//Userland/Libraries/LibCore",
    "//Userland/Libraries/LibCrypto",
    "//Userland/Libraries/LibDiff",
    "//Userland/Libraries/LibFileSystem",
    "//Userland/Libraries/LibGemini",
    "//Userland/Libraries/LibGfx",
    "//Userland/Libraries/LibHTTP",
    "//Userland/Libraries/LibIPC",
    "//Userland/Libraries/LibImageDecoderClient",
    "//Userland/Libraries/LibJS",
    "//Userland/Libraries/LibMain",
    "//Userland/Libraries/LibProtocol",
    "//Userland/Libraries/LibSQL",
    "//Userland/Libraries/LibTLS",
    "//Userland/Libraries/LibURL",
    "//Userland/Libraries/LibWeb",
    "//Userland/Libraries/LibWebSocket",
    "//Userland/Libraries/LibWebView",
  ]
  data_deps = ladybird_helper_processes
  sources = [
    "//Userland/Utilities/headless-browser.cpp",
    "HelperProcess.cpp",
    "Utilities.cpp",
  ]
}

_emoji = read_file("//Meta/emoji-file-list.txt", "list lines")
emoji = []

foreach(file, _emoji) {
  emoji += [ "//Base/res/emoji/" + file ]
}

fonts = [
  "//Base/res/fonts/CsillaBold10.font",
  "//Base/res/fonts/CsillaBold12.font",
  "//Base/res/fonts/CsillaRegular10.font",
  "//Base/res/fonts/CsillaRegular12.font",
  "//Base/res/fonts/KaticaBold10.font",
  "//Base/res/fonts/KaticaBold12.font",
  "//Base/res/fonts/KaticaBoldOblique10.font",
  "//Base/res/fonts/KaticaItalic10.font",
  "//Base/res/fonts/KaticaRegular10.font",
  "//Base/res/fonts/KaticaRegular12.font",
  "//Base/res/fonts/MinervaSans-Regular.ttf",
]

icons_16x16 = [
  "//Base/res/icons/16x16/app-browser.png",
  "//Base/res/icons/16x16/app-system-monitor.png",
  "//Base/res/icons/16x16/audio-volume-high.png",
  "//Base/res/icons/16x16/audio-volume-muted.png",
  "//Base/res/icons/16x16/close-tab.png",
  "//Base/res/icons/16x16/edit-copy.png",
  "//Base/res/icons/16x16/filetype-css.png",
  "//Base/res/icons/16x16/filetype-folder-open.png",
  "//Base/res/icons/16x16/filetype-html.png",
  "//Base/res/icons/16x16/filetype-image.png",
  "//Base/res/icons/16x16/filetype-sound.png",
  "//Base/res/icons/16x16/filetype-video.png",
  "//Base/res/icons/16x16/find.png",
  "//Base/res/icons/16x16/go-forward.png",
  "//Base/res/icons/16x16/history.png",
  "//Base/res/icons/16x16/layers.png",
  "//Base/res/icons/16x16/layout.png",
  "//Base/res/icons/16x16/new-tab.png",
  "//Base/res/icons/16x16/open-parent-directory.png",
  "//Base/res/icons/16x16/paste.png",
  "//Base/res/icons/16x16/pause.png",
  "//Base/res/icons/16x16/play.png",
  "//Base/res/icons/16x16/select-all.png",
  "//Base/res/icons/16x16/settings.png",
  "//Base/res/icons/16x16/spoof.png",
  "//Base/res/icons/16x16/trash-can.png",
  "//Base/res/icons/16x16/zoom-in.png",
  "//Base/res/icons/16x16/zoom-out.png",
  "//Base/res/icons/16x16/zoom-reset.png",
]

icons_32x32 = [
  "//Base/res/icons/32x32/app-browser.png",
  "//Base/res/icons/32x32/app-system-monitor.png",
  "//Base/res/icons/32x32/filetype-folder.png",
  "//Base/res/icons/32x32/filetype-unknown.png",
  "//Base/res/icons/32x32/msgbox-warning.png",
]

icons_browser = [
  "//Base/res/icons/browser/clear-cache.png",
  "//Base/res/icons/browser/cookie.png",
  "//Base/res/icons/browser/dom-tree.png",
  "//Base/res/icons/browser/local-storage.png",
]

themes = [
  "//Base/res/themes/Default.ini",
  "//Base/res/themes/Dark.ini",
]

web_resources = [
  "//Base/res/ladybird/about.html",
  "//Base/res/ladybird/inspector.css",
  "//Base/res/ladybird/inspector.js",
  "//Base/res/ladybird/newtab.html",
]

web_templates = [
  "//Base/res/ladybird/templates/directory.html",
  "//Base/res/ladybird/templates/error.html",
  "//Base/res/ladybird/templates/version.html",
]

config_resources = [
  "$root_build_dir/cacert.pem",
  "//Base/home/anon/.config/BrowserAutoplayAllowlist.txt",
  "//Base/home/anon/.config/BrowserContentFilters.txt",
]

if (current_os != "mac") {
  copy("ladybird_copy_emoji") {
    sources = emoji
    outputs = [ "$root_out_dir/share/Lagom/emoji/{{source_file_part}}" ]
  }

  copy("ladybird_copy_fonts") {
    sources = fonts
    outputs = [ "$root_out_dir/share/Lagom/fonts/{{source_file_part}}" ]
  }

  copy("ladybird_copy_icons_16x16") {
    sources = icons_16x16
    outputs = [ "$root_out_dir/share/Lagom/icons/16x16/{{source_file_part}}" ]
  }

  copy("ladybird_copy_icons_32x32") {
    sources = icons_32x32
    outputs = [ "$root_out_dir/share/Lagom/icons/32x32/{{source_file_part}}" ]
  }

  copy("ladybird_copy_icons_browser") {
    sources = icons_browser
    outputs = [ "$root_out_dir/share/Lagom/icons/browser/{{source_file_part}}" ]
  }

  copy("ladybird_copy_themes") {
    sources = themes
    outputs = [ "$root_out_dir/share/Lagom/themes/{{source_file_part}}" ]
  }

  copy("ladybird_copy_web_resources") {
    sources = web_resources
    outputs = [ "$root_out_dir/share/Lagom/ladybird/{{source_file_part}}" ]
  }

  copy("ladybird_copy_web_templates") {
    sources = web_templates
    outputs =
        [ "$root_out_dir/share/Lagom/ladybird/templates/{{source_file_part}}" ]
  }

  copy("ladybird_copy_config_resources") {
    public_deps = [ "//Userland/Libraries/LibTLS:ca_certificates_download" ]
    sources = config_resources
    outputs = [ "$root_out_dir/share/Lagom/ladybird/{{source_file_part}}" ]
  }
} else {
  # macOS bundle steps
  bundle_data("ladybird_bundle_info_plist") {
    sources = [ "Info.plist" ]
    outputs = [ "{{bundle_contents_dir}}/Info.plist" ]
  }

  bundle_data("ladybird_bundle_executables") {
    public_deps = [
      ":headless-browser",
      ":ladybird_executable",
      "ImageDecoder",
      "RequestServer",
      "SQLServer",
      "WebContent",
      "WebDriver",
      "WebWorker",
    ]
    sources = [
      "$root_out_dir/bin/Ladybird",
      "$root_out_dir/bin/WebDriver",
      "$root_out_dir/bin/headless-browser",
      "$root_out_dir/libexec/ImageDecoder",
      "$root_out_dir/libexec/RequestServer",
      "$root_out_dir/libexec/SQLServer",
      "$root_out_dir/libexec/WebContent",
      "$root_out_dir/libexec/WebWorker",
    ]
    outputs = [ "{{bundle_executable_dir}}/{{source_file_part}}" ]
  }

  bundle_data("ladybird_bundle_libs") {
    public_deps = [
      "//AK",
      "//Userland/Libraries/LibAccelGfx",
      "//Userland/Libraries/LibAudio",
      "//Userland/Libraries/LibCompress",
      "//Userland/Libraries/LibCore",
      "//Userland/Libraries/LibCrypto",
      "//Userland/Libraries/LibDiff",
      "//Userland/Libraries/LibFileSystem",
      "//Userland/Libraries/LibGL",
      "//Userland/Libraries/LibGLSL",
      "//Userland/Libraries/LibGPU",
      "//Userland/Libraries/LibGemini",
      "//Userland/Libraries/LibGfx",
      "//Userland/Libraries/LibHTTP",
      "//Userland/Libraries/LibIDL",
      "//Userland/Libraries/LibIPC",
      "//Userland/Libraries/LibImageDecoderClient",
      "//Userland/Libraries/LibJIT",
      "//Userland/Libraries/LibJS",
      "//Userland/Libraries/LibLine",
      "//Userland/Libraries/LibMarkdown",
      "//Userland/Libraries/LibMedia",
      "//Userland/Libraries/LibProtocol",
      "//Userland/Libraries/LibRIFF",
      "//Userland/Libraries/LibRegex",
      "//Userland/Libraries/LibSQL",
      "//Userland/Libraries/LibSoftGPU",
      "//Userland/Libraries/LibSyntax",
      "//Userland/Libraries/LibTLS",
      "//Userland/Libraries/LibTextCodec",
      "//Userland/Libraries/LibThreading",
      "//Userland/Libraries/LibURL",
      "//Userland/Libraries/LibWasm",
      "//Userland/Libraries/LibWeb",
      "//Userland/Libraries/LibWebSocket",
      "//Userland/Libraries/LibWebView",
      "//Userland/Libraries/LibXML",
    ]
    sources = [
      "$root_out_dir/lib/liblagom-accelgfx.dylib",
      "$root_out_dir/lib/liblagom-ak.dylib",
      "$root_out_dir/lib/liblagom-audio.dylib",
      "$root_out_dir/lib/liblagom-compress.dylib",
      "$root_out_dir/lib/liblagom-core-minimal.dylib",
      "$root_out_dir/lib/liblagom-core.dylib",
      "$root_out_dir/lib/liblagom-crypto.dylib",
      "$root_out_dir/lib/liblagom-diff.dylib",
      "$root_out_dir/lib/liblagom-filesystem.dylib",
      "$root_out_dir/lib/liblagom-gemini.dylib",
      "$root_out_dir/lib/liblagom-gfx.dylib",
      "$root_out_dir/lib/liblagom-gl.dylib",
      "$root_out_dir/lib/liblagom-glsl.dylib",
      "$root_out_dir/lib/liblagom-gpu.dylib",
      "$root_out_dir/lib/liblagom-http.dylib",
      "$root_out_dir/lib/liblagom-idl.dylib",
      "$root_out_dir/lib/liblagom-imagedecoderclient.dylib",
      "$root_out_dir/lib/liblagom-ipc.dylib",
      "$root_out_dir/lib/liblagom-jit.dylib",
      "$root_out_dir/lib/liblagom-js.dylib",
      "$root_out_dir/lib/liblagom-line.dylib",
      "$root_out_dir/lib/liblagom-markdown.dylib",
      "$root_out_dir/lib/liblagom-media.dylib",
      "$root_out_dir/lib/liblagom-protocol.dylib",
      "$root_out_dir/lib/liblagom-regex.dylib",
      "$root_out_dir/lib/liblagom-riff.dylib",
      "$root_out_dir/lib/liblagom-softgpu.dylib",
      "$root_out_dir/lib/liblagom-sql.dylib",
      "$root_out_dir/lib/liblagom-syntax.dylib",
      "$root_out_dir/lib/liblagom-textcodec.dylib",
      "$root_out_dir/lib/liblagom-threading.dylib",
      "$root_out_dir/lib/liblagom-tls.dylib",
      "$root_out_dir/lib/liblagom-url.dylib",
      "$root_out_dir/lib/liblagom-wasm.dylib",
      "$root_out_dir/lib/liblagom-web.dylib",
      "$root_out_dir/lib/liblagom-websocket.dylib",
      "$root_out_dir/lib/liblagom-webview.dylib",
      "$root_out_dir/lib/liblagom-xml.dylib",
    ]
    outputs = [ "{{bundle_contents_dir}}/lib/{{source_file_part}}" ]
  }

  bundle_data("ladybird_emoji") {
    sources = emoji
    outputs = [ "{{bundle_resources_dir}}/emoji/{{source_file_part}}" ]
  }

  bundle_data("ladybird_fonts") {
    sources = fonts
    outputs = [ "{{bundle_resources_dir}}/fonts/{{source_file_part}}" ]
  }

  bundle_data("ladybird_icons_16x16") {
    sources = icons_16x16
    outputs = [ "{{bundle_resources_dir}}/icons/16x16/{{source_file_part}}" ]
  }

  bundle_data("ladybird_icons_32x32") {
    sources = icons_32x32
    outputs = [ "{{bundle_resources_dir}}/icons/32x32/{{source_file_part}}" ]
  }

  bundle_data("ladybird_icons_browser") {
    sources = icons_browser
    outputs = [ "{{bundle_resources_dir}}/icons/browser/{{source_file_part}}" ]
  }

  bundle_data("ladybird_themes") {
    sources = themes
    outputs = [ "{{bundle_resources_dir}}/themes/{{source_file_part}}" ]
  }

  bundle_data("ladybird_web_resources") {
    sources = web_resources
    outputs = [ "{{bundle_resources_dir}}/ladybird/{{source_file_part}}" ]
  }

  bundle_data("ladybird_web_templates") {
    sources = web_templates
    outputs =
        [ "{{bundle_resources_dir}}/ladybird/templates/{{source_file_part}}" ]
  }

  bundle_data("ladybird_config_resources") {
    public_deps = [ "//Userland/Libraries/LibTLS:ca_certificates_download" ]
    sources = config_resources
    outputs = [ "{{bundle_resources_dir}}/ladybird/{{source_file_part}}" ]
  }

  action("ladybird_create_icon") {
    script = "//Meta/gn/build/invoke_process_with_args.py"
    icon_path = "//Ladybird/Icons/macos/app_icon.iconset"
    sources = [
      "$icon_path/icon_128x128.png",
      "$icon_path/icon_128x128@2x.png",
      "$icon_path/icon_16x16.png",
      "$icon_path/icon_16x16@2x.png",
      "$icon_path/icon_256x256.png",
      "$icon_path/icon_256x256@2x.png",
      "$icon_path/icon_32x32.png",
      "$icon_path/icon_32x32@2x.png",
      "$icon_path/icon_512x512.png",
      "$icon_path/icon_512x512@2x.png",
    ]
    outputs = [ "$target_gen_dir/app_icon.icns" ]
    args = [
      "iconutil",
      "--convert",
      "icns",
      rebase_path(icon_path, root_build_dir),
      "--output",
      rebase_path(outputs[0], root_build_dir),
    ]
  }

  bundle_data("ladybird_icon") {
    public_deps = [ ":ladybird_create_icon" ]
    sources = get_target_outputs(public_deps[0])
    outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]
  }

  create_bundle("Ladybird.app") {
    product_type = "com.apple.product-type.application"

    bundle_root_dir = "$root_build_dir/$target_name"
    bundle_contents_dir = "$bundle_root_dir/Contents"
    bundle_resources_dir = "$bundle_contents_dir/Resources"
    bundle_executable_dir = "$bundle_contents_dir/MacOS"

    deps = [
      ":ladybird_bundle_executables",
      ":ladybird_bundle_info_plist",
      ":ladybird_bundle_libs",
      ":ladybird_config_resources",
      ":ladybird_emoji",
      ":ladybird_fonts",
      ":ladybird_icon",
      ":ladybird_icons_16x16",
      ":ladybird_icons_32x32",
      ":ladybird_icons_browser",
      ":ladybird_themes",
      ":ladybird_web_resources",
      ":ladybird_web_templates",
    ]
  }
}