So I was able to solve my problem of duplicate python target names generated from SWIG interface files:

  PyTrilinos/NOX/___init__.so
  PyTrilinos/NOX/Epetra/___init__.so

by overhauling UseSWIG.cmake to take advantage of the OUTPUT_NAME property of the SET_TARGET_PROPERTIES() function.

My problem now is that SWIG modules whose NAME and OUTPUT_NAME are different are always built, even if they don't need to be. Is there a way to get dependencies to work in this situation?

Thanks

On Apr 3, 2009, at 11:53 AM, Spotz, William F wrote:

Bill,

Thanks for the help.  Once I realized I needed to do

  INCLUDE(UseSWIG)

instead of

  INCLUDE(${SWIG_USE_FILE})

in order to include my local copy, I made some good progress.  Now I
am facing the problem of duplicate swig module names.  Here is
(partially) what my resulting python package directory hierarchy
should look like:

PyTrilinos/
  NOX/
    __init__.py
    ___init__.so
    Abstract.py
    _Abstract.so
    Solver.py
    _Solver.so
    StatusTest.py
    _StatusTest.so
    Epetra/
      __init__.py
      ___init__.so
      Interface.py
      _Interface.so

The problem is the multiple __init__ module names.  Here is what I am
currently trying, knowing full well it will fail:

  # Python module PyTrilinos.NOX
  SET(CMAKE_SWIG_OUTDIR PyTrilinos/NOX)
  SET_SOURCE_FILES_PROPERTIES(NOX.__init__.i PROPERTIES CPLUSPLUS ON)
  SWIG_ADD_MODULE(__init__ python NOX.__init__.i)
  SET_TARGET_PROPERTIES(${SWIG_MODULE___init___REAL_NAME}
    PROPERTIES LIBRARY_OUTPUT_DIRECTORY PyTrilinos/NOX)

  # Python module PyTrilinos.NOX.Epetra
  SET(CMAKE_SWIG_OUTDIR PyTrilinos/NOX/Epetra)
  SET_SOURCE_FILES_PROPERTIES(NOX.Epetra.__init__.i PROPERTIES
CPLUSPLUS ON)
  SWIG_ADD_MODULE(__init__ python NOX.Epetra.__init__.i)   # Repeat
module name!
  SET_TARGET_PROPERTIES(${SWIG_MODULE___init___REAL_NAME}
    PROPERTIES LIBRARY_OUTPUT_DIRECTORY PyTrilinos/NOX/Epetra)

Any ideas how to approach this?

(I was thinking it would be nice to allow SWIG_ADD_MODULE to take, for
example, NOX/__init__ or NOX/Epetra/__init__ as its first argument.
But then SWIG_MODULE_<name>_REAL_NAME is not a valid variable name.
In the latter case, we could substitute "_" for "/", but the UseSWIG
module would have to know how to handle that.)

Thanks

On Apr 2, 2009, at 2:55 PM, Bill Hoffman wrote:

I'm guessing there is a parsing of the swig interface filename which
splits on the first "." it finds rather than the last.

Yup, that is the problem...


MACRO(SWIG_ADD_SOURCE_TO_MODULE name outfiles infile)

...
 GET_FILENAME_COMPONENT(swig_source_file_path "${infile}" PATH)
 GET_FILENAME_COMPONENT(swig_source_file_name_we "${infile}" NAME_WE)

/**
* Return file name without extension of a full filename (i.e. without
path).
* Warning: it considers the longest extension (for example: .tar.gz)
*/
kwsys_stl::string SystemTools::GetFilenameWithoutExtension(const
kwsys_stl::string& filename)
{

So, how to fix it....

You could copy the UseSwig.cmake into Trilinos and modify it.   I
guess
we could change the code to use a regex replace and exchange the .i
for
empty.

GET_FILENAME_COMPONENT(swig_source_file_name_we "${infile}" NAME_WE)
 with
STRING(REGEX REPLACE "(.*)\\.i$" "\\1" swig_source_file_name_we $
{infile})

-Bill

** Bill Spotz                                              **
** Sandia National Laboratories  Voice: (505)845-0170      **
** P.O. Box 5800                 Fax:   (505)284-0154      **
** Albuquerque, NM 87185-0370    Email: [email protected] **






** Bill Spotz                                              **
** Sandia National Laboratories  Voice: (505)845-0170      **
** P.O. Box 5800                 Fax:   (505)284-0154      **
** Albuquerque, NM 87185-0370    Email: [email protected] **






_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to