utils.sh 6.7 KB
Newer Older
1 2 3 4 5
#!/usr/bin/env bash
set -e

OS=$(uname -s)

6 7 8 9 10 11 12 13 14
docker_file=""
function config_docker_file() {
    case $(uname -m) in
        x86_64) docker_file=Dockerfile ;;
        aarch64) docker_file=Dockerfile_aarch64 ;;
        *) echo "nonsupport env!!!";exit -1 ;;
    esac
}

15
function ninja_dry_run_and_check_increment() {
M
Megvii Engine Team 已提交
16
    echo "into ninja_dry_run_and_check_increment"
17 18 19 20 21 22 23 24 25
    if [ $# -eq 3 ]; then
        _BUILD_SHELL=$1
        _BUILD_FLAGS="$2 -n"
        _INCREMENT_KEY_WORDS=$3
    else
        echo "err call ninja_dry_run_and_check_increment"
        exit -1
    fi

26
    bash ${_BUILD_SHELL} ${_BUILD_FLAGS} 2>&1 | tee dry_run.log
27 28 29

    DIRTY_LOG=`cat dry_run.log`
    if [[ "${DIRTY_LOG}" =~ ${_INCREMENT_KEY_WORDS} ]]; then
M
Megvii Engine Team 已提交
30 31
        echo "DIRTY_LOG is:"
        echo ${DIRTY_LOG}
32 33 34 35 36 37 38
        echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
        echo "python3 switch increment build failed, some MR make a wrong CMakeLists.txt depends"
        echo "or build env can not find default python3 in PATH env"
        echo "please refs for PYTHON3_EXECUTABLE_WITHOUT_VERSION define at SRC_ROOT/CMakeLists.txt"
        echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
        exit -1
    fi
M
Megvii Engine Team 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

    CHECK_NINJA_DRY_ISSUE_KEY_WORDS="VerifyGlobs"
    if [[ "${DIRTY_LOG}" =~ ${CHECK_NINJA_DRY_ISSUE_KEY_WORDS} ]]; then
        echo "DIRTY_LOG is:"
        echo ${DIRTY_LOG}
        echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
        echo "python3 switch increment build failed, some MR make a wrong CMakeLists.txt"
        echo "for example use GLOB with CONFIGURE_DEPENDS flag may lead to ninja dry run failed"
        echo "about CONFIGURE_DEPENDS (please do not use it):"
        echo "a: we use scripts/cmake-build/*.sh to trigger rerun cmake, so no need CONFIGURE_DEPENDS"
        echo "b: as https://cmake.org/cmake/help/latest/command/file.html Note"
        echo "   CONFIGURE_DEPENDS do not support for all generators"
        echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
        exit -1
    fi

    # as python3 change, imperative src need rebuild, force check it!
    MUST_INCLUDE_KEY_WORDS="imperative"
    if [[ "${DIRTY_LOG}" =~ ${MUST_INCLUDE_KEY_WORDS} ]]; then
        echo "valid increment dry run log"
    else
        echo "DIRTY_LOG is:"
        echo ${DIRTY_LOG}
        echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
        echo "python3 switch increment build failed, some MR make a wrong CMakeLists.txt depends"
        echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
        exit -1
    fi
67 68 69 70 71 72 73 74 75 76 77 78
}

PYTHON_API_INCLUDES=""

function check_build_ninja_python_api() {
    INCLUDE_KEYWORD=""
    IS_MINOR_HIT=FALSE
    if [ $# -eq 1 ]; then
        ver=$1
        echo "org args: ${ver}"
        if [[ $OS =~ "NT" ]]; then
            INCLUDE_KEYWORD="${ver}\\\\include"
79
            PYTHON_API_INCLUDES="3.6.8\\\\include 3.7.7\\\\include 3.8.3\\\\include 3.9.4\\\\include 3.10.1\\\\include"
80
        elif [[ $OS =~ "Linux" ]]; then
81 82
            if which lsb_release && lsb_release -a | grep "Ubuntu"; then
                echo "into Ubuntu env"
83 84 85 86 87
                is_punctuation=${ver:4:1}
                INCLUDE_KEYWORD="include/python3.${ver:2:1}"
                if [ ${is_punctuation} = "." ]; then
                    INCLUDE_KEYWORD="include/python3.${ver:2:2}"
                fi
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
                PYTHON_API_INCLUDES="include/python3.5 include/python3.6 include/python3.7 include/python3.8 include/python3.9 include/python3.10"
            else
                echo "into manylinux env"
                ver=`echo $ver | tr -d m`
                INCLUDE_KEYWORD="include/python3.${ver:1}" # like 39/310
                info=`command -v termux-info || true`
                if [[ "${info}" =~ "com.termux" ]]; then
                    echo "find termux-info at: ${info}"
                    is_punctuation=${ver:4:1}
                    INCLUDE_KEYWORD="include/python3.${ver:2:1}"
                    if [ ${is_punctuation} = "." ]; then
                        INCLUDE_KEYWORD="include/python3.${ver:2:2}"
                    fi
                fi
                PYTHON_API_INCLUDES="include/python3.5 include/python3.6 include/python3.7 include/python3.8 include/python3.9 include/python3.10"
103
            fi
104
        elif [[ $OS =~ "Darwin" ]]; then
105
            is_punctuation=${ver:4:1}
106
            INCLUDE_KEYWORD="include/python3.${ver:2:1}"
107 108 109 110
            if [ ${is_punctuation} = "." ]; then
                INCLUDE_KEYWORD="include/python3.${ver:2:2}"
            fi
            PYTHON_API_INCLUDES="include/python3.5 include/python3.6 include/python3.7 include/python3.8 include/python3.9 include/python3.10"
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
        else
            echo "unknown OS: ${OS}"
            exit -1
        fi
    else
        echo "err call check_build_ninja_python_api"
        exit -1
    fi
    echo "try check python INCLUDE_KEYWORD: ${INCLUDE_KEYWORD} is invalid in ninja.build or not"

    NINJA_BUILD=`cat build.ninja`
    for PYTHON_API_INCLUDE in ${PYTHON_API_INCLUDES}
    do
        echo "check PYTHON_API_INCLUDE vs INCLUDE_KEYWORD : (${PYTHON_API_INCLUDE} : ${INCLUDE_KEYWORD})"
        if [ ${PYTHON_API_INCLUDE} = ${INCLUDE_KEYWORD} ]; then
            if [[ "${NINJA_BUILD}" =~ ${PYTHON_API_INCLUDE} ]]; then
                echo "hit INCLUDE_KEYWORD: ${INCLUDE_KEYWORD} in build.ninja"
                IS_MINOR_HIT="TRUE"
            else
                echo "Err happened can not find INCLUDE_KEYWORD: ${INCLUDE_KEYWORD} in build.ninja"
                exit -1
            fi
        else
            if [[ "${NINJA_BUILD}" =~ ${PYTHON_API_INCLUDE} ]]; then
                echo "Err happened: find PYTHON_API_INCLUDE: ${PYTHON_API_INCLUDE} in build.ninja"
                echo "But now INCLUDE_KEYWORD: ${INCLUDE_KEYWORD}"
                exit -1
            fi
        fi
    done

    if [ ${IS_MINOR_HIT} = "FALSE" ]; then
        echo "Err happened, can not hit any MINOR api in ninja.build"
        exit -1
    fi
}
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171

function check_python_version_is_valid() {
    want_build_version=$1
    support_version=$2
    if [ $# -eq 2 ]; then
        ver=$1
    else
        echo "err call check_python_version_is_valid"
        exit -1
    fi
    for i_want_build_version in ${want_build_version}
    do
        is_valid="false"
        for i_support_version in ${support_version}
        do
            if [ ${i_want_build_version} == ${i_support_version} ];then
                is_valid="true"
            fi
        done
        if [ ${is_valid} == "false" ];then
            echo "invalid build python version : \"${want_build_version}\", now support party of \"${support_version}\""
            exit -1
        fi
    done
}