[CMake] functions as first class objects
Michael Wild
themiwi at gmail.com
Fri Nov 13 03:58:31 EST 2009
Something like this just came up recently: http://www.cmake.org/pipermail/cmake/2009-October/032725.html
But probably it would be better to patch the subproject...
Michael
On 13. Nov, 2009, at 5:33 , David Manura wrote:
> Is there a way to redefine a built-in function but still keep around a
> reference to the original function? Example:
>
> # wrap "install" function
> function(install)
> message("hello!")
> install(${ARGV}) # original version
> endfunction()
>
> Unfortunately, in the above case, the "install" inside the function
> refers to the new version of "install", causing an infinite loop.
> There doesn't appear to be a way to save function references either:
>
> set(old_install ${install})
> old_install(FILES a DESTINATION b)
>
> Neither can I do tricks like adding a subproject that redefines
> "install" in its own scope. This still overwrites the "install" in
> the parent project.
>
> ~~~
>
> Now, the original problem I'm trying to solve is that I have project
> maintained by me that does an add_subdirectory on a project maintained
> by someone else. The subproject does things like
>
> install(FILES a.pdf DESTINATION share/doc/foo)
>
> but I'd prefer to have its files get stored in my own configurable
> installation locations, without patching the subproject. This which
> would be possible if the subproject's CMakeLists.txt did something
> like this:
>
> set(INSTALL_DOC share/doc/foo CACHE PATH "directory for
> documentation")
> install(FILES a.pdf DESTINATION ${INSTALL_DOC})
>
> where ${INSTALL_DOC} is a variable that I could redefine in the
> parent. Another option is if I could simply disable the "install"
> rules in the subproject and redefine my own in the parent project. I
> could do that via
>
> function(install)
> endfunction()
>
> but now how do I restore the original "install" function in order to
> install files in the correct locations?
>
> I also tried temporarily redefining CMAKE_INSTALL_PREFIX to a
> temporary directory, but this variable appears to be evaluated after
> all the "install" commands are processed.
>
> Recursively invoking "CMAKE_COMMAND
> -DCMAKE_INSTALL_PREFIX=${TEMPORARY_FOLDER}" on the subproject may be
> one solution, but I suspect that might be considered harmful.
>
> Maybe I should just patch the subproject. ;)
>
More information about the CMake
mailing list