[CMake] CPack and configure_file
Michael Hertling
mhertling at online.de
Tue Jan 11 10:29:19 EST 2011
On 01/11/2011 09:48 AM, Eric Noulard wrote:
> 2011/1/11 Michael Hertling <mhertling at online.de>:
>> On 01/11/2011 12:55 AM, Tobias Ellinghaus wrote:
>>>
>>> Because some information (like latest git commit as version string) is no
>>> longer available when using a source package. Of course I can put the
>>> generated files into the source tree, but that's kind of against the idea of
>>> out-of-source builds.
>>
>> You might use "cmake --build" in conjunction with a custom target:
>>
>> CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
>> PROJECT(PKGSRC NONE)
>> IF(EXISTS ${CMAKE_SOURCE_DIR}/manifest.txt)
>> # In packaged source tree.
>> FILE(COPY ${CMAKE_SOURCE_DIR}/manifest.txt
>> DESTINATION ${CMAKE_BINARY_DIR})
>> ELSE()
>> # In original source tree.
>> FILE(WRITE ${CMAKE_BINARY_DIR}/manifest.txt "...\n")
>> INCLUDE(CPack)
>> ADD_CUSTOM_TARGET(pkgsrc
>> COMMAND ${CMAKE_COMMAND}
>> -E copy ${CMAKE_BINARY_DIR}/manifest.txt
>> ${CMAKE_SOURCE_DIR}/manifest.txt
>> COMMAND ${CMAKE_COMMAND}
>> --build ${CMAKE_BINARY_DIR}
>> --target package_source
>> COMMAND ${CMAKE_COMMAND}
>> -E remove ${CMAKE_SOURCE_DIR}/manifest.txt
>> )
>> ENDIF()
>
> Nice solution.
>
>> The pkgsrc target prepares the source tree for packaging, builds the
>> source package via "cmake --build" and cleans up. AFAICS, writing to
>> the source tree is unavoidable in order to achieve your aim,
>
> in fact I think the "real" source for this is the fact the CPack lacks
> the notion
> of "EXTRA" distribution file which is available with autoconf, EXTRA_DIST var
> http://www.gnu.org/software/hello/manual/automake/Basics-of-Distribution.html
> or the dist-hook:
> http://www.gnu.org/software/hello/manual/automake/The-dist-Hook.html#The-dist-Hook
>
> The fact is CPack doesn't know much about "source package" and
> in fact it package source using the CPACK_INSTALLED_DIRECTORIES directory list.
> (look at the generated CPackSourceConfig.cmake)
>
> I think you can "emulate" the extra thing of autoconf.
> If you want ot package "more" than the source tree with
> "package_source" you can try
> the following in your main CMakeLists.txt (before include(CPack))
>
> SET(CPACK_SOURCE_INSTALLED_DIRECTORIES
> "${CMAKE_SOURCE_DIR};/;${CMAKE_BINARY_DIR}/extra;/extra")
>
> then the content of the directory
> ${CMAKE_BINARY_DIR}/extra will added in the package source archive
> inside "extra" dir.
>
> it should work.
Indeed, it does; thanks for this hint, Eric. :)
Just two remarks about that solution from my side:
1) Is it an official feature? The CPACK_SOURCE_INSTALLED_DIRECTORIES
variable is not documented anywhere and does hardly appear on the
ML or the BT, and even G**gle says that it is used rather seldom.
2) In contrast to the usual "package" target, there is no dependency
of "package_source" on "all", so one will possibly miss something
if the source package ingredients need to be set up at build time.
AFAICS, the latter can be addressed with CPACK_INSTALL_COMMANDS set to
"${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}" or whatever is necessary
to prepare the source tree for packaging, but there's no source-package
specific CPACK_SOURCE_INSTALL_COMMANDS variable or the like. Perhaps,
this is worth a feature request as concerns like the OP's one, i.e.
the addition of certain build-time generated files to the source
package, are somewhat reasonable, IMO.
Regards,
Michael
More information about the CMake
mailing list