[CMake] Re: Weird if nesting problem

James Bigler bigler at cs.utah.edu
Thu Dec 7 17:18:24 EST 2006


 > ------------------------------

 > Message: 5
 > Date: Wed, 06 Dec 2006 10:56:39 -0800
 > From: "Brandon J. Van Every" <bvanevery at gmail.com>
 > Subject: Re: [CMake] Re: Weird if nesting problem
 > To: cmake <cmake at cmake.org>
 > Message-ID: <45771267.2020502 at gmail.com>
 > Content-Type: text/plain; charset=ISO-8859-1; format=flowed

 > James Bigler wrote:
 > > >
 > > >
 > > > If you look at the original code.  The PARSER_EXECUTABLE variable
 > > > isn't defined until inside the first ELSE branch.
 > > >
 > > > # You need at least version 2.4 for this to work.
 >>  > IF("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.6)
 > > >   MESSAGE("You need at least version 2.4 for generating stuff. 
Go get
 > > > it from http://www.cmake.org/HTML/Download.html")
 > > >   SET(PARSERS_FOUND 0)
 > > >
 > > > ELSE("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.6)
 > > >
 > > >   FIND_PROGRAM(PARSER_EXECUTABLE
 > > >     NAMES my_parser
 > > >     PATHS ${PARSER_DIR} )
 > > >
 > > >   IF(EXISTS ${PARSER_EXECUTABLE})
 > > >     SET(PARSERS_FOUND 1)
 > > >   ELSE(EXISTS ${PARSER_EXECUTABLE})
 > > >     SET(PARSERS_FOUND 0)
 > > >   ENDIF(EXISTS ${PARSER_EXECUTABLE})
 > > >
 > > > ENDIF("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.6)
 > > >
 > > > -----------------------------------------------------------
 > > >
 > > > PARSER_EXECUTABLE doesn't exist until I'm in the ELSE block.
 > > > IF(EXISTS ${PARSER_EXECUTABLE}) should *NEVER* get evaluated, but it
 > > > does.
 >
 > Well, if you get rid of the first IF..ELSE, do things work?  i.e.
 >
 >   FIND_PROGRAM(PARSER_EXECUTABLE
 >     NAMES my_parser
 >     PATHS ${PARSER_DIR} )
 >
 >   IF(EXISTS ${PARSER_EXECUTABLE})
 >     SET(PARSERS_FOUND 1)
 >   ELSE(EXISTS ${PARSER_EXECUTABLE})
 >     SET(PARSERS_FOUND 0)
 >   ENDIF(EXISTS ${PARSER_EXECUTABLE})

This works fine.



 > And how about:
 >
 > IF(TRUE)
 >   MESSAGE("Yeah it's true baby.")
 > ELSE(TRUE)
 >   FIND_PROGRAM(PARSER_EXECUTABLE
 >     NAMES my_parser
 >     PATHS ${PARSER_DIR} )
 >
 >   IF(EXISTS ${PARSER_EXECUTABLE})
 >     SET(PARSERS_FOUND 1)
 >   ELSE(EXISTS ${PARSER_EXECUTABLE})
 >     SET(PARSERS_FOUND 0)
 >   ENDIF(EXISTS ${PARSER_EXECUTABLE})
 > ENDIF(TRUE)

OK, so this simple example works, but when I make it more complicated 
(like in my code) it breaks.  All I do is add one more FIND_PROGRAM.  I 
thought I also tested it with finding a single parser.  By the way 
looking for two programs without the outer IF(1) works fine.

IF(1)
   MESSAGE("It's True!")
ELSE(1)
   FIND_PROGRAM(PARSER_EXECUTABLE
     NAMES my_parser
     PATHS ${PARSER_DIR} )

   FIND_PROGRAM(PARSER_EXECUTABLE_2
     NAMES my_parser_2
     PATHS ${PARSER_DIR} )

   IF(EXISTS ${PARSER_EXECUTABLE} AND EXISTS ${PARSER_EXECUTABLE_2})
     SET(PARSERS_FOUND 1)
   ELSE(EXISTS ${PARSER_EXECUTABLE} AND EXISTS ${PARSER_EXECUTABLE_2})
     SET(PARSERS_FOUND 0)
   ENDIF(EXISTS ${PARSER_EXECUTABLE} AND EXISTS ${PARSER_EXECUTABLE_2})
ENDIF(1)

 > You need to isolate where your problem occurs.  You've got slightly too
 > much going on to be useful.

So, in summary this is broken (got rid of extra bodies for brevity, but 
tested the code as below but with real programs for p_1 and p_2):

IF(1)
ELSE(1)
   FIND_PROGRAM(P_1 p_1)
   FIND_PROGRAM(P_2 p_2)
   IF(EXISTS ${P_1} AND EXISTS ${P_2} )
   ELSE(EXISTS ${P_1} AND EXISTS ${P_2} )
   ENDIF(EXISTS ${P_1} AND EXISTS ${P_2} )
ENDIF(1)

  ============= ERROR MESSAGE =================
  IF had incorrect arguments: EXISTS ${P_1} AND EXISTS ${P_2} (Unknown
  arguments specified).

This works:

IF(1)
ELSE(1)
   FIND_PROGRAM(P_1 p_1)
   FIND_PROGRAM(P_2 p_2)
   IF(EXISTS ${P_1})
   ELSE(EXISTS ${P_1})
   ENDIF(EXISTS ${P_1})
ENDIF(1)

This works:

FIND_PROGRAM(P_1 p_1)
FIND_PROGRAM(P_2 p_2)
IF(EXISTS ${P_1} AND EXISTS ${P_2} )
ELSE(EXISTS ${P_1} AND EXISTS ${P_2} )
ENDIF(EXISTS ${P_1} AND EXISTS ${P_2} )

James



More information about the CMake mailing list