blob: 39bd52fe796149ba567be2d7d6f28916db3b3e5e [file]
#!/bin/bash
# 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.
function resolve_symlink() {
# get passed file
local toResolve="$1"
while [ -h "$toResolve" ]; do
ls=`ls -ld "$toResolve"`
link=`expr "$ls" : '^.*-> \(.*\)$' 2>/dev/null`
if expr "$link" : '^/' 2> /dev/null >/dev/null; then
# this is absolute path
toResolve="$link"
else
# this is relative path
toResolve="`dirname "$toResolve"`/$link"
fi
done
echo $toResolve
}
function absolute_dir() {
# get passed directory
local inDir="$1"
# remember current dir
local oldDir=`pwd`
# get the resolved dir
cd $inDir
local resolvedDir=`pwd`
# restore dir
cd $oldDir
echo $resolvedDir
}
function sys_includes() {
local lang="$1"
# extract predefined system include directories
local sys_incl=`g++ -E -v -x ${lang} /dev/null 2>&1 | awk '\
BEGIN { cnt=0; inside = 0; } \
/#include "..." search starts here:/ { inside = 1; } \
/#include <...> search starts here:/ { inside = 1; } \
/End of search list/ { inside = 0; } \
/^[^#].*/ { if( inside ) print $1 }'`
echo ${sys_incl}
}
function header_files() {
local folder="${1}"
local direct_headers=`find ${folder} -type f | grep -v "/bits/"`
local headers="$direct_headers"
echo ${headers}
}
function symlinks_in_dir() {
local folder="${1}"
local sym_links=`find ${folder} -type l -a ! -name "*.h"`
local out_dirs=""
for link in $sym_links; do
local resolved_link=`resolve_symlink $link`
if [ -d $resolved_link ]; then
resolved_link=`absolute_dir $resolved_link`
out_dirs=`echo $out_dirs $resolved_link`
fi
done
echo $out_dirs
}
function add_headers() {
local incl_dir=$1
local out_file=$2
echo adding headers of directory $incl_dir
local headers=`header_files ${incl_dir}`
for header in $headers; do
echo "#include <${header}>" >> $out_file
done
}
function create_include_file_for_language() {
local lang="${1-c++}"
local out_file="${2-out_file.cpp}"
local sys_includes=`sys_includes ${lang}`
echo "/* this is generated file of all system includes for --${lang}-- */" > $out_file
for incl_dir in $sys_includes; do
echo "/* headers from ${incl_dir} */" >> $out_file
incl_dir=`resolve_symlink $incl_dir`
echo "/* include directory was resoved into ${incl_dir} */" >> $out_file
add_headers "${incl_dir}" "$out_file"
local link_dirs=`symlinks_in_dir $incl_dir`
if [ -n "$link_dirs" ]; then
echo symlinked content of $incl_dir is "$link_dirs"
for link_dir in $link_dirs; do
echo "/* symlinked include directory was resoved into ${link_dir} */" >> $out_file
add_headers "${link_dir}" "$out_file"
done
fi
done
}
echo C++ includes
out_cpp_file="${1-out_file.cpp}"
create_include_file_for_language c++ $out_cpp_file
#echo C includes
#out_c_file="${2-out_file.c}"
#create_include_file_for_language c $out_c_file