From 8669b25cea5be5f88caf8a1d6b1c89d3ff29f041 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 22 Dec 2021 16:33:38 -0500 Subject: LibTimeZone+Meta: Add plumbing for an IANA Time Zone Database generator The IANA Time Zone Database contains data needed, at least, for various JavaScript objects. This adds plumbing for a parser and code generator for this data. The generated data will be made available by LibTimeZone, much like how UCD and CLDR data is available through LibUnicode. --- Meta/CMake/common_options.cmake | 1 + Meta/CMake/time_zone_data.cmake | 88 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 Meta/CMake/time_zone_data.cmake (limited to 'Meta/CMake') 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() -- cgit v1.2.3