[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