diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 4bd5a17fb2a..02859fdbf03 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -293,7 +293,6 @@ generate_state_machine(../Userland/Libraries/LibVT/StateMachine.txt ../Userland/ set(VT_SOURCES ../Userland/Libraries/LibVT/Terminal.cpp ../Userland/Libraries/LibVT/Line.cpp - ../Userland/Libraries/LibVT/EscapeSequenceStateMachine.h ../Userland/Libraries/LibVT/EscapeSequenceParser.cpp ) @@ -376,6 +375,8 @@ else() endif() add_executable(Kernel ${SOURCES}) +add_dependencies(Kernel generate_EscapeSequenceStateMachine.h) + if (ENABLE_KERNEL_LTO) include(CheckIPOSupported) check_ipo_supported() diff --git a/Meta/CMake/utils.cmake b/Meta/CMake/utils.cmake index 6cadb1879e3..54ae2ef458a 100644 --- a/Meta/CMake/utils.cmake +++ b/Meta/CMake/utils.cmake @@ -169,13 +169,21 @@ function(embed_resource target section file) endfunction() function(generate_state_machine source header) - set(source ${CMAKE_CURRENT_SOURCE_DIR}/${source}) - add_custom_command( - OUTPUT ${header} - COMMAND ${write_if_different} ${header} ${CMAKE_BINARY_DIR}/Userland/DevTools/StateMachineGenerator/StateMachineGenerator ${source} > ${header} - VERBATIM - DEPENDS StateMachineGenerator - MAIN_DEPENDENCY ${source} - ) - get_filename_component(output_name ${header} NAME) + get_filename_component(header_name ${header} NAME) + set(target_name "generate_${header_name}") + # Note: This function is called twice with the same header, once in the kernel + # and once in Userland/LibVT, this check makes sure that only one target + # is generated for that header. + if(NOT TARGET ${target_name}) + set(source ${CMAKE_CURRENT_SOURCE_DIR}/${source}) + set(output ${CMAKE_CURRENT_SOURCE_DIR}/${header}) + add_custom_command( + OUTPUT ${output} + COMMAND ${write_if_different} ${output} ${CMAKE_BINARY_DIR}/Userland/DevTools/StateMachineGenerator/StateMachineGenerator ${source} + VERBATIM + DEPENDS StateMachineGenerator + MAIN_DEPENDENCY ${source} + ) + add_custom_target(${target_name} DEPENDS ${output}) + endif() endfunction() diff --git a/Userland/Libraries/LibVT/CMakeLists.txt b/Userland/Libraries/LibVT/CMakeLists.txt index a5e3d6d7298..57765612bbf 100644 --- a/Userland/Libraries/LibVT/CMakeLists.txt +++ b/Userland/Libraries/LibVT/CMakeLists.txt @@ -1,6 +1,3 @@ -# FIXME: this assumes that EscapeSequenceStateMachine.h has been -# already generated when the kernel was built. This will probably -# mess builds up later on. set(SOURCES Line.cpp Terminal.cpp @@ -8,5 +5,10 @@ set(SOURCES EscapeSequenceParser.cpp ) +set(GENERATED_SOURCES + EscapeSequenceStateMachine.h +) + +generate_state_machine(StateMachine.txt EscapeSequenceStateMachine.h) serenity_lib(LibVT vt) target_link_libraries(LibVT LibC LibCore LibGUI LibGfx LibDesktop)