summaryrefslogblamecommitdiff
path: root/scripts/include/common.sh
blob: 44310562cd063b63df0b7f8eb32c146550e2d8f1 (plain) (tree)
1
2
3
4
5
6
7
8
9

           


                             
                 


      






                                         



                                     





                                                                                    

                              
                      


                              
                      


                              
                      

      



                                                            
                  
                          
                  










                                                
                        
                                  
                                








                                                      
                  

                            
                  

 
                   
                                                         
                  

 




                                                                 
                               
                                                                               
                  

 




                                                               




                                                                 
                              
                                                                               
                  


                  
                                                               
                  


                         



                                   
                  
                  

                         

                              
               
            

 


                         

           


                  






                                                   
                        



                                   
                    
                  
                                                    
                                                          
                  
               


                    



                                   
                    
                  
                                                                               
                                                                         
                  
               


                   










                                                            
                  
           




                           
                  



                                  
                                      
                  



                                 
                                     
                  

 










                                                 

                                
                  





                                       
                  








                                       
                            
                  

 
                            








                                            
                                        
                                       
                                         
                                      



                                                 
                

 
                       




                                  



                  
                      



                                                   
                                                          



                       




                                  



                  
                      
      
                                                       

             
                                                          


                  
                      
                      




                                                                                         
                                                                                                  

                                                                                   








                                            

                  
                                 


                           

 






























                                            
                                 




                           












                                   












                                  
                             
                             


                         
                                
                                


                               
                       


                                
                               
                



                       
                      



              
















                                    
                                   

                          
 








                                                 
                                               





















                                                                                      



                    
#!/bin/bash

function check_error {
    if [ "$1" != 0 ]; then
        echo "Error detected"
        exit "$1"
    fi
}

function common_build_init {
    export dir=$(pwd)

    if [[ "${installname}" == "" ]]; then
        export installname=${package}
    fi

    if [[ "${envname}" == "" ]]; then
        export envname=${package}
    fi

    export srcdir=$(realpath "${dir}/../src/${package}")
    if [ ! -d "${srcdir}" ]; then
        echo "Error: Package sources directory not exists for package '${package}'."
        exit 3
    fi

    if [ ! -d "../env" ]; then
        mkdir -p "../env"
        check_error $?
    fi
    if [ ! -d "../bin" ]; then
        mkdir -p "../bin"
        check_error $?
    fi
    if [ ! -d "../tmp" ]; then
        mkdir -p "../tmp"
        check_error $?
    fi

    export builddir=$(realpath "${dir}/../tmp/${package}")
    export bindir=$(realpath "${dir}/../bin/${installname}")

    rm -rf "${builddir}"
    check_error $?
    mkdir -p "${builddir}"
    check_error $?
}

function common_package_init {
    export scriptsdir=$(realpath .)
    if [[ "${package}" == "" ]]; then
        echo "Error: Missing package name"
        echo "Example: ./build.sh virglrenderer"
        exit 1
    fi

    export packagefile="${package}.sh"
    export SRCTYPE="git"
    export DEFAULT_BRANCH="master"
    export AUTORECONF_FLAGS="-i"

    if [ ! -f "../packages/${packagefile}" ]; then
        echo "Error: Package '${package}' not exists."
        exit 2
    fi
}

function common_run_package {
    cd ../packages
    check_error $?
    echo "${package}.sh"
    source "./${package}.sh"
    check_error $?
}

function env_path {
    echo "export PATH=${bindir}/$1:\$PATH" >>"${envfile}"
    check_error $?
}

function env_aclocal_path {
    echo "export ACLOCAL_PATH=${bindir}/$1:\$PATH" >>"${envfile}"
    check_error $?
}

function env_lib_library_path {
    echo "export LD_LIBRARY_PATH=${bindir}/$1:\$LD_LIBRARY_PATH" >>"${envfile}"
    check_error $?
}

function env_ldflags_path {
    echo "export LDFLAGS=${bindir}/$1 \$LDFLAGS" >>"${envfile}"
    check_error $?
}

function env_cppflags_path {
    echo "export CPPFLAGS=${bindir}/$1 \$CPPFLAGS" >>"${envfile}"
    check_error $?
}

function env_pkg_config_path {
    echo "export PKG_CONFIG_PATH=${bindir}/$1:\$PKG_CONFIG_PATH" >>"${envfile}"
    check_error $?
}

function env_man {
    echo "export MANPATH=${bindir}/$1:\$MANPATH" >>"${envfile}"
    check_error $?
}

