Meta+LibWeb: Pass IDL files to codegen using response file on Windows

It might be a good idea to do this on other platforms as well, but at
least on Windows, the command line for GenerateWindowOrWorkerInterfaces
becomes too large.
This commit is contained in:
Andrew Kaster 2025-02-12 05:23:02 -07:00 committed by Andrew Kaster
parent 06ff47749f
commit 80c259125c
Notes: github-actions[bot] 2025-02-13 02:15:07 +00:00
2 changed files with 27 additions and 1 deletions

View file

@ -219,10 +219,17 @@ function (generate_js_bindings target)
ShadowRealmExposedInterfaces.cpp ShadowRealmExposedInterfaces.h
WindowExposedInterfaces.cpp WindowExposedInterfaces.h)
list(TRANSFORM exposed_interface_sources PREPEND "Bindings/")
set(LIBWEB_ALL_IDL_FILES_ARGUMENT ${LIBWEB_ALL_IDL_FILES})
if (WIN32)
list(JOIN LIBWEB_ALL_IDL_FILES "\n" idl_file_list)
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/all_idl_files.txt" CONTENT "${idl_file_list}" NEWLINE_STYLE UNIX)
set(LIBWEB_ALL_IDL_FILES "${CMAKE_CURRENT_BINARY_DIR}/all_idl_files.txt")
set(LIBWEB_ALL_IDL_FILES_ARGUMENT "@${LIBWEB_ALL_IDL_FILES}")
endif()
add_custom_command(
OUTPUT ${exposed_interface_sources}
COMMAND "${CMAKE_COMMAND}" -E make_directory "tmp"
COMMAND $<TARGET_FILE:Lagom::GenerateWindowOrWorkerInterfaces> -o "${CMAKE_CURRENT_BINARY_DIR}/tmp" -b "${LIBWEB_INPUT_FOLDER}" -b "${CMAKE_CURRENT_BINARY_DIR}" ${LIBWEB_ALL_IDL_FILES}
COMMAND $<TARGET_FILE:Lagom::GenerateWindowOrWorkerInterfaces> -o "${CMAKE_CURRENT_BINARY_DIR}/tmp" -b "${LIBWEB_INPUT_FOLDER}" -b "${CMAKE_CURRENT_BINARY_DIR}" ${LIBWEB_ALL_IDL_FILES_ARGUMENT}
COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/IntrinsicDefinitions.cpp "Bindings/IntrinsicDefinitions.cpp"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/DedicatedWorkerExposedInterfaces.h "Bindings/DedicatedWorkerExposedInterfaces.h"
COMMAND "${CMAKE_COMMAND}" -E copy_if_different tmp/DedicatedWorkerExposedInterfaces.cpp "Bindings/DedicatedWorkerExposedInterfaces.cpp"

View file

@ -356,6 +356,25 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
VERIFY(!paths.is_empty());
VERIFY(!base_paths.is_empty());
if (paths.first().starts_with("@"sv)) {
// Response file
auto file_or_error = Core::File::open(paths.first().substring_view(1), Core::File::OpenMode::Read);
paths.remove(0);
VERIFY(paths.is_empty());
if (file_or_error.is_error()) {
s_error_string = ByteString::formatted("Unable to open response file {}", paths.first());
return Error::from_string_view(s_error_string.view());
}
auto file = file_or_error.release_value();
auto string = TRY(file->read_until_eof());
for (auto const& path : StringView(string).split_view('\n')) {
if (path.is_empty())
continue;
paths.append(path);
}
}
Vector<ByteString> lexical_bases;
for (auto const& base_path : base_paths) {
VERIFY(!base_path.is_empty());