[CMake] INSTALL CODE Error Results and Termination
David Hauck
davidh at netacquire.com
Wed Nov 13 15:35:53 EST 2013
Hi Jean-christophe,
On chris.fillionr at kitware.com], Jean-Christophe Fillion-Robin wrote:
> 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()
> ")
Perfect, thx (just fixed up the double-quote escaping a bit and things worked fine).
> 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".
Hmmm, OK, I'll look into reviewing this to see how things differ.
Thanks,
-David
> 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
More information about the CMake
mailing list