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

Brian Davis bitminer at gmail.com
Fri Jan 29 16:07:28 EST 2010


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

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 )

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?


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

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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20100129/02c94cc3/attachment-0001.htm>


More information about the CMake mailing list