summaryrefslogtreecommitdiff
path: root/Meta/CMake
diff options
context:
space:
mode:
authorTimothy Flynn <trflynn89@pm.me>2021-12-22 16:33:38 -0500
committerLinus Groh <mail@linusgroh.de>2022-01-08 12:45:34 +0100
commit8669b25cea5be5f88caf8a1d6b1c89d3ff29f041 (patch)
tree624fb537d06d721f022de70912df6c2444db5671 /Meta/CMake
parent9ba386a7bbe978702174df45e19e0a4fd14e77b9 (diff)
downloadserenity-8669b25cea5be5f88caf8a1d6b1c89d3ff29f041.zip
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.
Diffstat (limited to 'Meta/CMake')
-rw-r--r--Meta/CMake/common_options.cmake1
-rw-r--r--Meta/CMake/time_zone_data.cmake88
2 files changed, 89 insertions, 0 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()