Skip to content

Commit 79108f6

Browse files
committed
Ladybird: Add configuration option to build without Qt
This should open the door for adding more GUI chromes to the repository
1 parent 1d78e07 commit 79108f6

File tree

3 files changed

+101
-57
lines changed

3 files changed

+101
-57
lines changed

Ladybird/CMakeLists.txt

Lines changed: 49 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,18 @@ add_compile_options(-DAK_DONT_REPLACE_STD)
7070
add_compile_options(-Wno-expansion-to-defined)
7171
add_compile_options(-Wno-user-defined-literals)
7272

73-
set(CMAKE_AUTOMOC ON)
74-
set(CMAKE_AUTORCC ON)
75-
set(CMAKE_AUTOUIC ON)
76-
find_package(Qt6 REQUIRED COMPONENTS Core Widgets Network Multimedia)
73+
serenity_option(ENABLE_QT ON CACHE BOOL "Build ladybird application using Qt GUI")
74+
75+
if (APPLE AND NOT ENABLE_QT)
76+
message(FATAL_ERROR "Non-Qt builds not supported on macOS yet!")
77+
endif()
78+
79+
if (ENABLE_QT)
80+
set(CMAKE_AUTOMOC ON)
81+
set(CMAKE_AUTORCC ON)
82+
set(CMAKE_AUTOUIC ON)
83+
find_package(Qt6 REQUIRED COMPONENTS Core Widgets Network Multimedia)
84+
endif()
7785

7886
set(BROWSER_SOURCE_DIR ${SERENITY_SOURCE_DIR}/Userland/Applications/Browser/)
7987

@@ -83,25 +91,45 @@ set(SOURCES
8391
${BROWSER_SOURCE_DIR}/History.cpp
8492
HelperProcess.cpp
8593
Utilities.cpp
86-
Qt/BrowserWindow.cpp
87-
Qt/ConsoleWidget.cpp
88-
Qt/EventLoopImplementationQt.cpp
89-
Qt/EventLoopImplementationQtEventTarget.cpp
90-
Qt/InspectorWidget.cpp
91-
Qt/LocationEdit.cpp
92-
Qt/ModelTranslator.cpp
93-
Qt/Settings.cpp
94-
Qt/SettingsDialog.cpp
95-
Qt/Tab.cpp
96-
Qt/TVGIconEngine.cpp
97-
Qt/StringUtils.cpp
98-
Qt/WebContentView.cpp
99-
Qt/ladybird.qrc
100-
Qt/main.cpp
10194
)
10295

103-
qt_add_executable(ladybird ${SOURCES})
104-
target_link_libraries(ladybird PRIVATE Qt::Core Qt::Gui Qt::Network Qt::Widgets LibCore LibFileSystem LibGfx LibGUI LibIPC LibJS LibMain LibWeb LibWebView LibSQL LibProtocol)
96+
if (ENABLE_QT)
97+
qt_add_executable(ladybird ${SOURCES})
98+
target_sources(ladybird PRIVATE
99+
Qt/BrowserWindow.cpp
100+
Qt/ConsoleWidget.cpp
101+
Qt/EventLoopImplementationQt.cpp
102+
Qt/EventLoopImplementationQtEventTarget.cpp
103+
Qt/InspectorWidget.cpp
104+
Qt/LocationEdit.cpp
105+
Qt/ModelTranslator.cpp
106+
Qt/Settings.cpp
107+
Qt/SettingsDialog.cpp
108+
Qt/Tab.cpp
109+
Qt/TVGIconEngine.cpp
110+
Qt/StringUtils.cpp
111+
Qt/WebContentView.cpp
112+
Qt/ladybird.qrc
113+
Qt/main.cpp
114+
)
115+
target_link_libraries(ladybird PRIVATE Qt::Core Qt::Gui Qt::Network Qt::Widgets)
116+
117+
# FIXME: Set these for non-qt executables as well, when those exist
118+
set_target_properties(ladybird PROPERTIES
119+
MACOSX_BUNDLE_GUI_IDENTIFIER org.SerenityOS.Ladybird
120+
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
121+
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
122+
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist"
123+
MACOSX_BUNDLE TRUE
124+
WIN32_EXECUTABLE TRUE
125+
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER org.SerenityOS.Ladybird
126+
)
127+
else()
128+
# TODO: Check for other GUI frameworks here when we move them in-tree
129+
# For now, we can export a static library of common files for chromes to link to
130+
add_library(ladybird STATIC ${SOURCES})
131+
endif()
132+
target_link_libraries(ladybird PRIVATE LibCore LibFileSystem LibGfx LibGUI LibIPC LibJS LibMain LibWeb LibWebView LibSQL LibProtocol)
105133