function run_autoreconf {
    flags="$*"
    if [[ "${flags}" == "" ]]; then
        flags="${AUTORECONF_FLAGS}"
    fi
    cd "${srcdir}"
    check_error $?
    echo "make distclean"
    make distclean
    echo "autoreconf ${flags}"
    autoreconf  ${flags}
    unset flags
    return 0
}

function run_src_script {
    cd "${srcdir}"
    check_error $?
    echo $@
    $@
    check_error $?
}

function run_enable_same_dir_build {
    echo "copy sources from $srcdir to ${builddir}"
    cp -r "$srcdir" "${builddir}/.."
    export srcdir="$builddir"
    echo "change src dir to $srcdir"
}

function run_configure {
    flags="$*"
    if [[ "${flags}" == "" ]]; then
        flags="${CONFIGURE_FLAGS}"
    fi
    cd "${builddir}"
    check_error $?
    echo "configure --prefix=\"${bindir}\" ${flags}"
    eval "$srcdir"/configure --prefix="${bindir}" ${flags}
    check_error $?
    unset flags
}

function run_cmake {
    flags="$*"
    if [[ "${flags}" == "" ]]; then
        flags="${CONFIGURE_FLAGS}"
    fi
    cd "${builddir}"
    check_error $?
    echo "cmake -DCMAKE_INSTALL_PREFIX:PATH=\"${bindir}\" \"$srcdir\" ${flags}"
    eval cmake -DCMAKE_INSTALL_PREFIX:PATH="${bindir}" "$srcdir" ${flags}
    check_error $?
    unset flags
}

function run_make {
    if [[ "${jobs}" == "" ]]; then
        if [ -f "/proc/cpuinfo" ]; then
            jobs="$(cat /proc/cpuinfo|grep processor|wc -l)"
        else
            jobs="1"
        fi
    fi
    j=" -j${jobs}"

    echo "make$j"
    make$j
    check_error $?
    unset j
}

function run_make_install {
    echo "make install"
    make install
    check_error $?
}

function run_git_clone {
    echo "clone git repository $1"
    git clone "$1" "../src/${package}"
    check_error $?
}

function run_hg_clone {
    echo "clone hg repository $1"
    hg clone "$1" "../src/${package}"
    check_error $?
}

function run_clone {
    if [[ "${SRCTYPE}" == "git" ]]; then
        run_git_clone $1
    elif [[ "${SRCTYPE}" == "hg" ]]; then
        run_hg_clone $1
    else
        echo "Error: unknown SRCTYPE: ${SRCTYPE}"
        exit 1
    fi
}

function run_git_switch_branch {
    cd "${srcdir}"
    check_error $?

    if [[ "${srcbranch}" == "" ]]; then
        export srcbranch="$1"
    fi
    echo "git checkout ${srcbranch}"
    git checkout "${srcbranch}"
    check_error $?
}

function run_hg_switch_branch {
    cd "${srcdir}"

    if [[ "${srcbranch}" == "" ]]; then
        export srcbranch="$1"
    fi
    echo "hg update ${srcbranch}"
    hg update "${srcbranch}"
    check_error $?
}

function run_switch_branch {
    branch="$1"
    if [[ "${DEFAULT_BRANCH}" == "" ]]; then
        echo "Error: source branch not set."
        exit 1
    fi
    if [[ "${branch}" == "" ]]; then
        branch="${DEFAULT_BRANCH}"
    fi

    if [[ "${SRCTYPE}" == "git" ]]; then
        run_git_switch_branch ${branch}
    elif [[ "${SRCTYPE}" == "hg" ]]; then
        run_hg_switch_branch ${branch}
    else
        echo "Error: unknown SRCTYPE: ${SRCTYPE}"
        exit 1
    fi
    unset branch
}

function repack_paths {
    envvar="$1"
    if [[ "$2" != "" ]]; then
        envvar="$2"
    fi
    if [[ "$envvar" == "" ]]; then
        return
    fi
    IFS=":"
    packedpaths=""
    for var in $envvar
    do
        packedpaths="${packedpaths}${bindir}/$var:"
    done
    unset IFS
    echo "export $3=\"${packedpaths}\$$3\"" >>"${envfile}"
    check_error $?
}

function repack_flags {
    envvar="$1"
    if [[ "$2" != "" ]]; then
        envvar="$2"
    fi
    if [[ "$envvar" == "" ]]; then
        return
    fi
    IFS=":"
    packedpaths=""
    for var in $envvar
    do
        packedpaths="${packedpaths}${4}${bindir}/$var "
    done
    unset IFS
    echo "export $3=\"${packedpaths}\$$3\"" >>"${envfile}"
    check_error $?
}

