[CMake] Build only what you need in third party libs

David Cole david.cole at kitware.com
Fri Jan 29 16:20:52 EST 2010


On Fri, Jan 29, 2010 at 4:07 PM, Brian Davis <bitminer at gmail.com> wrote:

> ExternalProject_Add does not like BINARY_DIR same for multiple packages...
> Why?
>

To avoid one package's output from clobbering another package's output. For
CMake built projects, for example, the BINARY_DIR is where CMakeCache.txt
ends up. There can only be one CMakeCache.txt in a directory, so there can
only be one project for each BINARY_DIR.



> SET( THIRD_PARTY_PACKAGES
>     vtk-5.4.2
>     dcmtk-3.5.4
>
>     boost-cmake-1_41_0
> )
>
> foreach( PACKAGE in ${THIRD_PARTY_PACKAGES} )
>
>     ExternalProject_Add(
>         ${PACKAGE}
>         DOWNLOAD_COMMAND ""
>         SOURCE_DIR ${TOP}/source/cpp/lib/3rdParty/Win/${PACKAGE}
>         BINARY_DIR ${BUILD_DIR}/ouput/bin
>         INSTALL_DIR ${INSTALL_PREFIX}
>     )
>
> endforeach( PACKAGE )
>

Instead of "BINARY_DIR ${BUILD_DIR}/ouput/bin", try:

        BINARY_DIR ${BUILD_DIR}/${PACKAGE}


from VS Studio I get:
>
> 1>1>CMake Error at cmake_install.cmake:31 (FILE):
> 1>1>  file cannot create directory: C:/Program Files (x86)/VTK/lib/vtk-5.4.
>
> and reading http:///www.kitware.com/products/archive/*
> kitware_quarterly1009*.*pdf* excerpt:
>
>
> Install step
> The INSTALL_DIR is underneath the calling project’s binary
> directory. Use INSTALL_DIR to specify a different location.
> Note that in addition to setting INSTALL_DIR, you also have
> to pass -DCMAKE_INSTALL_PREFIX or --prefix to the CMake
> or configure command. It is not used automatically in the
> configure step since not all projects follow this convention.
>
> # [INSTALL_DIR dir]
>
>
> My projects must fall into the "not all projects follow this convention",
> but wait Kitware makes vtk and Kitware makes Cmake.  Is Kitware not
> following it's own convention here or is something else going on?
>

"Kitware projects" are built with CMake and all use CMAKE_INSTALL_PREFIX to
determine the install directory. You should use CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX}
for "Kitware projects"



>
> I also get when I build dcmtk:
>
> 1>CMake Error: The source
> "C:/projects/NIH2009/source/branches/trunk/source/cpp/lib/3rdParty/Win/dcmtk-3.5.4/CMakeLists.txt"
> does not match the source
> "C:/projects/NIH2009/source/branches/trunk/source/cpp/lib/3rdParty/Win/vtk-5.4.2/CMakeLists.txt"
> used to generate cache.  Re-run cmake with a different source directory.
>


> Looks like there is some CMake cache cross mojonation going on here


This is because of using the same BINARY_DIR for multiple
ExternalProject_Add calls.



