[CMake] [CPACK] Create package from multiple builds and project configurations

Tristan Carel tristan.carel at gmail.com
Sun Aug 12 12:37:40 EDT 2007


Hi,

I am  convince that to  reign, you have  to divide, but it  is definitly
easier for  users to get a  all-in-one package, specific  to the desired
architecture.

I have  a C++ library,  whose build is managed by CMake,  and I want
to  provide build packages for Linux, Darwin, and Windows.
For each architecture, I want to provide both the `release' and `debug'
version of this library.  I  can also choose either the STLPort library
or the STL embedded with the C++ compiler.
It makes  4 different  builds  on each architecture  and the  aim here
is to  get 1  `build' package per architecture

Under Linux and Darwin, thanks to the CPack variable
`CPACK_INSTALL_CMAKE_PROJECTS', it just has been a piece of cake.

On both computers, I  use the  "Unix Makefiles"  generator to  create
4 different builds:

CMAKE_BINARY_DIR                          CMAKE_BUILD_TYPE
/tmp/helloWorld/_build/Release             Release
/tmp/helloWorld/_build/Debug               Debug
/tmp/helloWorld/_build/Release_stlport     Release
/tmp/helloWorld/_build/Release_stlport     Debug

Then I just create a custom CPackConfig.cmake with among other SET commands:
# -----------------------------------------------------------------------------
SET(CPACK_INSTALL_CMAKE_PROJECTS
 "/tmp/helloWorld/_build/Release;helloWorld;ALL;/"
 "/tmp/helloWorld/_build/Release_stlport;helloWorld;ALL;/"
 "/tmp/helloWorld/_build/Debug;helloWorld;ALL;/"
 "/tmp/helloWorld/_build/Debug_stlport;helloWorld;ALL;/"
)
# -----------------------------------------------------------------------------

Then the  command below builds a wonderful package:
$ cpack --config CPackConfig.cmake

Everything is fine, except that I have to manually check that any file
written in the temporary installation directory is overwritten by the next
installation steps. With huge projects, it can be very annoying. Maybe warnings
would be pleasant is this case.

Before starting with the Windows mess, I need you to validate something
I am hesitant about:
The  `Unix   Makefiles'  generator  can  be  considered   as  a  `static
generator',   in  a   sense   that  the   configuration   is  known   at
`configure-time'. And that is why:
1. The command below looks at me, laugh and ignore the variable
$ make CMAKE_BUILD_TYPE=Debug all
2. The  command below  completly stifle  by  my impudence,  which is  a
consequence of the first point (CPack uses CMake install mechanism).
$ cpack -C Debug --config CPackConfig.cmake

Am I right?



Now let's talk about the funny part ... Windows!

If I  am still  right, "NMake Makefiles"  and "Visual .."   are `dynamic
generators'  as the  build  configuration is  determined at  build
time.
On this platform, I have only 2 different CMake builds:

c:/helloWorld/_build/msvc8
c:/helloWorld/_build/msvc8_stlport

(I could  also chose to make  only 1 build with  the four configurations
all-in-one)

The CPackConfig.cmake contains:
SET(CPACK_INSTALL_CMAKE_PROJECTS
 "c:/helloWorld/_build/msvc8;helloWorld;ALL;/"
 "c:/helloWorld/_build/msvc8_stlport;helloWorld;ALL;/"
)

Then, as I use a `dynamic generator', I don't have any other choice than
to specify to CPack the configuration to install:
$ cpack -C Debug --config CPackConfig.cmake

But, as CPack removes the  temporary installation directory each time you
run  the commands,  we can't  build a  package with  both  `Release' and
`Debug' build configurations, can we?

I have looked  under each documentation's stones, check  the bug tracker
but  found  nothing  about  it.  The  mailing-list  archive  contains  a
workaround, `usable' but not `checkinable'.

I guess a clean way to handle this would be to make CPack accepts a list
of configurations  (via the -C command  line option) and  install all of
them  in  the  temporary  install  directory before  running  the  CPack
generators.
You can find a patch in  attachment which implement the feature.
@Maintainers: I would be glad  to see it in  CMake some day. If  interested,
I can  help you to make this happen soon.

So right  now, it  works pretty  well, modulo the  patch (but  modulo is
still better than division :)

$ cpack -C "Release;Debug" --config CPackConfig.cmake
builds the Windows package with the expected content!

Thx for these amazing tools!
-- 
Tristan Carel
Music with dinner is an insult both to the cook and the violinist.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cpack-multiple-configurations.diff
Type: application/octet-stream
Size: 5562 bytes
Desc: not available
Url : http://public.kitware.com/pipermail/cmake/attachments/20070812/e22c7687/cpack-multiple-configurations.obj


More information about the CMake mailing list