[CMake] INSTALL CODE Error Results and Termination

David Hauck davidh at netacquire.com
Wed Nov 13 14:57:13 EST 2013


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