function package_use {
    echo "package_use"
    repack_paths "$ENV_PATH" "$OVERRIDE_ENV_PATH" "PATH"
    repack_paths "$ENV_LD_LIBRARY_PATH" "$OVERRIDE_ENV_LD_LIBRARY_PATH" "LD_LIBRARY_PATH"
    repack_paths "$ENV_PKG_CONFIG_PATH" "$OVERRIDE_ENV_PKG_CONFIG_PATH" "PKG_CONFIG_PATH"
    repack_paths "$ENV_MANPATH" "$OVERRIDE_ENV_MANPATH" "MANPATH"
    repack_paths "$ENV_ACLOCAL_PATH" "$OVERRIDE_ENV_ACLOCAL_PATH" "ACLOCAL_PATH"
    repack_paths "$ENV_LIBGL_DRIVERS_PATH" "$OVERRIDE_ENV_LIBGL_DRIVERS_PATH" "LIBGL_DRIVERS_PATH"
    repack_flags "$ENV_LDFLAGS_PATH" "$OVERRIDE_ENV_LDFLAGS_PATH" "LDFLAGS" "-L"
    repack_flags "$ENV_CPPFLAGS_PATH" "$OVERRIDE_ENV_CPPFLAGS_PATH" "CPPFLAGS" "-I"
}

function common_use_package {
    cd "${scriptsdir}"
    check_error $?
    export envfile="../env/run${envname}.sh"
    echo "#!/bin/bash" >"${envfile}"
    check_error $?
    echo "" >>"${envfile}"
    package_use
    check_error $?
    echo "\"\$@\"" >>"${envfile}"
    check_error $?
    chmod 0755 "${envfile}"
    check_error $?
}

function common_use_packages {
    cd "${scriptsdir}"
    check_error $?

    export envname="$1"
    export installname0="${installname}"
    export envfile="../env/run${envname}.sh"
    echo "#!/bin/bash" >"${envfile}"
    check_error $?
    echo "" >>"${envfile}"
    shift
    names="$*"
    IFS=" "
    for package in $names
    do
        export installname="${installname0}"
        unset ENV_PATH
        unset ENV_LD_LIBRARY_PATH
        unset ENV_PKG_CONFIG_PATH
        unset ENV_MANPATH
        unset ENV_ACLOCAL_PATH
        unset ENV_LDFLAGS_PATH
        unset ENV_CPPFLAGS_PATH

        common_package_init
        common_build_init
        common_run_package
        package_use
        check_error $?
    done
    unset IFS
    echo "\"\$@\"" >>"${envfile}"
    check_error $?
    chmod 0755 "${envfile}"
    check_error $?
}

function common_update_source_all {
    cd ../src/
    check_error $?
    files="*"
    for package in $files
    do
        cd ../scripts/
        ./updatesrc.sh $package
        check_error $?
    done
    unset files
}

function common_reset_source_all {
    cd ../src/
    check_error $?
    files="*"
    for package in $files
    do
        cd ../scripts/
        ./resetsrc.sh $package
        check_error $?
    done
    unset files
}

function package_get_source {
    echo "package_get_source"
    run_clone "${SRCURL}"
}

function package_update_source {
    echo "package_update_source"
    cd "../src/${package}"
    if [ -d .git ]; then
        echo "git fetch origin"
        git fetch --all
        check_error $?
        run_switch_branch
        echo "git pull --rebase"
        git pull --rebase --all
        return 0
    fi
    if [ -d .hg ]; then
        echo "hg pull"
        hg pull
        check_error $?
        return
    fi
}

function package_reset_source {
    echo "package_reset_source"
    cd "../src/${package}"
    if [ -d .git ]; then
        echo "git reset --hard HEAD"
        git reset --hard HEAD
        check_error $?
        return
    fi
    if [ -d .hg ]; then
        echo "hg update -C"
        hg update -C
        check_error $?
        return
    fi
}

function common_clean_destination {
    echo "clean ${bindir}"
    rm -rf "${bindir}"
}

function package_build {
    echo "package_build"
    run_switch_branch

    if [[ "$ENABLE_SAME_DIR_BUILD" != "" ]]; then
        run_enable_same_dir_build
    fi
    if [[ "$SRC_INIT_COMMAND" != "" ]]; then
        eval run_src_script "$SRC_INIT_COMMAND"
    fi

    case "$BUILD_TYPE" in
        automake)
            run_autoreconf
            run_configure
            ;;
        configure)
            run_configure
            ;;
        cmake)
            run_cmake
            ;;
        *)
            echo "Error: unknown BUILD_TYPE. Valid values: automake, configure, cmake"
            exit 1
            ;;
    esac

    run_make
    run_make_install
}

function include {
    source "./$1.sh"
}