summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Meta/CMake/common_options.cmake1
-rw-r--r--Meta/CMake/time_zone_data.cmake88
-rw-r--r--Meta/Lagom/CMakeLists.txt24
-rw-r--r--Meta/Lagom/Tools/CodeGenerators/CMakeLists.txt1
-rw-r--r--Meta/Lagom/Tools/CodeGenerators/LibTimeZone/CMakeLists.txt1
-rw-r--r--Meta/Lagom/Tools/CodeGenerators/LibTimeZone/GenerateTimeZoneData.cpp66
-rw-r--r--Userland/Libraries/CMakeLists.txt1
-rw-r--r--Userland/Libraries/LibTimeZone/CMakeLists.txt8
8 files changed, 184 insertions, 6 deletions
diff --git a/Meta/CMake/common_options.cmake b/Meta/CMake/common_options.cmake
index 15f2d2a4b6..3a1f9ef409 100644
--- a/Meta/CMake/common_options.cmake
+++ b/Meta/CMake/common_options.cmake
@@ -9,5 +9,6 @@ serenity_option(ENABLE_ALL_THE_DEBUG_MACROS OFF CACHE BOOL "Enable all debug mac
serenity_option(ENABLE_ALL_DEBUG_FACILITIES OFF CACHE BOOL "Enable all noisy debug symbols and options. Not recommended for normal developer use")
serenity_option(ENABLE_COMPILETIME_HEADER_CHECK OFF CACHE BOOL "Enable compiletime check that each library header compiles stand-alone")
+serenity_option(ENABLE_TIME_ZONE_DATABASE_DOWNLOAD ON CACHE BOOL "Enable download of the IANA Time Zone Database at build time")
serenity_option(ENABLE_UNICODE_DATABASE_DOWNLOAD ON CACHE BOOL "Enable download of Unicode UCD and CLDR files at build time")
serenity_option(INCLUDE_WASM_SPEC_TESTS OFF CACHE BOOL "Download and include the WebAssembly spec testsuite")
diff --git a/Meta/CMake/time_zone_data.cmake b/Meta/CMake/time_zone_data.cmake
new file mode 100644
index 0000000000..09a6c2bbc2
--- /dev/null
+++ b/Meta/CMake/time_zone_data.cmake
@@ -0,0 +1,88 @@
+include(${CMAKE_CURRENT_LIST_DIR}/utils.cmake)
+
+set(TZDB_PATH "${CMAKE_BINARY_DIR}/TZDB" CACHE PATH "Download location for TZDB files")
+
+set(TZDB_VERSION 2021e)
+set(TZDB_VERSION_FILE "${TZDB_PATH}/version.txt")
+
+set(TZDB_ZIP_URL "https://data.iana.org/time-zones/releases/tzdata${TZDB_VERSION}.tar.gz")
+set(TZDB_ZIP_PATH "${TZDB_PATH}/tzdb.tar.gz")
+
+set(TZDB_AFRICA_SOURCE africa)
+set(TZDB_AFRICA_PATH "${TZDB_PATH}/${TZDB_AFRICA_SOURCE}")
+
+set(TZDB_ANTARCTICA_SOURCE antarctica)
+set(TZDB_ANTARCTICA_PATH "${TZDB_PATH}/${TZDB_ANTARCTICA_SOURCE}")
+
+set(TZDB_ASIA_SOURCE asia)
+set(TZDB_ASIA_PATH "${TZDB_PATH}/${TZDB_ASIA_SOURCE}")
+
+set(TZDB_AUSTRALASIA_SOURCE australasia)
+set(TZDB_AUSTRALASIA_PATH "${TZDB_PATH}/${TZDB_AUSTRALASIA_SOURCE}")
+
+set(TZDB_ETCETERA_SOURCE etcetera)
+set(TZDB_ETCETERA_PATH "${TZDB_PATH}/${TZDB_ETCETERA_SOURCE}")
+
+set(TZDB_EUROPE_SOURCE europe)
+set(TZDB_EUROPE_PATH "${TZDB_PATH}/${TZDB_EUROPE_SOURCE}")
+
+set(TZDB_NORTH_AMERICA_SOURCE northamerica)
+set(TZDB_NORTH_AMERICA_PATH "${TZDB_PATH}/${TZDB_NORTH_AMERICA_SOURCE}")
+
+set(TZDB_SOUTH_AMERICA_SOURCE southamerica)
+set(TZDB_SOUTH_AMERICA_PATH "${TZDB_PATH}/${TZDB_SOUTH_AMERICA_SOURCE}")
+
+function(extract_tzdb_file source path)
+ if(EXISTS "${TZDB_ZIP_PATH}" AND NOT EXISTS "${path}")
+ message(STATUS "Extracting TZDB ${source} from ${TZDB_ZIP_PATH}...")
+ execute_process(COMMAND tar -C "${TZDB_PATH}" -xf "${TZDB_ZIP_PATH}" "${source}" RESULT_VARIABLE tar_result)
+ if (NOT tar_result EQUAL 0)
+ message(FATAL_ERROR "Failed to unzip ${source} from ${TZDB_ZIP_PATH} with status ${tar_result}")
+ endif()
+ endif()
+endfunction()
+
+if (ENABLE_TIME_ZONE_DATABASE_DOWNLOAD)
+ remove_path_if_version_changed("${TZDB_VERSION}" "${TZDB_VERSION_FILE}" "${TZDB_PATH}")
+
+ if (NOT EXISTS "${TZDB_ZIP_PATH}")
+ message(STATUS "Downloading time zone database from ${TZDB_ZIP_URL}...")
+ file(DOWNLOAD "${TZDB_ZIP_URL}" "${TZDB_ZIP_PATH}" INACTIVITY_TIMEOUT 10)
+ endif()
+
+ extract_tzdb_file("${TZDB_AFRICA_SOURCE}" "${TZDB_AFRICA_PATH}")
+ extract_tzdb_file("${TZDB_ANTARCTICA_SOURCE}" "${TZDB_ANTARCTICA_PATH}")
+ extract_tzdb_file("${TZDB_ASIA_SOURCE}" "${TZDB_ASIA_PATH}")
+ extract_tzdb_file("${TZDB_AUSTRALASIA_SOURCE}" "${TZDB_AUSTRALASIA_PATH}")
+ extract_tzdb_file("${TZDB_ETCETERA_SOURCE}" "${TZDB_ETCETERA_PATH}")
+ extract_tzdb_file("${TZDB_EUROPE_SOURCE}" "${TZDB_EUROPE_PATH}")
+ extract_tzdb_file("${TZDB_NORTH_AMERICA_SOURCE}" "${TZDB_NORTH_AMERICA_PATH}")
+ extract_tzdb_file("${TZDB_SOUTH_AMERICA_SOURCE}" "${TZDB_SOUTH_AMERICA_PATH}")
+
+ set(TIME_ZONE_DATA_HEADER LibTimeZone/TimeZoneData.h)
+ set(TIME_ZONE_DATA_IMPLEMENTATION LibTimeZone/TimeZoneData.cpp)
+
+ set(TIME_ZONE_META_TARGET_PREFIX LibTimeZone_)
+
+ if (CMAKE_CURRENT_BINARY_DIR MATCHES ".*/LibTimeZone") # Serenity build.
+ set(TIME_ZONE_DATA_HEADER TimeZoneData.h)
+ set(TIME_ZONE_DATA_IMPLEMENTATION TimeZoneData.cpp)
+
+ set(TIME_ZONE_META_TARGET_PREFIX "")
+ endif()
+
+ invoke_generator(
+ "TimeZoneData"
+ Lagom::GenerateTimeZoneData
+ "${TZDB_VERSION_FILE}"
+ "${TIME_ZONE_META_TARGET_PREFIX}"
+ "${TIME_ZONE_DATA_HEADER}"
+ "${TIME_ZONE_DATA_IMPLEMENTATION}"
+ arguments "${TZDB_AFRICA_PATH}" "${TZDB_ANTARCTICA_PATH}" "${TZDB_ASIA_PATH}" "${TZDB_AUSTRALASIA_PATH}" "${TZDB_ETCETERA_PATH}" "${TZDB_EUROPE_PATH}" "${TZDB_NORTH_AMERICA_PATH}" "${TZDB_SOUTH_AMERICA_PATH}"
+ )
+
+ set(TIME_ZONE_DATA_SOURCES
+ ${TIME_ZONE_DATA_HEADER}
+ ${TIME_ZONE_DATA_IMPLEMENTATION}
+ )
+endif()
diff --git a/Meta/Lagom/CMakeLists.txt b/Meta/Lagom/CMakeLists.txt
index 66b39722e4..b8ef9cc400 100644
--- a/Meta/Lagom/CMakeLists.txt
+++ b/Meta/Lagom/CMakeLists.txt
@@ -216,6 +216,11 @@ function(lagom_test source)
)
endfunction()
+if (NOT TARGET all_generated)
+ # Meta target to run all code-gen steps in the build.
+ add_custom_target(all_generated)
+endif()
+
# AK/Core
# Note: AK is included in LagomCore for the host build instead of LibC per the target build
file(GLOB AK_SOURCES CONFIGURE_DEPENDS "../../AK/*.cpp")
@@ -240,6 +245,19 @@ if (APPLE)
target_link_options(LagomMain PRIVATE -undefined dynamic_lookup)
endif()
+# TimeZone
+# This is needed even if Lagom is not enabled because it is depended upon by code generators.
+if (NOT ENABLE_OSS_FUZZ AND NOT ENABLE_FUZZER_SANITIZER)
+ include(time_zone_data)
+else()
+ set(ENABLE_TIME_ZONE_DATABASE_DOWNLOAD OFF)
+endif()
+file(GLOB LIBTIMEZONE_SOURCES CONFIGURE_DEPENDS "../../Userland/Libraries/LibTimeZone/*.cpp")
+lagom_lib(TimeZone timezone
+ SOURCES ${LIBTIMEZONE_SOURCES} ${TIME_ZONE_DATA_SOURCES}
+)
+target_compile_definitions(LagomTimeZone PRIVATE ENABLE_TIME_ZONE_DATA=$<BOOL:${ENABLE_TIME_ZONE_DATABASE_DOWNLOAD}>)
+
# Manually install AK headers
install(
DIRECTORY "${SERENITY_PROJECT_ROOT}/AK"
@@ -255,12 +273,6 @@ if (NOT ENABLE_OSS_FUZZ AND NOT ENABLE_FUZZER_SANITIZER)
endif()
if (BUILD_LAGOM)
-
- if (NOT TARGET all_generated)
- # Meta target to run all code-gen steps in the build.
- add_custom_target(all_generated)
- endif()
-
# Lagom Libraries
# Archive
diff --git a/Meta/Lagom/Tools/CodeGenerators/CMakeLists.txt b/Meta/Lagom/Tools/CodeGenerators/CMakeLists.txt
index f5b0b36493..66d33a0599 100644
--- a/Meta/Lagom/Tools/CodeGenerators/CMakeLists.txt
+++ b/Meta/Lagom/Tools/CodeGenerators/CMakeLists.txt
@@ -1,4 +1,5 @@
add_subdirectory(IPCCompiler)
+add_subdirectory(LibTimeZone)
add_subdirectory(LibUnicode)
add_subdirectory(LibWeb)
add_subdirectory(StateMachineGenerator)
diff --git a/Meta/Lagom/Tools/CodeGenerators/LibTimeZone/CMakeLists.txt b/Meta/Lagom/Tools/CodeGenerators/LibTimeZone/CMakeLists.txt
new file mode 100644
index 0000000000..585526d535
--- /dev/null
+++ b/Meta/Lagom/Tools/CodeGenerators/LibTimeZone/CMakeLists.txt
@@ -0,0 +1 @@
+lagom_tool(GenerateTimeZoneData SOURCES GenerateTimeZoneData.cpp LIBS LagomMain)
diff --git a/Meta/Lagom/Tools/CodeGenerators/LibTimeZone/GenerateTimeZoneData.cpp b/Meta/Lagom/Tools/CodeGenerators/LibTimeZone/GenerateTimeZoneData.cpp
new file mode 100644
index 0000000000..27e304af35
--- /dev/null
+++ b/Meta/Lagom/Tools/CodeGenerators/LibTimeZone/GenerateTimeZoneData.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2022, Tim Flynn <trflynn89@pm.me>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <AK/SourceGenerator.h>
+#include <AK/String.h>
+#include <AK/StringBuilder.h>
+#include <AK/Vector.h>
+#include <LibCore/ArgsParser.h>
+#include <LibCore/File.h>
+
+static void generate_time_zone_data_header(Core::File& file)
+{
+ StringBuilder builder;
+ SourceGenerator generator { builder };
+
+ generator.append(R"~~~(
+#pragma once
+)~~~");
+
+ VERIFY(file.write(generator.as_string_view()));
+}
+
+static void generate_time_zone_data_implementation(Core::File& file)
+{
+ StringBuilder builder;
+ SourceGenerator generator { builder };
+
+ generator.append(R"~~~(
+#include <LibTimeZone/TimeZoneData.h>
+)~~~");
+
+ VERIFY(file.write(generator.as_string_view()));
+}
+
+ErrorOr<int> serenity_main(Main::Arguments arguments)
+{
+ StringView generated_header_path;
+ StringView generated_implementation_path;
+ Vector<StringView> time_zone_paths;
+
+ Core::ArgsParser args_parser;
+ args_parser.add_option(generated_header_path, "Path to the time zone data header file to generate", "generated-header-path", 'h', "generated-header-path");
+ args_parser.add_option(generated_implementation_path, "Path to the time zone data implementation file to generate", "generated-implementation-path", 'c', "generated-implementation-path");
+ args_parser.add_positional_argument(time_zone_paths, "Paths to the time zone database files", "time-zone-paths");
+ args_parser.parse(arguments);
+
+ auto open_file = [&](StringView path) -> ErrorOr<NonnullRefPtr<Core::File>> {
+ if (path.is_empty()) {
+ args_parser.print_usage(stderr, arguments.argv[0]);
+ return Error::from_string_literal("Must provide all command line options"sv);
+ }
+
+ return Core::File::open(path, Core::OpenMode::ReadWrite);
+ };
+
+ auto generated_header_file = TRY(open_file(generated_header_path));
+ auto generated_implementation_file = TRY(open_file(generated_implementation_path));
+
+ generate_time_zone_data_header(generated_header_file);
+ generate_time_zone_data_implementation(generated_implementation_file);
+
+ return 0;
+}
diff --git a/Userland/Libraries/CMakeLists.txt b/Userland/Libraries/CMakeLists.txt
index d4b07ee80e..6c36935270 100644
--- a/Userland/Libraries/CMakeLists.txt
+++ b/Userland/Libraries/CMakeLists.txt
@@ -46,6 +46,7 @@ add_subdirectory(LibSystem)
add_subdirectory(LibTest)
add_subdirectory(LibTextCodec)
add_subdirectory(LibThreading)
+add_subdirectory(LibTimeZone)
add_subdirectory(LibTLS)
add_subdirectory(LibUnicode)
add_subdirectory(LibUSBDB)
diff --git a/Userland/Libraries/LibTimeZone/CMakeLists.txt b/Userland/Libraries/LibTimeZone/CMakeLists.txt
new file mode 100644
index 0000000000..2053b93ef3
--- /dev/null
+++ b/Userland/Libraries/LibTimeZone/CMakeLists.txt
@@ -0,0 +1,8 @@
+include(${SerenityOS_SOURCE_DIR}/Meta/CMake/time_zone_data.cmake)
+
+if (DEFINED TIME_ZONE_DATA_SOURCES)
+ set(SOURCES ${TIME_ZONE_DATA_SOURCES})
+ serenity_lib(LibTimeZoneData timezonedata)
+ target_compile_options(LibTimeZoneData PRIVATE -g0 -Os)
+ target_link_libraries(LibTimeZoneData LibCore)
+endif()