On 12/5/06, Axel Roebel <[EMAIL PROTECTED]> wrote:
Hi,

I just started to add swig support to our project
http://sourceforge.net/projects/sdif. The project supports
swig bindings to perl, python and java.

I instantly tried the available
cmake modules: notably FindSWIG.cmake
and FindPerlLibs.cmake

I was pretty astonished to find that these
two  macros do not work at all, because most of the
important information that is necessary
to find the components is hardcoded
using fixed version numbers (that are already out of date)

I added patched version of these macros to  bug reports 4145
 4146 in the cmake bug database. These patched versions
are completely backwards compatible (they use the wrong and fixed path
locations first before they fall back to the new scheme and use
the same variables to communicate results)

The idea of the new procedure is to base everything on the FIND_PROGRAM
macros that searches for the perl/swig binaries
and (if found) asks the binary via inplace scripts (perl)/command line options
(swig) all the directory locations that are needed.

This approach is very flexible because by simply setting PERL_EXECUTABLE or
SWIG_EXECUTABLE on the command line (or the cmake gui)
one can select an arbitrary perl/swig version
that is installed on  the system.


The following concerns `UseSWIG.cmake':

Thanks for what you did, it's a long time this module had to be
rewritten. I guess you're absolutely right to use features provided by
a tool to find its own config directories. I didn't notice that swig
had this option.

Here are some comments (without testing your module):
I guess 2 calls to `FIND_PATH' on the same file `swig.swg' is weird, why don't
you make the EXECUTE_PROCESS before to retrieve the directory given by
`swig -swiglib' and finally make the FIND_PATH of `swig.swg'?

1. Look for swig executable
2. use `swig -swiglib' to get the swiglib path
3. FIND_PATH(SWIG_DIR swig.swg ${SWIG_outlib} /usr/share/swig1.3 ...)

# - Find SWIG
# This module finds an installed SWIG.  It sets the following variables:
#  SWIG_FOUND - set to true if SWIG is found
#  SWIG_DIR - the directory where swig is installed
#  SWIG_EXECUTABLE - the path to the swig executable
SET(SWIG_FOUND FOOBAR)

I guess `FALSE' would be cleaner.

FIND_PATH(SWIG_DIR
  SWIGConfig.cmake
  /usr/share/swig1.3
  /usr/lib/swig1.3
  /usr/local/share/swig1.3)