106134
target_include_directories(ladybird PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
107135
target_include_directories(ladybird PRIVATE ${SERENITY_SOURCE_DIR}/Userland/)
@@ -117,16 +145,6 @@ add_executable(headless-browser
117145
target_include_directories(headless-browser PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
118146
target_link_libraries(headless-browser PRIVATE LibWeb LibWebView LibWebSocket LibCrypto LibFileSystem LibGemini LibHTTP LibJS LibGfx LibMain LibTLS LibIPC LibDiff LibProtocol)
119147

120-
set_target_properties(ladybird PROPERTIES
121-
MACOSX_BUNDLE_GUI_IDENTIFIER org.SerenityOS.Ladybird
122-
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
123-
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
124-
MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist"
125-
MACOSX_BUNDLE TRUE
126-
WIN32_EXECUTABLE TRUE
127-
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER org.SerenityOS.Ladybird
128-
)
129-
130148
if (ANDROID)
131149
include(cmake/AndroidExtras.cmake)
132150
link_android_libs(headless-browser)

Ladybird/WebContent/CMakeLists.txt

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,31 @@ set(WEBCONTENT_SOURCES
1010
../HelperProcess.cpp
1111
../ImageCodecPlugin.cpp
1212
../Utilities.cpp
13-
../Qt/AudioCodecPluginQt.cpp
14-
../Qt/AudioThread.cpp
15-
../Qt/EventLoopImplementationQt.cpp
16-
../Qt/EventLoopImplementationQtEventTarget.cpp
17-
../Qt/RequestManagerQt.cpp
18-
../Qt/StringUtils.cpp
19-
../Qt/WebSocketClientManagerQt.cpp
20-
../Qt/WebSocketQt.cpp
21-
../Qt/WebSocketImplQt.cpp
2213
main.cpp
2314
)
2415

25-
qt_add_executable(WebContent ${WEBCONTENT_SOURCES})
16+
if (ENABLE_QT)
17+
qt_add_executable(WebContent ${WEBCONTENT_SOURCES})
18+
target_sources(WebContent PRIVATE
19+
../Qt/AudioCodecPluginQt.cpp
20+
../Qt/AudioThread.cpp
21+
../Qt/EventLoopImplementationQt.cpp
22+
../Qt/EventLoopImplementationQtEventTarget.cpp
23+
../Qt/RequestManagerQt.cpp
24+
../Qt/StringUtils.cpp
25+
../Qt/WebSocketClientManagerQt.cpp
26+
../Qt/WebSocketQt.cpp
27+
../Qt/WebSocketImplQt.cpp
28+
)
29+
target_link_libraries(WebContent PRIVATE Qt::Core Qt::Network Qt::Multimedia)
30+
target_compile_definitions(WebContent PRIVATE HAVE_QT=1)
31+
else()
32+
add_executable(WebContent ${WEBCONTENT_SOURCES})
33+
endif()
2634

2735
target_include_directories(WebContent PRIVATE ${SERENITY_SOURCE_DIR}/Userland/Services/)
2836
target_include_directories(WebContent PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/..)
29-
target_link_libraries(WebContent PRIVATE Qt::Core Qt::Network Qt::Multimedia LibAudio LibCore LibFileSystem LibGfx LibIPC LibJS LibMain LibWeb LibWebSocket LibProtocol LibSQL LibWebView)
37+
target_link_libraries(WebContent PRIVATE LibAudio LibCore LibFileSystem LibGfx LibIPC LibJS LibMain LibWeb LibWebSocket LibProtocol LibSQL LibWebView)
3038
if (ANDROID)
3139
link_android_libs(WebContent)
3240
endif()

Ladybird/WebContent/main.cpp

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@
88
#include <Ladybird/FontPlugin.h>
99
#include <Ladybird/HelperProcess.h>
1010
#include <Ladybird/ImageCodecPlugin.h>
11-
#include <Ladybird/Qt/AudioCodecPluginQt.h>
12-
#include <Ladybird/Qt/EventLoopImplementationQt.h>
13-
#include <Ladybird/Qt/RequestManagerQt.h>
14-
#include <Ladybird/Qt/WebSocketClientManagerQt.h>
1511
#include <Ladybird/Utilities.h>
1612
#include <LibAudio/Loader.h>
1713
#include <LibCore/ArgsParser.h>
@@ -33,19 +29,29 @@
3329
#include <LibWeb/WebSockets/WebSocket.h>
3430
#include <LibWebView/RequestServerAdapter.h>
3531
#include <LibWebView/WebSocketClientAdapter.h>
36-
#include <QCoreApplication>
3732
#include <WebContent/ConnectionFromClient.h>
3833
#include <WebContent/PageHost.h>
3934
#include <WebContent/WebDriverConnection.h>
4035

36+
#if defined(HAVE_QT)
37+
# include <Ladybird/Qt/AudioCodecPluginQt.h>
38+
# include <Ladybird/Qt/EventLoopImplementationQt.h>
39+
# include <Ladybird/Qt/RequestManagerQt.h>
40+
# include <Ladybird/Qt/WebSocketClientManagerQt.h>
41+
# include <QCoreApplication>
42+
#endif
43+
4144
static ErrorOr<void> load_content_filters();
4245
static ErrorOr<void> load_autoplay_allowlist();
46+
static ErrorOr<void> initialize_lagom_networking();
4347

4448
ErrorOr<int> serenity_main(Main::Arguments arguments)
4549
{
50+
#if defined(HAVE_QT)
4651
QCoreApplication app(arguments.argc, arguments.argv);
4752

4853
Core::EventLoopManager::install(*new Ladybird::EventLoopManagerQt);
54+
#endif
4955
Core::EventLoop event_loop;
5056

5157
platform_init();
@@ -56,8 +62,10 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
5662
Web::Platform::AudioCodecPlugin::install_creation_hook([](auto loader) {
5763
#if defined(HAVE_PULSEAUDIO)
5864
return Web::Platform::AudioCodecPluginAgnostic::create(move(loader));
59-
#else
65+
#elif defined(HAVE_QT)
6066
return Ladybird::AudioCodecPluginQt::create(move(loader));
67+
#else
68+
# error "Don't know how to initialize audio in this configuration!"
6169
#endif
6270
});
6371

@@ -73,17 +81,14 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
7381
args_parser.add_option(use_lagom_networking, "Enable Lagom servers for networking", "use-lagom-networking", 0);
7482
args_parser.parse(arguments);
7583

76-
if (use_lagom_networking) {
77-
auto candidate_request_server_paths = TRY(get_paths_for_helper_process("RequestServer"sv));
78-
auto request_server_client = TRY(launch_request_server_process(candidate_request_server_paths, s_serenity_resource_root));
79-
Web::ResourceLoader::initialize(TRY(WebView::RequestServerAdapter::try_create(move(request_server_client))));
80-
81-
auto candidate_web_socket_paths = TRY(get_paths_for_helper_process("WebSocket"sv));
82-
auto web_socket_client = TRY(launch_web_socket_process(candidate_web_socket_paths, s_serenity_resource_root));
83-
Web::WebSockets::WebSocketClientManager::initialize(TRY(WebView::WebSocketClientManagerAdapter::try_create(move(web_socket_client))));
84-
} else {
84+
#if defined(HAVE_QT)
85+
if (!use_lagom_networking) {
8586
Web::ResourceLoader::initialize(Ladybird::RequestManagerQt::create());
8687
Web::WebSockets::WebSocketClientManager::initialize(Ladybird::WebSocketClientManagerQt::create());
88+
} else
89+
#endif
90+
{
91+
TRY(initialize_lagom_networking());
8792
}
8893

8994
Web::HTML::Window::set_internals_object_exposed(is_layout_test_mode);
@@ -168,3 +173,16 @@ static ErrorOr<void> load_autoplay_allowlist()
168173

169174
return {};
170175
}
176+
177+
static ErrorOr<void> initialize_lagom_networking()
178+
{
179+
auto candidate_request_server_paths = TRY(get_paths_for_helper_process("RequestServer"sv));
180+
auto request_server_client = TRY(launch_request_server_process(candidate_request_server_paths, s_serenity_resource_root));
181+
Web::ResourceLoader::initialize(TRY(WebView::RequestServerAdapter::try_create(move(request_server_client))));
182+
183+
auto candidate_web_socket_paths = TRY(get_paths_for_helper_process("WebSocket"sv));
184+
auto web_socket_client = TRY(launch_web_socket_process(candidate_web_socket_paths, s_serenity_resource_root));
185+
Web::WebSockets::WebSocketClientManager::initialize(TRY(WebView::WebSocketClientManagerAdapter::try_create(move(web_socket_client))));
186+
187+
return {};
188+
}

0 commit comments

Comments
 (0)