From 5945cdc054e603214e9aeea9221888d523506c83 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sun, 21 Jan 2024 18:24:43 -0500 Subject: [PATCH] Ladybird+Meta: Extract AK into its own library on Lagom We currently bundle AK with LibCore on Lagom. This means that to use AK, all libraries must also depend on LibCore. This will create circular dependencies when we create LibURL, as LibURL will depend on LibUnicode, which will depend on LibCore, which will depend on LibURL. --- Ladybird/CMakeLists.txt | 4 +- Meta/Lagom/CMakeLists.txt | 31 +++--- Meta/Lagom/Contrib/MacPDF/CMakeLists.txt | 6 +- Meta/Lagom/Fuzzers/CMakeLists.txt | 8 +- Meta/Lagom/Tools/CMakeLists.txt | 2 +- Meta/gn/secondary/AK/BUILD.gn | 100 ++++++++---------- Meta/gn/secondary/Ladybird/BUILD.gn | 1 + .../Userland/Libraries/LibCore/BUILD.gn | 1 - 8 files changed, 75 insertions(+), 78 deletions(-) diff --git a/Ladybird/CMakeLists.txt b/Ladybird/CMakeLists.txt index 99224da7ec..6b04edca06 100644 --- a/Ladybird/CMakeLists.txt +++ b/Ladybird/CMakeLists.txt @@ -175,7 +175,7 @@ target_sources(ladybird PUBLIC FILE_SET ladybird TYPE HEADERS BASE_DIRS ${SERENITY_SOURCE_DIR} FILES ${LADYBIRD_HEADERS} ) -target_link_libraries(ladybird PRIVATE LibCore LibFileSystem LibGfx LibImageDecoderClient LibIPC LibJS LibMain LibWeb LibWebView LibProtocol) +target_link_libraries(ladybird PRIVATE AK LibCore LibFileSystem LibGfx LibImageDecoderClient LibIPC LibJS LibMain LibWeb LibWebView LibProtocol) target_include_directories(ladybird PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(ladybird PRIVATE ${SERENITY_SOURCE_DIR}/Userland/) @@ -189,7 +189,7 @@ add_executable(headless-browser Utilities.cpp) target_include_directories(headless-browser PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -target_link_libraries(headless-browser PRIVATE LibWeb LibWebView LibWebSocket LibCrypto LibFileSystem LibGemini LibHTTP LibImageDecoderClient LibJS LibGfx LibMain LibTLS LibIPC LibDiff LibProtocol) +target_link_libraries(headless-browser PRIVATE AK LibCore LibWeb LibWebView LibWebSocket LibCrypto LibFileSystem LibGemini LibHTTP LibImageDecoderClient LibJS LibGfx LibMain LibTLS LibIPC LibDiff LibProtocol) if (ANDROID) include(cmake/AndroidExtras.cmake) diff --git a/Meta/Lagom/CMakeLists.txt b/Meta/Lagom/CMakeLists.txt index 8e590a667a..9a7dec6904 100644 --- a/Meta/Lagom/CMakeLists.txt +++ b/Meta/Lagom/CMakeLists.txt @@ -224,9 +224,11 @@ function(lagom_lib target_name fs_name) OUTPUT_NAME lagom-${fs_name} ) target_link_libraries(${target_name} PRIVATE ${LAGOM_LIBRARY_LIBS}) - if (NOT ${target_name} STREQUAL "LibCore") - target_link_libraries(${target_name} PRIVATE LibCore) + + if (NOT "${target_name}" STREQUAL "AK") + target_link_libraries(${target_name} PRIVATE AK) endif() + # FIXME: Clean these up so that we don't need so many include dirs target_include_directories(${target_name} INTERFACE $ @@ -262,7 +264,7 @@ function(lagom_test source) get_filename_component(LAGOM_TEST_NAME ${source} NAME_WE) endif() add_executable(${LAGOM_TEST_NAME} ${source}) - target_link_libraries(${LAGOM_TEST_NAME} PRIVATE LibCore LibFileSystem LibTest LibTestMain ${LAGOM_TEST_LIBS}) + target_link_libraries(${LAGOM_TEST_NAME} PRIVATE AK LibCore LibFileSystem LibTest LibTestMain ${LAGOM_TEST_LIBS}) add_test( NAME ${LAGOM_TEST_NAME} COMMAND ${LAGOM_TEST_NAME} @@ -275,7 +277,7 @@ function(lagom_utility name) cmake_parse_arguments(LAGOM_UTILITY "" "" "SOURCES;LIBS" ${ARGN}) add_executable("${name}" ${LAGOM_UTILITY_SOURCES}) - target_link_libraries("${name}" PRIVATE LibCore ${LAGOM_UTILITY_LIBS}) + target_link_libraries("${name}" PRIVATE AK LibCore ${LAGOM_UTILITY_LIBS}) endfunction() function(serenity_test test_src sub_dir) @@ -345,9 +347,11 @@ add_library(NoCoverage INTERFACE) # "install" these special targets to placate CMake install(TARGETS LibC LibCrypt LibSystem NoCoverage EXPORT LagomTargets) -# AK/LibCore -# Note: AK is included in LibCore for the host build instead of LibC per the target build +# AK add_serenity_subdirectory(AK) +lagom_lib(AK ak SOURCES ${AK_SOURCES}) + +# LibCore add_serenity_subdirectory(Userland/Libraries/LibCore) target_link_libraries(LibCore PRIVATE Threads::Threads) if (${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") @@ -366,7 +370,6 @@ if (HAIKU) # Haiku has networking related functions in the network library target_link_libraries(LibCore PRIVATE network) endif() -target_sources(LibCore PRIVATE ${AK_SOURCES}) # LibMain add_serenity_subdirectory(Userland/Libraries/LibMain) @@ -499,7 +502,7 @@ if (BUILD_LAGOM) list(TRANSFORM LIBGUI_SOURCES PREPEND "${SERENITY_PROJECT_ROOT}/Userland/Libraries/LibGUI/") lagom_lib(LibGUI gui SOURCES ${LIBGUI_SOURCES} - LIBS LibGfx LibSyntax) + LIBS LibCore LibGfx LibSyntax) # FIXME: How about we don't include Kernel/API from random high-level libraries? install(FILES ${SERENITY_PROJECT_ROOT}/Kernel/API/KeyCode.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/Kernel/API") @@ -563,7 +566,7 @@ if (BUILD_LAGOM) lagom_utility(js SOURCES ../../Userland/Utilities/js.cpp LIBS LibCrypto LibJS LibLine LibLocale LibMain LibTextCodec Threads::Threads) if (EMSCRIPTEN) - lagom_utility(libjs Wasm/js_repl.cpp LIBS LibJS LibLocale LibTimeZone LibUnicode) + lagom_utility(libjs SOURCES Wasm/js_repl.cpp LIBS LibJS LibLocale LibTimeZone LibUnicode) target_link_options(libjs PRIVATE -sEXPORTED_FUNCTIONS=_initialize_repl,_execute -sEXPORTED_RUNTIME_METHODS=allocateUTF8 @@ -612,7 +615,7 @@ if (BUILD_LAGOM) LibTest ${LIBTEST_SOURCES} ) - target_link_libraries(LibTest PRIVATE LibCore LibFileSystem) + target_link_libraries(LibTest PRIVATE AK LibCore LibFileSystem) set_target_properties(LibTest PROPERTIES OUTPUT_NAME lagom-test) add_library( LibTestMain @@ -677,14 +680,14 @@ if (BUILD_LAGOM) # test-jpeg-roundtrip add_executable(test-jpeg-roundtrip ../../Userland/Utilities/test-jpeg-roundtrip.cpp) - target_link_libraries(test-jpeg-roundtrip LibGfx LibMain) + target_link_libraries(test-jpeg-roundtrip AK LibGfx LibMain) # JavaScriptTestRunner + LibTest tests # test-js add_executable(test-js ../../Tests/LibJS/test-js.cpp ../../Userland/Libraries/LibTest/JavaScriptTestRunnerMain.cpp) - target_link_libraries(test-js LibCore LibFileSystem LibTest LibJS) + target_link_libraries(test-js AK LibCore LibFileSystem LibTest LibJS) add_test( NAME JS COMMAND test-js --show-progress=false @@ -699,7 +702,7 @@ if (BUILD_LAGOM) add_executable(test-spreadsheet ../../Tests/Spreadsheet/test-spreadsheet.cpp ../../Userland/Libraries/LibTest/JavaScriptTestRunnerMain.cpp) - target_link_libraries(test-spreadsheet LibCore LibFileSystem LibTest LibJS) + target_link_libraries(test-spreadsheet AK LibCore LibFileSystem LibTest LibJS) add_test( NAME Spreadsheet COMMAND test-spreadsheet --show-progress=false @@ -710,7 +713,7 @@ if (BUILD_LAGOM) add_executable(test-wasm ../../Tests/LibWasm/test-wasm.cpp ../../Userland/Libraries/LibTest/JavaScriptTestRunnerMain.cpp) - target_link_libraries(test-wasm LibCore LibFileSystem LibTest LibWasm LibJS LibCrypto) + target_link_libraries(test-wasm AK LibCore LibFileSystem LibTest LibWasm LibJS LibCrypto) add_test( NAME WasmParser COMMAND test-wasm --show-progress=false ${CMAKE_CURRENT_BINARY_DIR}/Userland/Libraries/LibWasm/Tests diff --git a/Meta/Lagom/Contrib/MacPDF/CMakeLists.txt b/Meta/Lagom/Contrib/MacPDF/CMakeLists.txt index b1cdbe5803..e5e3009d3c 100644 --- a/Meta/Lagom/Contrib/MacPDF/CMakeLists.txt +++ b/Meta/Lagom/Contrib/MacPDF/CMakeLists.txt @@ -24,7 +24,7 @@ add_executable(MacPDF MACOSX_BUNDLE target_compile_options(MacPDF PRIVATE -fobjc-arc ) -target_link_libraries(MacPDF PRIVATE LibCore LibGfx LibPDF) +target_link_libraries(MacPDF PRIVATE AK LibCore LibGfx LibPDF) target_link_libraries(MacPDF PRIVATE "-framework Cocoa" "-framework UniformTypeIdentifiers" @@ -39,7 +39,7 @@ set_target_properties(MacPDF PROPERTIES ) # Normally you'd set `RESOURCE "${RESOURCES}"` on the MacPDF target properties -# and add `"${RESOURCES}" to the sources in add_executable() +# and add `"${RESOURCES}" to the sources in add_executable() # and CMake would add build steps to compile the xib files to nib files and # add them to the bundle. # But with CMake's ninja generator that seems to not work, so do it manually. @@ -51,7 +51,7 @@ foreach(xib ${RESOURCES}) # FIXME: This is gross! It makes the link at least as slow as compiling all xib files. # Better to have a separate command for the compiles and to only do the copying in the postbuild. add_custom_command(TARGET MacPDF POST_BUILD - COMMAND ${IBTOOL} --errors --warnings --notices --output-format human-readable-text + COMMAND ${IBTOOL} --errors --warnings --notices --output-format human-readable-text --compile "$/Contents/Resources/${nib}" "${CMAKE_CURRENT_SOURCE_DIR}/${xib}" COMMENT "Compiling ${CMAKE_CURRENT_SOURCE_DIR}/${xib}.xib") diff --git a/Meta/Lagom/Fuzzers/CMakeLists.txt b/Meta/Lagom/Fuzzers/CMakeLists.txt index dfb170f49b..da28471985 100644 --- a/Meta/Lagom/Fuzzers/CMakeLists.txt +++ b/Meta/Lagom/Fuzzers/CMakeLists.txt @@ -6,18 +6,18 @@ function(add_simple_fuzzer name) configure_file("${name}.dict" "${FUZZER_DICTIONARY_DIRECTORY}/${name}.dict" COPYONLY) endif() target_link_libraries(${name} - PUBLIC ${ARGN} LibCore) + PUBLIC ${ARGN} AK LibCore) elseif (ENABLE_FUZZERS_LIBFUZZER) target_compile_options(${name} PRIVATE $<$:-g -O1 -fsanitize=fuzzer> ) target_link_libraries(${name} - PUBLIC ${ARGN} LibCore + PUBLIC ${ARGN} AK LibCore PRIVATE $<$:-fsanitize=fuzzer> ) else() target_sources(${name} PRIVATE "EntryShim.cpp") - target_link_libraries(${name} PUBLIC ${ARGN} LibCore) + target_link_libraries(${name} PUBLIC ${ARGN} AK LibCore) endif() endfunction() @@ -36,7 +36,7 @@ target_compile_options(FuzzilliJs PRIVATE $<$:-g -O1 -fsanitize-coverage=trace-pc-guard> ) target_link_libraries(FuzzilliJs - PUBLIC LibCore LibJS + PUBLIC AK LibCore LibJS PRIVATE $<$:-fsanitize-coverage=trace-pc-guard> ) endif() diff --git a/Meta/Lagom/Tools/CMakeLists.txt b/Meta/Lagom/Tools/CMakeLists.txt index 3ef0940925..712b5e9b6d 100644 --- a/Meta/Lagom/Tools/CMakeLists.txt +++ b/Meta/Lagom/Tools/CMakeLists.txt @@ -3,7 +3,7 @@ function(lagom_tool tool) add_executable(${tool} ${SOURCES} ${LAGOM_TOOL_SOURCES}) # alias for parity with exports add_executable(Lagom::${tool} ALIAS ${tool}) - target_link_libraries(${tool} LibCore LibFileSystem ${LAGOM_TOOL_LIBS}) + target_link_libraries(${tool} AK LibCore LibFileSystem ${LAGOM_TOOL_LIBS}) install( TARGETS ${tool} EXPORT LagomTargets diff --git a/Meta/gn/secondary/AK/BUILD.gn b/Meta/gn/secondary/AK/BUILD.gn index c18f2cdb2f..473b5a62c8 100644 --- a/Meta/gn/secondary/AK/BUILD.gn +++ b/Meta/gn/secondary/AK/BUILD.gn @@ -7,20 +7,24 @@ config("ak_headers") { ] } -source_set("AK") { +shared_library("AK") { + output_name = "ak" + public_configs = [ ":ak_headers" ] public_deps = [ ":ak_debug_gen" ] - # NOTE: Headers only! + # FIXME: Split out non-kernel sources to their own set sources = [ "AllOf.h", "AnyOf.h", "ArbitrarySizedEnum.h", "Array.h", + "Assertions.cpp", "Assertions.h", "Atomic.h", "AtomicRefCounted.h", "Badge.h", + "Base64.cpp", "Base64.h", "BigIntBase.h", "BinaryBufferWriter.h", @@ -35,21 +39,27 @@ source_set("AK") { "BumpAllocator.h", "ByteBuffer.h", "ByteReader.h", + "ByteString.cpp", "ByteString.h", "CharacterTypes.h", "Checked.h", "CheckedFormatString.h", + "CircularBuffer.cpp", "CircularBuffer.h", "CircularDeque.h", "CircularQueue.h", "Complex.h", "Concepts.h", + "ConstrainedStream.cpp", "ConstrainedStream.h", + "CountingStream.cpp", "CountingStream.h", + "DOSPackedTime.cpp", "DOSPackedTime.h", "DateConstants.h", "DefaultDelete.h", "Demangle.h", + "DeprecatedFlyString.cpp", "DeprecatedFlyString.h", "Diagnostics.h", "DisjointChunks.h", @@ -57,23 +67,30 @@ source_set("AK") { "DoublyLinkedList.h", "Endian.h", "EnumBits.h", + "Error.cpp", "Error.h", "FPControl.h", "Find.h", "FixedArray.h", "FixedPoint.h", "FloatingPoint.h", + "FloatingPointStringConversions.cpp", "FloatingPointStringConversions.h", + "FlyString.cpp", "FlyString.h", + "Format.cpp", "Format.h", "Forward.h", "Function.h", + "FuzzyMatch.cpp", "FuzzyMatch.h", + "GenericLexer.cpp", "GenericLexer.h", "GenericShorthands.h", "HashFunctions.h", "HashMap.h", "HashTable.h", + "Hex.cpp", "Hex.h", "IDAllocator.h", "IPv4Address.h", @@ -88,26 +105,34 @@ source_set("AK") { "Iterator.h", "JsonArray.h", "JsonArraySerializer.h", + "JsonObject.cpp", "JsonObject.h", "JsonObjectSerializer.h", + "JsonParser.cpp", "JsonParser.h", + "JsonPath.cpp", "JsonPath.h", + "JsonValue.cpp", "JsonValue.h", "LEB128.h", + "LexicalPath.cpp", "LexicalPath.h", "MACAddress.h", "Math.h", "MaybeOwned.h", "MemMem.h", "Memory.h", + "MemoryStream.cpp", "MemoryStream.h", "NeverDestroyed.h", "NoAllocationGuard.h", "Noncopyable.h", "NonnullOwnPtr.h", "NonnullRefPtr.h", + "NumberFormat.cpp", "NumberFormat.h", "NumericLimits.h", + "OptionParser.cpp", "OptionParser.h", "Optional.h", "OwnPtr.h", @@ -117,6 +142,7 @@ source_set("AK") { "Queue.h", "QuickSelect.h", "QuickSort.h", + "Random.cpp", "Random.h", "RecursionDecision.h", "RedBlackTree.h", @@ -134,26 +160,38 @@ source_set("AK") { "Singleton.h", "SinglyLinkedList.h", "SinglyLinkedListSizePolicy.h", + "SipHash.cpp", "SipHash.h", + "Slugify.cpp", "Slugify.h", "SourceGenerator.h", "SourceLocation.h", "Span.h", "Stack.h", + "StackInfo.cpp", "StackInfo.h", "Statistics.h", "StdLibExtraDetails.h", "StdLibExtras.h", + "Stream.cpp", "Stream.h", + "String.cpp", "String.h", + "StringBase.cpp", "StringBase.h", + "StringBuilder.cpp", "StringBuilder.h", + "StringFloatingPointConversions.cpp", "StringFloatingPointConversions.h", "StringHash.h", + "StringImpl.cpp", "StringImpl.h", + "StringUtils.cpp", "StringUtils.h", + "StringView.cpp", "StringView.h", "TemporaryChange.h", + "Time.cpp", "Time.h", "Traits.h", "Trie.h", @@ -166,74 +204,30 @@ source_set("AK") { "UBSanitizer.h", "UFixedBigInt.h", "UFixedBigIntDivision.h", + "URL.cpp", "URL.h", + "URLParser.cpp", "URLParser.h", + "UUID.cpp", "UUID.h", "UnicodeUtils.h", "Userspace.h", + "Utf16View.cpp", "Utf16View.h", + "Utf32View.cpp", "Utf32View.h", + "Utf8View.cpp", "Utf8View.h", "Variant.h", "Vector.h", "WeakPtr.h", "Weakable.h", + "kmalloc.cpp", "kmalloc.h", "kstdio.h", ] } -source_set("sources") { - deps = [ ":AK" ] - - # FIXME: Split out non-kernel sources to their own set - sources = [ - "Assertions.cpp", - "Base64.cpp", - "ByteString.cpp", - "CircularBuffer.cpp", - "ConstrainedStream.cpp", - "CountingStream.cpp", - "DOSPackedTime.cpp", - "DeprecatedFlyString.cpp", - "Error.cpp", - "FloatingPointStringConversions.cpp", - "FlyString.cpp", - "Format.cpp", - "FuzzyMatch.cpp", - "GenericLexer.cpp", - "Hex.cpp", - "JsonObject.cpp", - "JsonParser.cpp", - "JsonPath.cpp", - "JsonValue.cpp", - "LexicalPath.cpp", - "MemoryStream.cpp", - "NumberFormat.cpp", - "OptionParser.cpp", - "Random.cpp", - "SipHash.cpp", - "Slugify.cpp", - "StackInfo.cpp", - "Stream.cpp", - "String.cpp", - "StringBase.cpp", - "StringBuilder.cpp", - "StringFloatingPointConversions.cpp", - "StringImpl.cpp", - "StringUtils.cpp", - "StringView.cpp", - "Time.cpp", - "URL.cpp", - "URLParser.cpp", - "UUID.cpp", - "Utf16View.cpp", - "Utf32View.cpp", - "Utf8View.cpp", - "kmalloc.cpp", - ] -} - write_cmake_config("ak_debug_gen") { input = "Debug.h.in" output = "$root_gen_dir/AK/Debug.h" diff --git a/Meta/gn/secondary/Ladybird/BUILD.gn b/Meta/gn/secondary/Ladybird/BUILD.gn index 4f0378a044..6b8c3012be 100644 --- a/Meta/gn/secondary/Ladybird/BUILD.gn +++ b/Meta/gn/secondary/Ladybird/BUILD.gn @@ -144,6 +144,7 @@ executable("headless-browser") { include_dirs = [ "//Userland/Services" ] configs += [ ":ladybird_config" ] deps = [ + "//AK", "//Userland/Libraries/LibCore", "//Userland/Libraries/LibCrypto", "//Userland/Libraries/LibDiff", diff --git a/Meta/gn/secondary/Userland/Libraries/LibCore/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibCore/BUILD.gn index c83a768523..38cc7da0d2 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibCore/BUILD.gn +++ b/Meta/gn/secondary/Userland/Libraries/LibCore/BUILD.gn @@ -136,7 +136,6 @@ shared_library("LibCore") { deps = [ ":filewatcher", ":sources", - "//AK:sources", "//Meta/gn/build/libs/crypt", "//Meta/gn/build/libs/pthread", "//Userland/Libraries/LibSystem",