112 lines
3.1 KiB
Bash
112 lines
3.1 KiB
Bash
|
#!/usr/bin/env bash
|
||
|
# tools/process_config.sh
|
||
|
#
|
||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||
|
# contributor license agreements. See the NOTICE file distributed with
|
||
|
# this work for additional information regarding copyright ownership. The
|
||
|
# ASF licenses this file to you 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.
|
||
|
#
|
||
|
|
||
|
process_file() {
|
||
|
local output_file="$1"
|
||
|
local input_file="$2"
|
||
|
local include_paths=("${!3}")
|
||
|
|
||
|
while IFS= read -r line || [ -n "$line" ]
|
||
|
do
|
||
|
if [[ $line == \#include* ]]; then
|
||
|
local include_file=$(echo $line | sed -E 's/#include [<"](.+)[">]/\1/')
|
||
|
local found=false
|
||
|
|
||
|
# Check current directory first
|
||
|
|
||
|
if [ -f $include_file ]; then
|
||
|
process_file $output_file $include_file include_paths[@]
|
||
|
found=true
|
||
|
else
|
||
|
# Then check in the include paths
|
||
|
|
||
|
for path in "${include_paths[@]}"; do
|
||
|
local full_path="$path/$include_file"
|
||
|
if [ -f $full_path ]; then
|
||
|
process_file $output_file $full_path include_paths[@]
|
||
|
found=true
|
||
|
break
|
||
|
fi
|
||
|
done
|
||
|
fi
|
||
|
|
||
|
# Configuration file not found
|
||
|
|
||
|
if [ "$found" = false ]; then
|
||
|
echo "ERROR: Can't find \"$include_file\" in current directory or search paths."
|
||
|
rm $output_file
|
||
|
exit 1
|
||
|
fi
|
||
|
else
|
||
|
echo "$line" >> $output_file
|
||
|
fi
|
||
|
done < "$input_file"
|
||
|
}
|
||
|
|
||
|
usage() {
|
||
|
echo "Usage: $0 [OPTIONS] [INPUT_FILE]"
|
||
|
echo " -h display this help"
|
||
|
echo " -I include path, can be specified multiple times"
|
||
|
echo " -o output file"
|
||
|
echo " [INPUT_FILE] the file to be processed"
|
||
|
}
|
||
|
|
||
|
while [[ $# -gt 0 ]]
|
||
|
do
|
||
|
key="$1"
|
||
|
|
||
|
case $key in
|
||
|
-I)
|
||
|
INCLUDE_PATHS+=("$2")
|
||
|
shift
|
||
|
shift
|
||
|
;;
|
||
|
-o)
|
||
|
OUTPUT_FILE="$2"
|
||
|
shift
|
||
|
shift
|
||
|
;;
|
||
|
*)
|
||
|
if [ -z "$INPUT_FILE" ]; then
|
||
|
INPUT_FILE="$1"
|
||
|
shift
|
||
|
else
|
||
|
echo "Error: Multiple input files specified"
|
||
|
usage
|
||
|
exit 1
|
||
|
fi
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
if [ -z "$INPUT_FILE" ]; then
|
||
|
echo "Error: Input file not specified"
|
||
|
usage
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
if [ -z "$OUTPUT_FILE" ]; then
|
||
|
echo "Error: Output file not specified"
|
||
|
usage
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
echo "" > $OUTPUT_FILE
|
||
|
process_file "$OUTPUT_FILE" "$INPUT_FILE" INCLUDE_PATHS[@]
|