On Linux,  mine are installed  in /usr/local/swig/1.3.{29,30,31} without
specifying anything  strange during the `./configure'.  Maybe you should
add this paths to.

FIND_PATH(SWIG_DIR
  swig.swg
  /usr/share/swig1.3
  /usr/lib/swig1.3
  /usr/local/share/swig1.3)
IF(EXISTS ${SWIG_DIR})
  IF("x${SWIG_DIR}x" STREQUAL "x${CMAKE_ROOT}/Modulesx")
    MESSAGE("SWIG_DIR should not be modules subdirectory of CMake")
  ENDIF("x${SWIG_DIR}x" STREQUAL "x${CMAKE_ROOT}/Modulesx")

  IF(EXISTS ${SWIG_DIR}/SWIGConfig.cmake)
    INCLUDE(${SWIG_DIR}/SWIGConfig.cmake)
    SET(SWIG_FOUND 1)
  ELSE(EXISTS ${SWIG_DIR}/SWIGConfig.cmake)
    FIND_PROGRAM(SWIG_EXECUTABLE
      NAMES swig-1.3 swig
      PATHS ${SWIG_DIR} ${SWIG_DIR}/.. ${SWIG_DIR}/../../bin /usr/bin 
/usr/local/bin )
    SET(SWIG_USE_FILE ${CMAKE_ROOT}/Modules/UseSWIG.cmake)
  ENDIF(EXISTS ${SWIG_DIR}/SWIGConfig.cmake)
ELSE(EXISTS ${SWIG_DIR})
  FIND_PROGRAM(SWIG_EXECUTABLE swig )
  MESSAGE(STATUS "SWIG_EXECUTABLE -- ${SWIG_EXECUTABLE}")

Personnaly I don't like talktative modules. I expect:
IF(SWIG_FIND_QUIETLY)
 MESSAGE(STATUS)
ENDIF(SWIG_FIND_QUIETLY)

Whatever you  can put  the MESSAGE commands  at the  end of the  file to
summary what happened.

  IF(NOT "${SWIG_EXECUTABLE}" STREQUAL "SWIG_EXECUTABLE-NOTFOUND")

IF(NOT SWIG_EXECUTABLE)
is enough, isn't it?

    SET(SWIG ${SWIG_EXECUTABLE})
    EXECUTE_PROCESS(COMMAND     ${SWIG}    -swiglib    OUTPUT_VARIABLE
    SWIG_DIR_TMP)

The command can fail, however it's common to use lower-case for internal
variables:

EXECUTE_PROCESS(COMMAND ${SWIG_EXECUTABLE} -swiglib
 OUTPUT_VARIABLE SWIG_swiglib_output
 ERROR_VARIABLE SWIG_swiglib_error
 RESULT_VARIABLE SWIG_swiglib_result
 )
IF(NOT ${SWIG_swiglib_result} EQUAL 0)
 MESSAGE(SEND_ERROR "Command \"${SWIG_EXECUTABLE} -swiglib\" failed
with output:\n${SWIG_swiglib_error}")
ENDIF(NOT ${SWIG_swiglib_result} EQUAL 0)


I've got a strange behavior on Windows:
$ which swig
/cygdrive/c/Program Files/swigwin-1.3.31/swig
$ swig -swiglib
c:\Program Files\swigwin-1.3.31\Lib
C:/msys/1.0/local/share/swig/1.3.31
$

... so you have to consider that the command can write several paths.
The best thing would be to only keep the path that "match" the
SWIG_EXECUTABLE path.

I guess a
STRING(REGEX REPLACE "[\n]" ";" SWIG_swiglib_output ${SWIG_swiglib_output})
should be enough  to separate the string in  several arguments. As there
can be spaces in the paths, you can't use the SEPARATE_ARGUMENT command.

    STRING(REGEX  REPLACE "[\n\r]" ""  SWIG_DIR_TMP_NOCR  ${SWIG_DIR_TMP})
    FIND_PATH(SWIG_DIR  swig.swg PATHS "${SWIG_DIR_TMP_NOCR}")
    IF(EXISTS ${SWIG_DIR})
      MESSAGE(STATUS "swig install dir -- ${SWIG_DIR}")
      SET(SWIG_FOUND 1)
      SET(SWIG_USE_FILE ${CMAKE_ROOT}/Modules/UseSWIG.cmake)
    ELSE (EXISTS ${SWIG_DIR})
      MESSAGE(STATUS "swig install dir -- ${SWIG_DIR}")
    ENDIF(EXISTS ${SWIG_DIR})
  ENDIF(NOT "${SWIG_EXECUTABLE}" STREQUAL "SWIG_EXECUTABLE-NOTFOUND")
ENDIF(EXISTS ${SWIG_DIR})

IF("x${SWIG_FOUND}x" STREQUAL "xFOOBARx")

  SET(SWIG_FOUND 0)
  IF(EXISTS ${SWIG_DIR})
    IF(EXISTS ${SWIG_USE_FILE})
      IF(EXISTS ${SWIG_EXECUTABLE})
        SET(SWIG_FOUND 1)
      ENDIF(EXISTS ${SWIG_EXECUTABLE})
    ENDIF(EXISTS ${SWIG_USE_FILE})
  ENDIF(EXISTS ${SWIG_DIR})
  IF(NOT ${SWIG_FOUND})
    IF(${SWIG_FIND_REQUIRED})
      MESSAGE(FATAL_ERROR "Swig was not found on the system. Please specify the 
location of Swig.")
    ENDIF(${SWIG_FIND_REQUIRED})
  ENDIF(NOT ${SWIG_FOUND})
ENDIF("x${SWIG_FOUND}x" STREQUAL "xFOOBARx")


IF(NOT SWIG_FOUND)
 IF(NOT SWIG_FIND_QUIETLY)
   MESSAGE(STATUS "SWIG was not found.")
 ELSE(NOT SWIG_FIND_QUIETLY)
   IF(SWIG_FIND_REQUIRED)
     MESSAGE(FATAL_ERROR "SWIG was not found.")
   ENDIF(SWIG_FIND_REQUIRED)
 ENDIF(NOT SWIG_FIND_QUIETLY)
ELSE(NOT SWIG_FOUND)
 IF(NOT SWIG_FIND_QUIETLY) # put the verbose commands
   MESSAGE(STATUS ...)
   MESSAGE(STATUS ...)
   MESSAGE(STATUS ...)
 ENDIF(NOT SWIG_FIND_QUIETLY)
ENDIF(NOT SWIG_FOUND)



I would be glad to discuss with you about how the module could be in
the next release. For example it would be fancy that the module
defines the variable SWIG_VERSION (by using another EXECUTE_PROCESS)


I will test the module tomorrow.
Could you please put a RC2 of the `FindSWIG.cmake' on the bug tracker?

Thanks!

CU
--
Tristan Carel
Music with dinner is an insult both to the cook and the violinist.
_______________________________________________
CMake mailing list
CMake@cmake.org
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to