#!/usr/bin/env bash # Copyright 2020 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Fail fast on any error. set -e if [ -z ${ANDROID_BUILD_TOP} ]; then echo \$ANDROID_BUILD_TOP must be set. exit 1 fi SYSTEM_TIMEZONE_DIR=$(realpath ${ANDROID_BUILD_TOP}/system/timezone) GEOTZ_DIR=$(realpath ${ANDROID_BUILD_TOP}/packages/modules/GeoTZ) DATA_PIPELINE_DIR=${GEOTZ_DIR}/data_pipeline TZBB_DATA_DIR=${GEOTZ_DIR}/tzbb_data WORKING_DIR_ROOT=${DATA_PIPELINE_DIR}/working_dir OUTPUT_DATA_DIR=${GEOTZ_DIR}/output_data/odbl # # Hardcoded values that can be changed for debugging / dev to speed things up. # # Change this to a lower level to speed up S2 sampling. S2_LEVEL=12 # Set to 1 to skip the initial build step if no code changes are being made. SKIP_BUILD=0 # Set to 1 to skip to a later step. See also ALLOW_WORKING_DIR_ROOT_EXISTS. # Set to 1 ignore if the output dir exists. Use with SKIP_TO_STEP to resume a # failed run. Most steps discover what to do by inspecting the names of files so # be careful not to skip to step with no output data available. SKIP_TO_STEP=0 ALLOW_WORKING_DIR_ROOT_EXISTS=0 # Only process a subset of zone IDs from the geojson input file. # Must be comma separated, no spaces. # Do not use with SKIP_TO_STEP > 1 as it will have no effect. # Be careful with this and ALLOW_WORKING_DIR_ROOT_EXISTS=1 as that can leave STEP1 # output files from previous runs, which will then be processed by STEP2. STEP1_RESTRICT_TO_ZONES= if [ -d ${WORKING_DIR_ROOT} ]; then echo Working dir ${WORKING_DIR_ROOT} exists... if (( ${ALLOW_WORKING_DIR_ROOT_EXISTS} == 0 )); then echo Halting... echo Remove or move ${WORKING_DIR_ROOT} and try again. exit 1 fi fi MAX_STEP_ID=7 if (( ${SKIP_TO_STEP} > ${MAX_STEP_ID} )); then echo Cannot skip to step ${SKIP_TO_STEP} exit 1 fi JAVA_ARGS="-J-Xmx32G" STEP1_TARGET=geotz_geojsontz_to_tzs2polygons STEP1_CMD="${STEP1_TARGET} ${JAVA_ARGS}" STEP1_THREAD_COUNT=10 STEP1_WORKING_DIR=${WORKING_DIR_ROOT}/tzs2polygons STEP2_TARGET=geotz_canonicalize_tzs2polygons STEP2_CMD="${STEP2_TARGET} ${JAVA_ARGS}" STEP2_TZIDS_FILE=${SYSTEM_TIMEZONE_DIR}/output_data/android/tzids.prototxt STEP2_REPLACEMENT_THREADHOLD=2020-01-01T00:00:00.00Z STEP2_WORKING_DIR=${WORKING_DIR_ROOT}/canonicalized_tzs2polygons STEP3_TARGET=geotz_tzs2polygons_to_tzs2cellunions STEP3_CMD="${STEP3_TARGET} ${JAVA_ARGS}" STEP3_THREAD_COUNT=5 STEP3_WORKING_DIR=${WORKING_DIR_ROOT}/tzs2cellunions_l${S2_LEVEL} STEP4_TARGET=geotz_tzs2cellunions_to_tzs2ranges STEP4_CMD="${STEP4_TARGET} ${JAVA_ARGS}" STEP4_THREAD_COUNT=10 STEP4_WORKING_DIR=${WORKING_DIR_ROOT}/tzs2ranges_l${S2_LEVEL} STEP5_TARGET=geotz_mergetzs2ranges STEP5_CMD="${STEP5_TARGET} ${JAVA_ARGS}" STEP5_THREAD_COUNT=5 STEP5_WORKING_DIR=${WORKING_DIR_ROOT}/mergedtzs2ranges_l${S2_LEVEL} STEP5_OUTPUT_FILE=${STEP5_WORKING_DIR}/mergedtzs2ranges${S2_LEVEL}.prototxt STEP6_TARGET=geotz_createtzs2fileinput STEP6_CMD="${STEP6_TARGET} ${JAVA_ARGS}" STEP6_OUTPUT_FILE=${WORKING_DIR_ROOT}/tzs2fileinput/tzs2fileinput${S2_LEVEL}.prototxt STEP7_TARGET=geotz_createtzs2file STEP7_CMD="${STEP7_TARGET} ${JAVA_ARGS}" STEP7_OUTPUT_FILE=${OUTPUT_DATA_DIR}/tzs2.dat BUILD_TARGETS=(\ ${STEP1_TARGET} \ ${STEP2_TARGET} \ ${STEP3_TARGET} \ ${STEP4_TARGET} \ ${STEP5_TARGET} \ ${STEP6_TARGET} \ ${STEP7_TARGET} \ ) echo ${0} starting at $(date --iso-8601=seconds) mkdir -p ${WORKING_DIR_ROOT} # Build all step commands if (( ${SKIP_BUILD} == 1 )); then echo Skipping build step... else BUILD_CMD="${ANDROID_BUILD_TOP}/build/soong/soong_ui.bash --make-mode -j30" LOG_FILE=${WORKING_DIR_ROOT}/build.log echo Building step commands. Logging to ${LOG_FILE} ... { ${BUILD_CMD} ${BUILD_TARGETS[@]} } &> ${LOG_FILE} fi # Step 0: Preparation, unpack the geojson file into the working dir. ZIPPED_BOUNDARY_FILE=${TZBB_DATA_DIR}/timezones.geojson.zip echo Starting step 0 if (( ${SKIP_TO_STEP} <= 0 )); then mkdir ${WORKING_DIR_ROOT}/dist echo Unpacking ${ZIPPED_BOUNDARY_FILE} to ${WORKING_DIR_ROOT}/dist/... unzip -o ${TZBB_DATA_DIR}/timezones.geojson.zip -d ${WORKING_DIR_ROOT}/dist/ # Ensure there's a LICENSE next to the boundary file. It will be copied # alongside data by subsequent steps. echo Copying LICENSE file to ${WORKING_DIR_ROOT}/dist/ cp ${TZBB_DATA_DIR}/LICENSE ${WORKING_DIR_ROOT}/dist/ else echo Skipping... fi echo Completed step 0 UNZIPPED_BOUNDARY_FILE=${WORKING_DIR_ROOT}/dist/combined.json if [ ! -f ${UNZIPPED_BOUNDARY_FILE} ]; then echo "${UNZIPPED_BOUNDARY_FILE} not found" exit 1 fi # Step 1 echo Starting step 1 if (( ${SKIP_TO_STEP} <= 1 )); then mkdir -p ${STEP1_WORKING_DIR} LOG_FILE=${WORKING_DIR_ROOT}/step1.log echo Logging to ${LOG_FILE} ... { ${STEP1_CMD} \ --geo-json ${UNZIPPED_BOUNDARY_FILE} \ --num-threads ${STEP1_THREAD_COUNT} \ --output ${STEP1_WORKING_DIR} \ --tz-ids "${STEP1_RESTRICT_TO_ZONES}" } &> ${LOG_FILE} else echo Skipping... fi echo Completed step 1 # Step 2 echo Starting step 2 if (( ${SKIP_TO_STEP} <= 2 )); then mkdir -p ${STEP2_WORKING_DIR} LOG_FILE=${WORKING_DIR_ROOT}/step2.log echo Logging to ${LOG_FILE} ... { ${STEP2_CMD} \ --input ${STEP1_WORKING_DIR} \ --tz-ids ${STEP2_TZIDS_FILE} \ --replacement-threshold ${STEP2_REPLACEMENT_THREADHOLD} \ --output ${STEP2_WORKING_DIR} } &> ${LOG_FILE} else echo Skipping... fi echo Completed step 2 # Step 3 echo Starting step 3 if (( ${SKIP_TO_STEP} <= 3 )); then mkdir -p ${STEP3_WORKING_DIR} LOG_FILE=${WORKING_DIR_ROOT}/step3.log echo Logging to ${LOG_FILE} ... { ${STEP3_CMD} \ --input ${STEP2_WORKING_DIR} \ --num-threads ${STEP3_THREAD_COUNT} \ --output ${STEP3_WORKING_DIR} \ --max-s2-level ${S2_LEVEL} } &> ${LOG_FILE} else echo Skipping... fi echo Completed step 3 # Step 4 echo Starting step 4 if (( ${SKIP_TO_STEP} <= 4 )); then mkdir -p ${STEP4_WORKING_DIR} LOG_FILE=${WORKING_DIR_ROOT}/step4.log echo Logging to ${LOG_FILE} ... { ${STEP4_CMD} \ --input ${STEP3_WORKING_DIR} \ --num-threads ${STEP4_THREAD_COUNT} \ --output ${STEP4_WORKING_DIR} \ --s2-level ${S2_LEVEL} } &> ${LOG_FILE} else echo Skipping... fi echo Completed step 4 # Step 5 echo Starting step 5 if (( ${SKIP_TO_STEP} <= 5 )); then mkdir -p ${STEP5_WORKING_DIR} LOG_FILE=${WORKING_DIR_ROOT}/step5.log echo Logging to ${LOG_FILE} ... { ${STEP5_CMD} \ --input ${STEP4_WORKING_DIR} \ --num-threads ${STEP5_THREAD_COUNT} \ --working-dir ${STEP5_WORKING_DIR} \ --output-file ${STEP5_OUTPUT_FILE} } &> ${LOG_FILE} else echo Skipping... fi echo Completed step 5 # Step 6 echo Starting step 6 if (( ${SKIP_TO_STEP} <= 6 )); then LOG_FILE=${WORKING_DIR_ROOT}/step6.log echo Logging to ${LOG_FILE} ... { ${STEP6_CMD} \ --input-file ${STEP5_OUTPUT_FILE} \ --output-file ${STEP6_OUTPUT_FILE} } 2>&1 > ${LOG_FILE} else echo Skipping... fi echo Completed step 6 # Step 7 echo Starting step 7 if (( ${SKIP_TO_STEP} <= 7 )); then LOG_FILE=${WORKING_DIR_ROOT}/step7.log echo Logging to ${LOG_FILE} ... mkdir -p $(dirname ${STEP7_OUTPUT_FILE}) { ${STEP7_CMD} \ --input-file ${STEP6_OUTPUT_FILE} \ --s2-level ${S2_LEVEL} \ --output-file ${STEP7_OUTPUT_FILE} } 2>&1 > ${LOG_FILE} else echo Skipping... fi echo Completed step 7 echo Output files can be found in ${OUTPUT_DATA_DIR} echo ${0} completed at $(date --iso-8601=seconds)