Roman Yakovenko wrote:
> Hi. It seems that I cannot to find answer for pretty simple question:
> how I can invoke native build system from\using CMake?
Short answer is that you invoke the native build system as usual (make,
nmake, etc).

Find attached a wrapper bash script I am using for cmake and normal
Makefiles. 
It automatically creates out-of-source builds when run under cmake.
For running it on windows, you will need something like cygwin or MSYS
(for bash+uname), albeit it will probably not work as is, as I need to
update the -m32/-m64 flags for VC8 (which I don't have).

For docs, run:

> mk -h

PS.  If you do any improvements to it, send me a patch.

-- 
Gonzalo Garramuño
[EMAIL PROTECTED]

AMD4400 - ASUS48N-E
GeForce7300GT
Kubuntu Edgy


#!/bin/bash --norc


#
# Determine CPU architecture
#
KERNEL=`uname -s`
RELEASE=`uname -r`
export CMAKE_BUILD_ARCH=32
export CMAKE_BUILD_TYPE=Release
arch=`uname -a`

if [[ $arch == *x86_64* ]]; then
    CMAKE_BUILD_ARCH=64
else
    if [[ $arch == *ia64* ]]; then
        CMAKE_BUILD_ARCH=64
    fi
fi


OS=$KERNEL-$RELEASE


usage()
{
    echo $0
    echo ""
    echo "$0 [options] [--] [make options]"
    echo ""
    echo "Wrapper around CMake to easily create out of source"
    echo "builds (ie. compilations where everything goes into"
    echo "a BUILD/OS-VERSION-\$CMAKE_BUILD_TYPE-\$CMAKE_BUILD_ARCH directory."
    echo ""
    echo "For this platform (default settings): "
    echo "  BUILD/$OS-$CMAKE_BUILD_TYPE-$CMAKE_BUILD_ARCH"
    echo ""
    echo "It must be run from a directory with a valid CMakeLists.txt"
    echo "file outside of the build tree."
    echo ""
    echo "Options:"
    echo ""
    echo "  -q         quiet build"
    echo "  -j N       number of cpus to use (default: ${CMAKE_PROCS=4})"
    echo ""
    echo "  debug|release|reldebug|small"
    echo "  debug    - build a debug build"
    echo "  release  - build a release build (default)"
    echo "  reldebug - build a release build with debug information"
    echo "  small    - build a small release build"
    echo ""
    echo "  clean    - Cleans Makefile and CMakeCache.txt"
    echo ""
    echo "  both|32|64"
    echo "             Builds both 32/64 bit versions, 32-bit only, "
    echo "             64-bit only (default: $CMAKE_BUILD_ARCH)"
    echo ""
    exit 1
}

#
# Parse command-line options
#

clean=0
opts='VERBOSE=1'
while [ $# -gt 0 ]; do
    case $1 in
        clean)
            shift
            if [ -r CMakeLists.txt ]; then
                if [ -d BUILD ]; then
                    clean=1
                fi
            fi
            ;;
        debug)
            shift
            export CMAKE_BUILD_TYPE=Debug
            ;;
        release)
            shift
            export CMAKE_BUILD_TYPE=Release
            ;;
        small)
            shift
            export CMAKE_BUILD_TYPE=MinSizeRel
            ;;
        both)
            shift
            CMAKE_BUILD_ARCH='Both'
            ;;
        64)
            shift
            CMAKE_BUILD_ARCH=64
            export LDFLAGS=
            export CXXFLAGS=
            ;;
        32)
            shift
            CMAKE_BUILD_ARCH=32
            export LDFLAGS=-m32
            export CXXFLAGS=-m32
            ;;
        -h)
            shift
            usage
            ;;
        --help)
            shift
            usage
            ;;
        -j)
            shift
            if [ $# == 0 ]; then
                echo "Missing parameter for -j!"
                usage
            fi
            CMAKE_PROCS=$1
            shift
            ;;
        -q)
            shift
            opts=""
            ;;
        --)
            shift
            break
            ;;
        *)
            break
            ;;
    esac
done

#
# Simple function to run a command and print it out
#
run_cmd()
{
    echo
    echo "> $*"
    echo
    command $*
}

#
# Function to just run make on a dir with a Makefile
#
run_make()
{
    cmd=''
    if [[ $KERNEL == *CYGWIN* ]]; then
        cmd="nmake $"@
    else
        cmd="make -j ${CMAKE_PROCS=4} $@"
    fi
    run_cmd $cmd
}

#
# Function to run cmake and then run make on generated Makefile
#
run_cmake()
{
    builddir=$OS-$CMAKE_BUILD_TYPE-$CMAKE_BUILD_ARCH
    echo "Buildir ${builddir}"
    if [ ! -d $builddir ]; then
        cmd="mkdir $builddir $builddir/bin $builddir/lib"
        run_cmd $cmd
    fi


    cd $builddir

    cmd="cmake ../.. -DEXECUTABLE_OUTPUT_PATH=$PWD/bin 
-DLIBRARY_OUTPUT_PATH=$PWD/lib -DCMAKE_LIBRARY_PATH=$PWD/lib 
-DCMAKE_BUILD_ARCH=$CMAKE_BUILD_ARCH -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE"

    run_cmd  $cmd
    run_make $@

    cd ..
}

#
# Function used to clean the build directory and exit
#
run_clean()
{
    builddir=$OS-$CMAKE_BUILD_TYPE-$CMAKE_BUILD_ARCH
    echo "Cleaned BUILD/$builddir"
    rm -rf BUILD/$builddir
    exit 0
}


#
# Main routine
#
if [ $clean == 1 ]; then
    run_clean
fi

if [ -r Makefile ]; then
    run_make $opts $@
else

    if [ ! -r CMakeLists.txt ]; then
        usage
    fi

    if [ ! -d BUILD ]; then
        mkdir BUILD
    fi

    cd BUILD

    if [ $CMAKE_BUILD_ARCH == 'Both' ]; then
        export CMAKE_BUILD_ARCH=32
        run_cmake $opts $@
        export CMAKE_BUILD_ARCH=64
        run_cmake $opts $@
    else
        run_cmake $opts $@
    fi
fi
_______________________________________________
CMake mailing list
CMake@cmake.org
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to