[CMake] EXECUTE_PROCESS too good at running programs

David Cole david.cole at kitware.com
Fri Jul 21 13:49:24 EDT 2006


Sorry for the misfiring neurons.

Brandon J. Van Every wrote:

> David Cole wrote:
>
>> If you have the MSYS tools in your Windows system path and you can 
>> run makeinfo from a Windows "cmd" prompt then it should also be able 
>> to work from Visual Studio. 
>
>
> Please reread.  I explained the situation pretty clearly, I thought.  
> E:\msys\1.0\bin\makefile does *NOT* run under a Windows command 
> prompt.  It's not supposed to.  As I said before, there's a comment at 
> the top of the binary that says it's not supposed to.  Just to 
> reiterate again in case there's any doubt:
>
> E:\msys\1.0\bin>dir makeinfo
> Volume in drive E is MONDRIAN
> Volume Serial Number is 9CA0-CADF
>
> Directory of E:\msys\1.0\bin
>
> 04/30/2004  11:15p             180,224 makeinfo
>               1 File(s)        180,224 bytes
>               0 Dir(s)  11,499,749,376 bytes free
>
> E:\msys\1.0\bin>cmd
> Microsoft Windows 2000 [Version 5.00.2195]
> (C) Copyright 1985-2000 Microsoft Corp.
>
> E:\msys\1.0\bin>makeinfo
> 'makeinfo' is not recognized as an internal or external command,
> operable program or batch file.
>
>> If you click on "Start > Run" and type "cmd" and hit enter, can you 
>> run makeinfo from that "raw Windows cmd prompt"?
>>
>> The flaw here is in the mismatch between Visual Studio's handling of 
>> the PATH and your expectation that it should be in sync with your 
>> actual current PATH env value.
>
>
> No, the flaw is that EXECUTE_PROCESS is finding a way to run a non-DOS 
> program and succeeding at it.  It is as though it invokes whatever 
> shell is necessary to run the app, or just happens to have MSYS 
> linkage, or it runs a Unixy shell and makeinfo happens to like that.  
> Or something similarly bizzare.  Visual Studio cannot ever run this 
> program; as far as it is concerned, it is not a valid program.
>
> Perhaps makeinfo really is an exe, but by standard Windows command 
> prompt convention, files must end in .exe or .cmd or .bat to be 
> recognized as apps.  Perhaps EXECUTE_PROCESS has no such limitation 
> and merrily execs it.  My point is that CMake should do what the 
> target compiler does.  VS71 IDE projects never run under shells that 
> can execute arbitrarily named apps.
>
>
>> VS copies the PATH at Visual Studio install time and *never* updates 
>> it again except by user direction...
>>
>> You can try adding "E:\msys\1.0\bin" to the end of the list of Visual 
>> Studio paths under "Tools > Options > Projects > VC++ Directories > 
>> Win32 / Executable Files" -- what you'll see in there is a list of VS 
>> directories first, followed by a snapshot copy of the PATH from when 
>> you installed VS.
>>
>> Really, VS is just helping you out... You just didn't know you 
>> preferred "stability" over "up-to-date-ness"... :-)
>>
>
> Just to belabor the point even further, I added E:\msys\1.0\bin to the 
> VS path as above, and of course it changes nothing.  And now I'm 
> removing it again, so that it doesn't screw with my builds in other 
> weird unanticipated ways.
>
>
> Cheers,
> Brandon
>
>>
>>
>> Brandon J. Van Every wrote:
>>
>>> I'm using CMake 2.4.2 and using the Visual Studio .NET 2003 
>>> generator.  When I do
>>> FIND_PROGRAM(MAKEINFO_EXE NAMES makeinfo)
>>> it picks up my MSYS makeinfo, because I have my MSYS tools in my 
>>> Windows system path.  The exact filename found, as reported by 
>>> CMakeCache.txt, is
>>>
>>> MAKEINFO_EXE:FILEPATH=E:/msys/1.0/bin/makeinfo
>>>
>>> Most of the MSYS tools have .exe suffixes and will run under a plain 
>>> Windows command prompt.  Some, however, do not have .exe suffixes 
>>> and are not meant to run outside of MSYS.  Such is makeinfo.  When I 
>>> open makeinfo under a text editor, I see that it is some kind of 
>>> binary, and it has a string near the top of it that says, "This 
>>> program cannot be run in DOS mode."
>>>
>>> EXECUTE_PROCESS proves to be exceptionally clever at getting 
>>> makeinfo to run.  Too clever.  Somehow, it gets it to run, and 
>>> returns a success code.  Under a VS71 generator, it should be 
>>> flunking it.  Because it certainly doesn't work in the resultant 
>>> VS71 .sln file, which presumably uses a 'DOS' mode to execute custom 
>>> targets.
>>>
>>> My mighty CMakeLists.txt:
>>>
>>> FIND_PROGRAM(MAKEINFO_EXE NAMES makeinfo)
>>> IF(MAKEINFO_EXE)
>>>
>>>  MESSAGE("Testing whether makeinfo returns error codes.")
>>>  EXECUTE_PROCESS(COMMAND ${MAKEINFO_EXE} --idiot
>>>    RESULT_VARIABLE MAKEINFO_FAILED)
>>>  IF(MAKEINFO_FAILED)
>>>    MESSAGE("makeinfo returns an error code when given bogus 
>>> arguments.")
>>>  ELSE(MAKEINFO_FAILED)
>>>    MESSAGE("makeinfo returns success even with bogus arguments.")
>>>  ENDIF(MAKEINFO_FAILED)
>>>
>>>  MESSAGE("Testing whether makeinfo actually works.")
>>>  EXECUTE_PROCESS(COMMAND ${MAKEINFO_EXE} --version
>>>    RESULT_VARIABLE MAKEINFO_FAILED)
>>>  IF(MAKEINFO_FAILED)
>>>    MESSAGE("makeinfo does not work")
>>>    ADD_CUSTOM_TARGET(info
>>>      COMMAND ${CMAKE_COMMAND} -E echo makeinfo does not work)
>>>  ELSE(MAKEINFO_FAILED)
>>>    MESSAGE("makeinfo works")
>>>    ADD_CUSTOM_TARGET(info
>>>      COMMAND ${MAKEINFO_EXE} --version)
>>>  ENDIF(MAKEINFO_FAILED)
>>>
>>> ELSE(MAKEINFO_EXE)
>>>  MESSAGE("makeinfo not available")
>>>  ADD_CUSTOM_TARGET(info
>>>    COMMAND ${CMAKE_COMMAND} -E echo makeinfo not available)
>>> ENDIF(MAKEINFO_EXE)
>>>
>>>
>>> My results in CMakeSetup:
>>>
>>> Testing whether makeinfo returns error codes.
>>> makeinfo returns an error code when given bogus arguments.
>>> Testing whether makeinfo actually works.
>>> makeinfo works
>>>
>>>
>>> It fails in VS71 thusly:
>>>
>>> ------ Build started: Project: info, Configuration: Debug Win32 ------
>>>
>>> Performing Post-Build Event...
>>> 'E:\msys\1.0\bin\makeinfo' is not recognized as an internal or 
>>> external command,
>>> operable program or batch file.
>>> Project : error PRJ0019: A tool returned an error code from 
>>> "Performing Post-Build Event..."
>>>
>>> Build log was saved at 
>>> "file://e:\devel\vs71\info\info.dir\Debug\BuildLog.htm"
>>> info - 1 error(s), 0 warning(s)
>>>
>>>
>>>
>>> Cheers,
>>> Brandon Van Every
>>>
>>> _______________________________________________
>>> CMake mailing list
>>> CMake at cmake.org
>>> http://www.cmake.org/mailman/listinfo/cmake
>>>
>>
>
> _______________________________________________
> CMake mailing list
> CMake at cmake.org
> http://www.cmake.org/mailman/listinfo/cmake
>


More information about the CMake mailing list