
sample: examples\aliyun_iotkit_csdk_mqtt project: board\TencentOS_tiny_EVB_MX_Plus\KEIL\aliyun_iotkit_csdk_mqtt
400 lines
12 KiB
Bash
400 lines
12 KiB
Bash
#! /bin/bash
|
|
|
|
# LOCK_PATTERN=bash_lock
|
|
# LOCK_FILE=${LOCK_PATTERN}.$$
|
|
|
|
# cleanup ()
|
|
# {
|
|
# rm -f ${LOCK_FILE}
|
|
# }
|
|
|
|
# trap cleanup EXIT
|
|
|
|
# if [ "$(ls ${LOCK_PATTERN}.* 2>/dev/null)" = "" ];then
|
|
# echo "LOCK" > ${LOCK_FILE}
|
|
# else
|
|
# echo "Another Extract Script Is Running, Exit..."
|
|
# exit
|
|
# fi
|
|
|
|
env_check()
|
|
{
|
|
CHECK_OS=$(uname -r | grep 'ali')
|
|
if [ "${OS}" = "Linux" ] && [ "${CHECK_OS}" = "" ]; then
|
|
export PATH=tools/prebuilt/ubuntu/bin:${PATH}
|
|
fi
|
|
gawk --help > /dev/null 2>&1
|
|
if [ "$?" != "0" ];then
|
|
echo "Please install gawk, using sudo apt-get install gawk for ubuntu 16.04"
|
|
exit
|
|
fi
|
|
}
|
|
|
|
extract_from_cloud()
|
|
{
|
|
OS=$(uname)
|
|
EXTRACT_ID=$(curl --connect-timeout 5 -sF "file=@make.settings" --url https://linkkit.aliyuncs.com/upload/config?pk=a1AuWIoEr4Z\&os=${OS})
|
|
# echo ${EXTRACT_ID}
|
|
RETRY_COUNT=0
|
|
if [ "${EXTRACT_ID}" != "" ];then
|
|
echo ". Download request sent, waiting respond ..."
|
|
sleep 2
|
|
|
|
while :
|
|
do
|
|
DOWNLOAD_FILE=$(curl -s --connect-timeout 5 https://linkkit.aliyuncs.com/get/linkkit?extractId=${EXTRACT_ID})
|
|
# echo ${DOWNLOAD_FILE}
|
|
|
|
if [ "${DOWNLOAD_FILE}" = "404" ] || [ "${DOWNLOAD_FILE}" = "" ];then
|
|
break
|
|
|
|
elif [ "${DOWNLOAD_FILE}" = "406" ];then
|
|
echo ". Respond generating, wait longer"
|
|
|
|
if [ "${RETRY_COUNT}" = "20" ];then
|
|
break
|
|
fi
|
|
|
|
RETRY_COUNT=$[RETRY_COUNT+1]
|
|
|
|
echo ". Retried ${RETRY_COUNT}/20"
|
|
sleep 2
|
|
|
|
else
|
|
|
|
echo ""
|
|
curl ${DOWNLOAD_FILE} > output.zip
|
|
rm -rf output
|
|
unzip -q output.zip
|
|
rm -rf output.zip
|
|
echo ""
|
|
echo "Please pick up extracted source files in [${PWD}/${OUTPUT_DIR}]"
|
|
echo ""
|
|
# rm -rf ${LOCK_FILE}
|
|
exit
|
|
fi
|
|
done
|
|
fi
|
|
}
|
|
|
|
OS="$(uname)"
|
|
|
|
if [ "${OS}" = "Linux" ]; then
|
|
FIND="find -L"
|
|
else
|
|
FIND="find"
|
|
fi
|
|
|
|
OUTPUT_DIR=output
|
|
INFRA_DIR=${OUTPUT_DIR}/eng/infra
|
|
WRAPPERS_DIR=${OUTPUT_DIR}/eng/wrappers
|
|
|
|
XTRC_FILE_RULS=./tools/misc/xtrc_file_rules
|
|
TEMP_FILE_RULS="${PWD}/.temp_file_rule_filter"
|
|
|
|
XTRC_WRAPPER_RULS=./tools/misc/xtrc_wrapper_rules
|
|
TEMP_WRAPPER_RULS="${PWD}/.temp_wrapper_rule_filter"
|
|
WRAPPER_DOC=./tools/misc/wrapper
|
|
|
|
# Try Extract Linkkit From Cloud
|
|
#
|
|
if [ "$1" = "" ] || ( [ "$1" != "test" ] && [ "$1" != "local" ] ) then
|
|
extract_from_cloud
|
|
fi
|
|
|
|
# environment check
|
|
env_check
|
|
|
|
# Prepare Config Macro In make.settings
|
|
MACRO_LIST=$(sed -n '/#/!{/=y/p}' make.settings | sed -n 's/=y//gp' | sed -n 's/FEATURE_//gp')
|
|
|
|
mkdir -p ${OUTPUT_DIR} ${OUTPUT_DIR}/examples
|
|
rm -rf $(${FIND} ${OUTPUT_DIR} -mindepth 1 -maxdepth 1|grep -v release)
|
|
|
|
# Generate infra_config.h and extract necessary infra files
|
|
mkdir -p ${INFRA_DIR}
|
|
echo "#ifndef _INFRA_CONFIG_H_" > ${INFRA_DIR}/infra_config.h
|
|
echo -e "#define _INFRA_CONFIG_H_\n" >> ${INFRA_DIR}/infra_config.h
|
|
echo "${MACRO_LIST}" | sed -n 's/^/#define /p' >> ${INFRA_DIR}/infra_config.h
|
|
echo -e "\n#endif" >> ${INFRA_DIR}/infra_config.h
|
|
|
|
${FIND} ./src -name "infra_types.h" | xargs -i cp -f {} ${INFRA_DIR}
|
|
${FIND} ./src -name "infra_defs.[ch]" | xargs -i cp -f {} ${INFRA_DIR}
|
|
${FIND} ./src -name "infra_list.h" | xargs -i cp -f {} ${INFRA_DIR}
|
|
${FIND} ./src -name "infra_compat.[ch]" | xargs -i cp -f {} ${INFRA_DIR}
|
|
|
|
# echo -e "${MACRO_LIST}"
|
|
|
|
cond_and_check()
|
|
{
|
|
COND_AND_VAR=$(echo $1 | gawk -F '&' '{for(i=1;i<=NF;i++){print $i;}}')
|
|
# echo "${COND_AND_VAR}"
|
|
for item in ${COND_AND_VAR}
|
|
do
|
|
echo ${MACRO_LIST} | grep -wo ${item} > /dev/null
|
|
if [ $? -ne 0 ];then
|
|
return 1
|
|
fi
|
|
done
|
|
return 0
|
|
}
|
|
|
|
cond_not_check()
|
|
{
|
|
COND_NOT_VAR=$(echo $1 | gawk -F '&' '{for(i=1;i<=NF;i++){print $i;}}')
|
|
# echo "${COND_AND_VAR}"
|
|
for item in ${COND_NOT_VAR}
|
|
do
|
|
echo ${MACRO_LIST} | grep -wo ${item} > /dev/null
|
|
if [ $? -eq 0 ];then
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
DOTS_LINE=".................................................................."
|
|
|
|
extract_file_by()
|
|
{
|
|
local rule="$*"
|
|
|
|
COND_AND=$(echo $rule | gawk -F'|' '{print $1}')
|
|
COND_NOT=$(echo $rule | gawk -F'|' '{print $2}')
|
|
SRC_DIR=$(echo $rule | gawk -F'|' '{print $3}')
|
|
DEST_DIR=$(echo $rule | gawk -F'|' '{print $4}')
|
|
|
|
# echo "${COND_AND}"
|
|
cond_and_check "${COND_AND}"
|
|
if [ $? -ne 0 ]; then
|
|
return 1
|
|
fi
|
|
|
|
# echo "${COND_NOT}"
|
|
cond_not_check "${COND_NOT}"
|
|
if [ $? -eq 0 ]; then
|
|
return 1
|
|
fi
|
|
|
|
# echo "${SRC_DIR}"
|
|
# echo "${DEST_DIR}"
|
|
|
|
if [ "${DEST_DIR}" != "" ];then
|
|
mkdir -p ${DEST_DIR} && ${FIND} ${SRC_DIR} -maxdepth 1 -name *.[ch] | xargs -i cp -rf {} ${DEST_DIR}
|
|
fi
|
|
}
|
|
|
|
echo ""
|
|
echo "Analysing extract rules for sources and wrappers ..."
|
|
echo ""
|
|
|
|
SWITCHES=$(cat make.settings | grep -v '^#' | sed '/^$/d;s:FEATURE_::g;s:=.*::g')
|
|
SWCH_PAT="$(echo ${SWITCHES}|sed 's: :\\\|:g')"
|
|
SPEC_PAT="$(echo ${SWITCHES}|sed 's:\([_A-Z]*\) :^\1||\\\|:g')"
|
|
SPEC_PAT="${SPEC_PAT}||"
|
|
|
|
grep ${SWCH_PAT} ${XTRC_FILE_RULS} > ${TEMP_FILE_RULS}
|
|
grep ${SWCH_PAT} ${XTRC_WRAPPER_RULS} > ${TEMP_WRAPPER_RULS}
|
|
|
|
FUNC_NAME_LIST=""
|
|
HEADER_FILE_LIST=""
|
|
|
|
FUNC_NAME_LIST=$(grep "${SPEC_PAT}" ${TEMP_WRAPPER_RULS}|gawk -F '|' '{ print $3 }'|sort -u)
|
|
HEADER_FILE_LIST=$(grep "${SPEC_PAT}" ${TEMP_WRAPPER_RULS}|gawk -F '|' '{ print $4 }'|sort -u)
|
|
|
|
FUNC_PAT="$(echo ${FUNC_NAME_LIST}|sed 's: :\\\|:g')"
|
|
HDER_PAT="$(echo ${HEADER_FILE_LIST}|sed 's: :\\\|:g')"
|
|
|
|
# [ "${FUNC_PAT}" != "" ] && sed -i "/${FUNC_PAT}/d" ${TEMP_WRAPPER_RULS}
|
|
# [ "${HDER_PAT}" != "" ] && sed -i "/${HDER_PAT}/d" ${TEMP_WRAPPER_RULS}
|
|
|
|
#if [ "${FUNC_PAT}" != "" ] && [ "${HDER_PAT}" != "" ]; then
|
|
# sed -i "/${FUNC_PAT}/{/${HDER_PAT}/d}" ${TEMP_WRAPPER_RULS}
|
|
#fi
|
|
|
|
printf "Interpret [%03d] sources rules" $(cat ${TEMP_FILE_RULS}|wc -l|sed 's/[[:space:]]//g')
|
|
printf " from [%03d] base\n" $(cat ${XTRC_FILE_RULS}|wc -l|sed 's/[[:space:]]//g')
|
|
|
|
printf "Interpret [%03d] wrapper rules" $(cat ${TEMP_WRAPPER_RULS}|wc -l|sed 's/[[:space:]]//g')
|
|
printf " from [%03d] base" $(cat ${XTRC_WRAPPER_RULS}|wc -l|sed 's/[[:space:]]//g')
|
|
|
|
echo ""
|
|
|
|
FUNC_NAME_LIST="$(echo ${FUNC_NAME_LIST}|tr ' ' '\n')\n"
|
|
HEADER_FILE_LIST="$(echo ${HEADER_FILE_LIST}|tr ' ' '\n')\n"
|
|
|
|
FUNC_NAME_LIST=""
|
|
HEADER_FILE_LIST=""
|
|
|
|
echo ""
|
|
# Read xtrc_file_rules
|
|
TOTAL_ITERATION=$(wc -l ${TEMP_FILE_RULS}|gawk '{ print $1 }')
|
|
ITER=0
|
|
|
|
while read rule
|
|
do
|
|
ITER=$(( ${ITER} + 1 ))
|
|
printf "\r%.40s %.2f%%" "Extract Files ${DOTS_LINE}" $(echo 100*${ITER}/${TOTAL_ITERATION}|bc -l)
|
|
TEST=$(echo $rule | gawk -F'|' '{print NF}')
|
|
if [ ${TEST} -ne 4 ];then
|
|
continue
|
|
fi
|
|
|
|
if [ "${OS}" = "Linux" ]; then
|
|
extract_file_by ${rule} &
|
|
else
|
|
extract_file_by ${rule}
|
|
fi
|
|
|
|
done < ${TEMP_FILE_RULS}
|
|
|
|
[ "${OS}" = "Linux" ] && wait
|
|
|
|
rm -f ${TEMP_FILE_RULS}
|
|
echo -e ""
|
|
|
|
# Generate wrapper.c
|
|
mkdir -p ${WRAPPERS_DIR}
|
|
cp -f wrappers/wrappers_defs.h ${WRAPPERS_DIR}/
|
|
|
|
# Read xtrc_wrapper_rules
|
|
TOTAL_ITERATION=$(wc -l ${TEMP_WRAPPER_RULS}|gawk '{ print $1 }')
|
|
ITER=0
|
|
|
|
while read rule
|
|
do
|
|
ITER=$(( ${ITER} + 1 ))
|
|
printf "\r%.40s %.2f%%" "Extract HAL/Wrapper Functions ${DOTS_LINE}" $(echo 100*${ITER}/${TOTAL_ITERATION}|bc -l)
|
|
TEST=$(echo $rule | gawk -F'|' '{print NF}')
|
|
if [ ${TEST} -ne 4 ];then
|
|
continue
|
|
fi
|
|
|
|
COND_AND=$(echo $rule | gawk -F'|' '{print $1}')
|
|
COND_NOT=$(echo $rule | gawk -F'|' '{print $2}')
|
|
FUNC_NAME=$(echo $rule | gawk -F'|' '{print $3}')
|
|
HEADER_FILE=$(echo $rule | gawk -F'|' '{print $4}')
|
|
|
|
# echo "${COND_AND}"
|
|
cond_and_check "${COND_AND}"
|
|
if [ $? -ne 0 ];then
|
|
continue
|
|
fi
|
|
|
|
# echo "${COND_NOT}"
|
|
cond_not_check "${COND_NOT}"
|
|
if [ $? -eq 0 ];then
|
|
continue
|
|
fi
|
|
|
|
if [ "${FUNC_NAME}" != "" ];then
|
|
FUNC_NAME_LIST="${FUNC_NAME_LIST}""${FUNC_NAME}\n"
|
|
fi
|
|
if [ "${HEADER_FILE}" != "" ];then
|
|
HEADER_FILE_LIST="${HEADER_FILE_LIST}""${HEADER_FILE}\n"
|
|
fi
|
|
done < ${TEMP_WRAPPER_RULS}
|
|
rm -f ${TEMP_WRAPPER_RULS}
|
|
|
|
echo -e ""
|
|
|
|
FUNC_NAME_LIST=$(echo -e "${FUNC_NAME_LIST}" | sed -n '/^$/!{p}' | sort -u)
|
|
HEADER_FILE_LIST=$(echo -e "${HEADER_FILE_LIST}" | sed -n '/^$/!{p}' | sort -u)
|
|
|
|
# For Debug
|
|
if [ "${FUNC_NAME_LIST}" != "" ];then
|
|
echo -e "\nHAL/Wrapper Function List:" && echo -e "${FUNC_NAME_LIST}" |gawk '{ printf("%03d %s\n", NR, $0); }'
|
|
fi
|
|
|
|
if [ "${HEADER_FILE_LIST}" != "" ];then
|
|
echo -e "\nHAL/Wrapper Header File List:" && echo -e "${HEADER_FILE_LIST}" |gawk '{ printf("%03d %s\n", NR, $0); }'
|
|
fi
|
|
|
|
# Annotation For wrapper.c
|
|
sed -n '/WRAPPER_NOTE:/{:a;N;/*\//!ba;p}' ${WRAPPER_DOC} | sed -n '1d;p' >> ${WRAPPERS_DIR}/wrapper.c
|
|
|
|
# Output Header File Into wrapper.c
|
|
echo -e "#include \"infra_types.h\"" >> ${WRAPPERS_DIR}/wrapper.c
|
|
echo -e "#include \"infra_defs.h\"" >> ${WRAPPERS_DIR}/wrapper.c
|
|
echo -e "#include \"infra_compat.h\"" >> ${WRAPPERS_DIR}/wrapper.c
|
|
echo -e "#include \"wrappers_defs.h\"" >> ${WRAPPERS_DIR}/wrapper.c
|
|
echo -e "${HEADER_FILE_LIST}" | sed -n '/.h/{s/^/#include "/p}' | sed -n 's/$/"/p' >> ${WRAPPERS_DIR}/wrapper.c
|
|
echo -e "" >> ${WRAPPERS_DIR}/wrapper.c
|
|
|
|
# Generate Default Implenmentation For HAL/Wrapper Function
|
|
echo ""
|
|
TOTAL_ITERATION=$(echo "${FUNC_NAME_LIST}"|wc -w|sed 's/[[:space:]]//g')
|
|
ITER=0
|
|
|
|
for func in $(echo "${FUNC_NAME_LIST}")
|
|
do
|
|
ITER=$(( ${ITER} + 1 ))
|
|
printf "\r%.40s %.2f%%" "Generate wrapper.c ${DOTS_LINE}" $(echo 100*${ITER}/${TOTAL_ITERATION}|bc -l)
|
|
|
|
# echo ${func}
|
|
if [ "${func}" = "" ];then
|
|
continue
|
|
fi
|
|
|
|
FUNC_DEC=$(${FIND} ./src -name *wrapper.h | xargs -i cat {})
|
|
FUNC_DEC=$(echo "${FUNC_DEC}" | sed -n '/.*'${func}'(.*/{/.*);/ba;{:c;N;/.*);/!bc};:a;p;q}')
|
|
|
|
DATA_TYPE=$(echo "${FUNC_DEC}" | head -1 | gawk -F' ' '{if ($1~/^DLL/ || $1~/extern/) {if ($3~/*/) {print $2"*";} else {print $2;}} else {if ($2~/*/) {print $1"*";} else {print $1;}}}'# | sed s/[[:space:]]//g)
|
|
# echo -e "\n${DATA_TYPE}"
|
|
# echo -e "\n${FUNC_DEC}"
|
|
|
|
FUNC_FILE=$(grep ${func} ./wrappers/os/ubuntu/* | gawk -F':' '{print $1}' | sed -n 's/.\/wrappers\///g;s/\//\\\//g;p' | sed -n '1,1p')
|
|
if [ "${FUNC_FILE}" = "" ];then
|
|
FUNC_FILE=$(grep ${func} ./wrappers/tls/* | gawk -F':' '{print $1}' | sed -n 's/.\/wrappers\///g;s/\//\\\//g;p' | sed -n '1,1p')
|
|
fi
|
|
# echo -e "\n${FUNC_FILE}"
|
|
|
|
sed -n '/WRAPPER_FUNC_REFERENCE:/{:a;N;/*\//!ba;p}' ${WRAPPER_DOC} | sed -n '1d;s/FUNC_NAME/'${func}'/g;s/FUNC_FILE/'${FUNC_FILE}'/g;p' >> ${WRAPPERS_DIR}/wrapper.c
|
|
sed -n '/'${func}':/{:a;N;/*\//!ba;p}' ${WRAPPER_DOC} | sed -n '1d;p' >> ${WRAPPERS_DIR}/wrapper.c
|
|
|
|
if [ "${DATA_TYPE}" = "void" ];then
|
|
echo "${FUNC_DEC}" | sed -n 's/^ *//1;/;/{s/;/\n{\n\treturn;\n}\n\n/g};p' >> ${WRAPPERS_DIR}/wrapper.c
|
|
else
|
|
echo "${FUNC_DEC}" | sed -n 's/^ *//1;/;/{s/;/\n{\n\treturn ('${DATA_TYPE}')1;\n}\n\n/g};p' >> ${WRAPPERS_DIR}/wrapper.c
|
|
fi
|
|
done
|
|
|
|
if [ "${TOTAL_ITERATION}" = "0" ]; then
|
|
echo "Only [dev_sign] enabled, so NO function requires being implemented in [${WRAPPERS_DIR}/wrapper.c]"
|
|
else
|
|
echo ""
|
|
fi
|
|
|
|
echo -e "#ifndef _SDK_INCLUDE_H_" > ${OUTPUT_DIR}/eng/sdk_include.h
|
|
echo -e "#define _SDK_INCLUDE_H_\n" >> ${OUTPUT_DIR}/eng/sdk_include.h
|
|
echo -e "#include \"infra_types.h\"" >> ${OUTPUT_DIR}/eng/sdk_include.h
|
|
echo -e "#include \"infra_defs.h\"" >> ${OUTPUT_DIR}/eng/sdk_include.h
|
|
echo -e "#include \"infra_compat.h\"" >> ${OUTPUT_DIR}/eng/sdk_include.h
|
|
echo -e "#include \"wrappers_defs.h\"" >> ${OUTPUT_DIR}/eng/sdk_include.h
|
|
find ${OUTPUT_DIR}/eng -name "*wrapper.h" | gawk -F'/' '{print $NF}' | sed -n 's/^/#include "/g;s/$/"/gp' >> ${OUTPUT_DIR}/eng/sdk_include.h
|
|
find ${OUTPUT_DIR}/eng -name "*api.h" | gawk -F'/' '{print $NF}' | sed -n 's/^/#include "/g;s/$/"/gp' >> ${OUTPUT_DIR}/eng/sdk_include.h
|
|
echo -e "\n#endif" >> ${OUTPUT_DIR}/eng/sdk_include.h
|
|
|
|
# if echo "${SWITCHES}"|grep -qw "DEVICE_MODEL_ENABLED"; then
|
|
# echo ""
|
|
# bash tools/misc/compose.sh ${PWD}/output/examples/linkkit_example_auto.c
|
|
# fi
|
|
|
|
echo ""
|
|
echo "Please pick up extracted source files in [${PWD}/${OUTPUT_DIR}]"
|
|
echo ""
|
|
|
|
cp tools/misc/makefile.output output/Makefile
|
|
if [ "${1}" = "test" ];then
|
|
ENV_TEST=$(cat .config 2>/dev/null| sed -n '/VENDOR/{s/[[:space:]]//gp}'| gawk -F ':' '{print $2}')
|
|
if [ "${ENV_TEST}" = "ubuntu" ];then
|
|
rm -f ${WRAPPERS_DIR}/wrapper.c
|
|
cp -rf wrappers/os/ubuntu ${WRAPPERS_DIR}/
|
|
cp -rf wrappers/tls ${WRAPPERS_DIR}/
|
|
cp -rfl external_libs ${WRAPPERS_DIR}/
|
|
rm -f ${WRAPPERS_DIR}/ubuntu/HAL_UART_linux.c
|
|
fi
|
|
fi
|
|
|
|
# rm -rf ${LOCK_FILE}
|