[CMake] INSTALL CODE Error Results and Termination

Jean-Christophe Fillion-Robin jchris.fillionr at kitware.com
Wed Nov 13 15:06:47 EST 2013


Hi,

You also need to add the "if" statement into the "CODE" parameter, for
example something like this ...

install(CODE "If (NOT \${_res} EQUAL "0")
  message( FATAL_ERROR \"out: \${_out}, err: \${_err}, res: \${_res}\")
  endif()
")

To keep things simpler, you could also look at "INSTALL(SCRIPT ...)" it
would allow you to avoid escaping. You would just need to configure the
script using "configure_file".

Hth
Jc


On Wed, Nov 13, 2013 at 2:57 PM, David Hauck <davidh at netacquire.com> wrote:

> On Wednesday, November 13, 2013 11:42 AM, David Hauck wrote:
> > Hi Jean-christophe,
> >
> > On chris.fillionr at kitware.com], Jean-Christophe Fillion-Robin wrote:
> >> Hi David,
> >>
> >> You need to escape the "$" sign otherwise the "_err", "_out" and "_res"
> >> variables are resolved to an empty string.
> >>
> >> Here is an example of what you could do:
> >> -------------8<-----------8<----------
> >> cmake_minimum_required(VERSION 2.8.9)
> >>
> >> install(CODE "execute_process (
> >>       COMMAND ${CMAKE_COMMAND} -E echo \"Hello\"
> >>       OUTPUT_VARIABLE _out
> >>       ERROR_VARIABLE _err
> >>       RESULT_VARIABLE _res
> >>       )"
> >>    )
> >> install(CODE "message( STATUS \"out: \${_out}, err: \${_err}, res:
> >> \${_res}...\")") -------------8<-----------8<----------
> >
> > Aha! This was probably obvious to you and Kornel, but it "escaped" me ;).
> > Brilliant, this is working fine now.
>
> One last item here: I'm now able to see the resulting variable values in
> the message command output, but I'd now like to enclose this in an 'if'
> command. Something like:
>
> install(CODE "execute_process (
>       COMMAND ${CMAKE_COMMAND} -E echo \"Hello\"
>       OUTPUT_VARIABLE _out
>       ERROR_VARIABLE _err
>       RESULT_VARIABLE _res
>       )"
>    )
> If (NOT \${_res} EQUAL "0") # escaping here has not effect one way or the
> other...
>    install(CODE "message( FATAL_ERROR \"out: \${_out}, err: \${_err}, res:
> \${_res}\")")
> endif ()
>
> However, the resulting cmake_install.cmake has the following (meaning the
> fatal error message will always be executed regardless of the value of
> '_res"):
>
> IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL
> "Unspecified")
>   MESSAGE( FATAL_ERROR "out: ${_out}, err: ${_err}, res: ${_res}...")
> ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL
> "Unspecified")
>
> Is there a way to do this?
>
> -David
>
> > Thanks to both of you for your help,
> > -David
> >
> >> Hth
> >> Jc
> >>
> >> On Wed, Nov 13, 2013 at 2:29 PM, David Hauck <davidh at netacquire.com>
> >> wrote:
> >>      Hi Kornel,
> >>
> >>      On Wednesday, November 13, 2013 11:08 AM, cmake- bounces at cmake.org
> >> wrote:       > Am Mittwoch, 13. November 2013 um 18:41:03, schrieb David
> >> Hauck        > <davidh at netacquire.com>       >> Hi Kornel,   >>
>  >> On Wednesday,
> >> November 13, 2013 10:26 AM, cmake-   > bounces at cmake.org wrote:
>  >>> Am
> >> Mittwoch, 13. November 2013 um 18:12:26, schrieb David Hauck         >>>
> >> <davidh at netacquire.com>      >>>> Hello,     >>>>    >>>> I've been
> using
> >> several "install (CODE "EXECUTE_PROCESS ...")"       >>>> constructs
>       >>> in
> >> my top-level CMakeLists.txt file. However, I've been unable to       >>>
> >> capture/operate on any exit status of the embedded command.  >>>
> >> Unfortunately, documentation/searches haven't turned up any useful   >>>
> >> pointers. The closest I've come is a pointer in the following thread:
> >>      >>>> http://www.cmake.org/pipermail/cmake/2011- July/045475.html
> >> However,     >>>> I've not been able to sufficiently read between the
> >> lines to get         >>>> this working.      >>>>    >>>> Does anyone
> have any
> >> thoughts on how to get something like the    >>>> following working:
> >>      >>>>    >>>> install (CODE "EXECUTE_PROCESS (   >>>>       COMMAND
> ant
> >> ...  >>>> WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/java       >>>>
> >> ERROR_VARIABLE _err  >>>     >>> Didn't you mean 'RESULT_VARIABLE' here?
> >>      >>      >> No, I really do mean ERROR_VARIABLE (unless, of course,
> this
> >> variable     >> does         > not include the non-zero exit status of
> the
> >> EXECUTE_PROCESS command?).   >       > If you run 'cmake --help-command
> >> execute_process', you see: ... If    > RESULT_VARIABLE is given the
> >> variable will be set to contain the  > result of running the processes.
> >>  This will be an integer return code         > from the last child or a
> string
> >> describing an error condition. ... So,       > if this is not "0", then
> you
> >> have an error condition.
> >>
> >>      Yes, I see this. I also assumed that the ERROR_VARIABLE would be
> >> returning non-zero text as well in this case. I will change to using
> >> RESULT_VARIABLE, but, in both cases, it seems that I'm referencing
> >> the variable incorrectly (either syntactically or in the incorrect
> >> context) since this/these is/are always <empty>.
> >>
> >>      >> BTW, I'm still curious about the (dual 'code') construct
> generally.
> >>      >> Specifically, if I do the following I never see the fatal error
>      >>
> >> message (so I'm wondering if there's still something wrong regarding
> >>      >> the scoping of the message command)?         >>      >>
>  install (CODE
> >> "EXECUTE_PROCESS (   >>       COMMAND ant ...        >>
> WORKING_DIRECTORY
> >> ${PROJECT_SOURCE_DIR}/java   >>       ERROR_VARIABLE _err    >>    )
>       >>
> >> MESSAGE( FATAL_ERROR \"err: ${_err}\")       >       > Never did this.
> When do
> >> you want to see the message?
> >>
> >>      Ideally, I want to be able to test for the result of this variable
> >> (either ERROR_VARIABLE or RESULT_VARIABLE) after the execute_process
> >> command completes (during 'make install') to determine its result
> >> and to terminate (with error message) when the command fails.
> >>
> >>      Thanks,
> >>      -David
> >>
> >>      > As I understand your code, only in call of cmake, e.g. at
> >> configuration time.
> >>      >
> >>      >       Kornel
>



-- 
+1 919 869 8849
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20131113/1fc70257/attachment-0001.htm>


More information about the CMake mailing list