> I guess I'll try:
>
>     ExternalProject_Add(
>         ${PACKAGE}
>         DOWNLOAD_COMMAND ""
>         SOURCE_DIR ${TOP}/source/cpp/lib/3rdParty/Win/${PACKAGE}
> #        BINARY_DIR ${BUILD_DIR}/ouput/bin
>         INSTALL_DIR ${INSTALL_PREFIX}
>         CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX}
>     )
>
> as:
>
> C:\projects\NIH2009\source\branches\trunk\platform\tools\cmake-2.8.0-win32-x86\bin>cmake
> --help-module ExternalProject
>
> cmake version 2.8.0
>   ExternalProject
>        Create custom targets to build projects in external trees
>
>        The 'ExternalProject_Add' function creates a custom target to drive
>        download, update/patch, configure, build, install and test steps of
> an
>        external project:
>
>          ExternalProject_Add(<name>    # Name for custom target
>            [DEPENDS projects...]       # Targets on which the project
> depends
>            [PREFIX dir]                # Root dir for entire project
>            [LIST_SEPARATOR sep]        # Sep to be replaced by ; in cmd
> lines
>            [TMP_DIR dir]               # Directory to store temporary files
>            [STAMP_DIR dir]             # Directory to store step timestamps
>           #--Download step--------------
>            [DOWNLOAD_DIR dir]          # Directory to store downloaded
> files
>            [DOWNLOAD_COMMAND cmd...]   # Command to download source tree
>            [CVS_REPOSITORY cvsroot]    # CVSROOT of CVS repository
>            [CVS_MODULE mod]            # Module to checkout from CVS repo
>            [CVS_TAG tag]               # Tag to checkout from CVS repo
>            [SVN_REPOSITORY url]        # URL of Subversion repo
>            [SVN_REVISION rev]          # Revision to checkout from
> Subversion repo
>            [URL /.../src.tgz]          # Full path or URL of source
>           #--Update/Patch step----------
>            [UPDATE_COMMAND cmd...]     # Source work-tree update command
>            [PATCH_COMMAND cmd...]      # Command to patch downloaded source
>           #--Configure step-------------
>            [SOURCE_DIR dir]            # Source dir to be used for build
>            [CONFIGURE_COMMAND cmd...]  # Build tree configuration command
>            [CMAKE_COMMAND /.../cmake]  # Specify alternative cmake
> executable
>            [CMAKE_GENERATOR gen]       # Specify generator for native build
>            [CMAKE_ARGS args...]        # Arguments to CMake command line
>           #--Build step-----------------
>            [BINARY_DIR dir]            # Specify build dir location
>            [BUILD_COMMAND cmd...]      # Command to drive the native build
>            [BUILD_IN_SOURCE 1]         # Use source dir for build dir
>           #--Install step---------------
>            [INSTALL_DIR dir]           # Installation prefix
>            [INSTALL_COMMAND cmd...]    # Command to drive install after
> build
>           #--Test step---------------
>            [TEST_BEFORE_INSTALL 1]     # Add test step executed before
> install step
>            [TEST_AFTER_INSTALL 1]      # Add test step executed after
> install step
>            [TEST_COMMAND cmd...]       # Command to drive test
>            )
>
>        The *_DIR options specify directories for the project, with default
>        directories computed as follows.  If the PREFIX option is given to
>        ExternalProject_Add() or the EP_PREFIX directory property is set,
> then
>        an external project is built and installed under the specified
> prefix:
>
>           TMP_DIR      = <prefix>/tmp
>           STAMP_DIR    = <prefix>/src/<name>-stamp
>           DOWNLOAD_DIR = <prefix>/src
>           SOURCE_DIR   = <prefix>/src/<name>
>           BINARY_DIR   = <prefix>/src/<name>-build
>           INSTALL_DIR  = <prefix>
>
>        Otherwise, if the EP_BASE directory property is set then components
> of
>        an external project are stored under the specified base:
>
>           TMP_DIR      = <base>/tmp/<name>
>           STAMP_DIR    = <base>/Stamp/<name>
>           DOWNLOAD_DIR = <base>/Download/<name>
>           SOURCE_DIR   = <base>/Source/<name>
>           BINARY_DIR   = <base>/Build/<name>
>           INSTALL_DIR  = <base>/Install/<name>
>
>        If no PREFIX, EP_PREFIX, or EP_BASE is specified then the default is
>        to set PREFIX to "<name>-prefix".  Relative paths are interpreted
> with
>        respect to the build directory corresponding to the source directory
>        in which ExternalProject_Add is invoked.
>
>        If SOURCE_DIR is explicitly set to an existing directory the project
>        will be built from it.  Otherwise a download step must be specified
>        using one of the DOWNLOAD_COMMAND, CVS_*, SVN_*, or URL options.
> The
>        URL option may refer locally to a directory or source tarball, or
>        refer to a remote tarball (e.g.  http://.../src.tgz).
>
>        The 'ExternalProject_Add_Step' function adds a custom step to an
>        external project:
>
>          ExternalProject_Add_Step(<name> <step> # Names of project and
> custom step
>            [COMMAND cmd...]        # Command line invoked by this step
>            [COMMENT "text..."]     # Text printed when step executes
>            [DEPENDEES steps...]    # Steps on which this step depends
>            [DEPENDERS steps...]    # Steps that depend on this step
>            [DEPENDS files...]      # Files on which this step depends
>            [ALWAYS 1]              # No stamp file, step always runs
>            [WORKING_DIRECTORY dir] # Working directory for command
>            )
>
>        The command line, comment, and working directory of every standard
> and
>        custom step is processed to replace tokens <SOURCE_DIR>,
> <BINARY_DIR>,
>        <INSTALL_DIR>, and <TMP_DIR> with corresponding property values.
>
>        The 'ExternalProject_Get_Property' function retrieves external
> project
>        target properties:
>
>          ExternalProject_Get_Property(<name> [prop1 [prop2 [...]]])
>
>        It stores property values in variables of the same name.  Property
>        names correspond to the keyword argument names of
>        'ExternalProject_Add'.
>
>
>        Defined in:
> C:/projects/NIH2009/source/branches/trunk/platform/tools/cmake-2.8.0-win32-x86/share/cmake-2.8/Modules/ExternalProject.cmake
>
> Leads me to believe that I should use CMAKE_ARGS
>
>

Is it getting any easier yet...?

Hopefully this is helpful,
David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20100129/b8be463a/attachment.htm>


More information about the CMake mailing list