| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- #! /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()
- {
- if [ "${OS}" = "Linux" ]; 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"
- 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} ./${OUTPUT_DIR}/eng -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}"
- 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/;/\n{\n\treturn;\n}\n\n/g};p' >> ${WRAPPERS_DIR}/wrapper.c
- else
- echo "${FUNC_DEC}" | sed -n '/;/{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}
|