From b8e51425e9fa1f49ce35c7545df2d94af9cf2ced Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Sun, 16 Oct 2022 23:49:52 -0600 Subject: [PATCH] Lagom+CMake: Propagate dependencies for generated custom targets We have logic for serenity_generated_sources which works well for source files that are specified in GENERATED_SOURCES prior to calling serenity_lib or serenity_bin. However, code generated with invoke_generator, and the LibWeb generators do not always follow the pattern of the IDL and GML files. For the LibWeb generators, we can just add_dependencies to LibWeb at the time we declare the generate_Foo custom target. However for LibLocale, LibTimeZone, and LibUnicode, we don't have the name of the target available, so export the name in a variable to set into GENERATED_SOURCES. To make this work for Lagom, we need to make sure that lagom_lib and serenity_bin in Lagom/CMakeLists.txt call serenity_generated_sources on the target. This enables the Xcode generator on macOS hosts, at least for Lagom. --- Meta/CMake/libweb_generators.cmake | 20 +++++++++---------- Meta/CMake/utils.cmake | 2 ++ Meta/Lagom/CMakeLists.txt | 4 ++++ Userland/Libraries/LibLocale/CMakeLists.txt | 3 +++ Userland/Libraries/LibTimeZone/CMakeLists.txt | 2 ++ Userland/Libraries/LibUnicode/CMakeLists.txt | 1 + 6 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Meta/CMake/libweb_generators.cmake b/Meta/CMake/libweb_generators.cmake index 584d114317..d8fc6ec67b 100644 --- a/Meta/CMake/libweb_generators.cmake +++ b/Meta/CMake/libweb_generators.cmake @@ -121,14 +121,13 @@ function (generate_js_bindings target) MAIN_DEPENDENCY ${class}.idl ) endforeach() - add_custom_target(generate_${basename}Constructor.h DEPENDS Bindings/${basename}Constructor.h) - add_dependencies(all_generated generate_${basename}Constructor.h) - add_custom_target(generate_${basename}Constructor.cpp DEPENDS Bindings/${basename}Constructor.cpp) - add_dependencies(all_generated generate_${basename}Constructor.cpp) - add_custom_target(generate_${basename}Prototype.h DEPENDS Bindings/${basename}Prototype.h) - add_dependencies(all_generated generate_${basename}Prototype.h) - add_custom_target(generate_${basename}Prototype.cpp DEPENDS Bindings/${basename}Prototype.cpp) - add_dependencies(all_generated generate_${basename}Prototype.cpp) + + foreach(generated_file IN LISTS BINDINGS_SOURCES) + get_filename_component(generated_name ${generated_file} NAME) + add_custom_target(generate_${generated_name} DEPENDS ${generated_file}) + add_dependencies(all_generated generate_${generated_name}) + add_dependencies(${target} generate_${generated_name}) + endforeach() list(APPEND LIBWEB_ALL_IDL_FILES "${LIBWEB_INPUT_FOLDER}/${class}.idl") set(LIBWEB_ALL_IDL_FILES ${LIBWEB_ALL_IDL_FILES} PARENT_SCOPE) @@ -154,8 +153,9 @@ function (generate_js_bindings target) DEPENDS Lagom::GenerateWindowOrWorkerInterfaces ${LIBWEB_ALL_IDL_FILES} ) target_sources(${target} PRIVATE ${exposed_interface_sources}) - add_custom_target("generate_exposed_interfaces" DEPENDS ${exposed_interface_sources}) - add_dependencies(all_generated "generate_exposed_interfaces") + add_custom_target(generate_exposed_interfaces DEPENDS ${exposed_interface_sources}) + add_dependencies(all_generated generate_exposed_interfaces) + add_dependencies(${target} generate_exposed_interfaces) endfunction() include("idl_files.cmake") diff --git a/Meta/CMake/utils.cmake b/Meta/CMake/utils.cmake index 7f923ea00c..0518591a7b 100644 --- a/Meta/CMake/utils.cmake +++ b/Meta/CMake/utils.cmake @@ -192,6 +192,8 @@ function(invoke_generator name generator version_file header implementation) add_custom_target("generate_${name}" DEPENDS "${header}" "${implementation}") add_dependencies(all_generated "generate_${name}") + list(APPEND CURRENT_LIB_GENERATED "${name}") + set(CURRENT_LIB_GENERATED ${CURRENT_LIB_GENERATED} PARENT_SCOPE) endfunction() function(download_file url path) diff --git a/Meta/Lagom/CMakeLists.txt b/Meta/Lagom/CMakeLists.txt index 0131c91bd8..5bb3d59089 100644 --- a/Meta/Lagom/CMakeLists.txt +++ b/Meta/Lagom/CMakeLists.txt @@ -224,6 +224,7 @@ function(lagom_lib target_name fs_name) DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} FILES_MATCHING PATTERN "*.h" ) + serenity_generated_sources(${target_name}) endfunction() function(lagom_test source) @@ -254,6 +255,7 @@ function(serenity_bin name) INCLUDES # DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) + serenity_generated_sources(${name}) endfunction() function(serenity_lib name fs_name) @@ -372,9 +374,11 @@ if (BUILD_LAGOM) list(APPEND LIBWEBVIEW_GENERATED_SOURCES WebContent/WebContentClientEndpoint.h) list(APPEND LIBWEBVIEW_GENERATED_SOURCES WebContent/WebContentServerEndpoint.h) + set(GENERATED_SOURCES ${LIBWEBVIEW_GENERATED_SOURCES}) lagom_lib(LibWebView webview SOURCES ${LIBWEBVIEW_SOURCES} ${LIBWEBVIEW_GENERATED_SOURCES} LIBS LibGUI LibWeb) + unset(GENERATED_SOURCES) endif() # FIXME: Excluding arm64 is a temporary hack to circumvent a build problem diff --git a/Userland/Libraries/LibLocale/CMakeLists.txt b/Userland/Libraries/LibLocale/CMakeLists.txt index bb5913a443..bbeb1e954a 100644 --- a/Userland/Libraries/LibLocale/CMakeLists.txt +++ b/Userland/Libraries/LibLocale/CMakeLists.txt @@ -2,13 +2,16 @@ include(${SerenityOS_SOURCE_DIR}/Meta/CMake/locale_data.cmake) if (DEFINED LOCALE_DATA_SOURCES) set(SOURCES ${LOCALE_DATA_SOURCES}) + set(GENERATED_SOURCES ${CURRENT_LIB_GENERATED}) if (SERENITYOS) serenity_lib(LibLocaleData localedata) else() add_library(LibLocaleData OBJECT ${SOURCES}) + serenity_generated_sources(LibLocaleData) endif() target_compile_options(LibLocaleData PRIVATE -g0 -Os -Wno-parentheses-equality) target_link_libraries(LibLocaleData LibCore LibTimeZone) + unset(GENERATED_SOURCES) endif() set(SOURCES diff --git a/Userland/Libraries/LibTimeZone/CMakeLists.txt b/Userland/Libraries/LibTimeZone/CMakeLists.txt index b885df29f3..c1e9f992ae 100644 --- a/Userland/Libraries/LibTimeZone/CMakeLists.txt +++ b/Userland/Libraries/LibTimeZone/CMakeLists.txt @@ -4,8 +4,10 @@ set(SOURCES TimeZone.cpp ${TIME_ZONE_DATA_SOURCES} ) +set(GENERATED_SOURCES ${CURRENT_LIB_GENERATED}) add_library(LibTimeZone OBJECT ${SOURCES}) +serenity_generated_sources(LibTimeZone) target_compile_definitions(LibTimeZone PRIVATE ENABLE_TIME_ZONE_DATA=$) # NOTE: These objects are used by the DynamicLoader, which is always built without coverage instrumentation. diff --git a/Userland/Libraries/LibUnicode/CMakeLists.txt b/Userland/Libraries/LibUnicode/CMakeLists.txt index 96a35f058d..a81a2eb429 100644 --- a/Userland/Libraries/LibUnicode/CMakeLists.txt +++ b/Userland/Libraries/LibUnicode/CMakeLists.txt @@ -7,6 +7,7 @@ set(SOURCES Normalize.cpp ${UNICODE_DATA_SOURCES} ) +set(GENERATED_SOURCES ${CURRENT_LIB_GENERATED}) serenity_lib(LibUnicode unicode) target_link_libraries(LibUnicode LibCore)