¿Hay alguna forma para que CMake utilice las dependencias generadas por `swig -MM`?

SWIG genera un código de envoltorio de su C / C ++ en un idioma de destino deseado (Python, Java, C #, etc.) usando un archivo de interfaz (.i) que especifica el código de entrada que se debe envolver como se describe en el tutorial de SWIG . CMake se puede usar para llamar a swig con el fin de generar código de destino desde la interfaz .i, como se describe en la documentación de SWIG .

Sin embargo, al usar este método, CMake solo genera una dependencia para el archivo de interfaz en sí, pero no para los archivos de origen que incluye. Uno puede agregar dependencias manualmente , pero SWIG puede generar dependencias automáticamente con la opción -MM, y me gustaría que CMake las utilice.

Hubo un compromiso con CMake que utilizaba las dependencias generadas por swig -MM pero luego se revirtió debido a un problema con las fonts generadas que no existían en el momento de la llamada a swig. En este momento el problema parece seguir sin resolverse.

Por lo tanto, dirijo el problema a la shiny comunidad StackOverflow: ¿Existe alguna manera con el CMake actual de utilizar las dependencias generadas por swig -MM cuando el archivo de interfaz (a) no incluye el código generado (por ejemplo, config.h) y (b) incluye codigo generado?

Aquí hay un pequeño ejemplo que se puede usar para la experimentación ( descárguelo aquí ).

 // swig_example.h int foo(int n); //*** comment this declaration after compiling once to witness dependency failure ***/ int another_function(); 
 // swig_example.cpp #include "swig_example.h" int another_function() {return -1;} int foo(int n) { if (n <= 1) return 1; else return another_function(); } 
 // swig_example: example.i %module example %{ #include "swig_example.h" %} %include "swig_example.h" 
 # swig_example: CMakeLists.txt FIND_PACKAGE(SWIG REQUIRED) INCLUDE(${SWIG_USE_FILE}) FIND_PACKAGE(PythonLibs) INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) SET(CMAKE_SWIG_FLAGS "") SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES CPLUSPLUS ON) #add manual dependencies (must be called before SWIG_ADD_MODULE) #SET(SWIG_MODULE_example_EXTRA_DEPS ${CMAKE_SOURCE_DIR}/swig_example.h) SWIG_ADD_MODULE(example python example.i swig_example.cpp) SWIG_LINK_LIBRARIES(example ${PYTHON_LIBRARIES}) 

Compílelo una vez, luego comente la statement de another_function e intente comstackr nuevamente. Debido a que la interfaz de swig no se regenera, se produce un error al intentar comstackr examplePYTHON_wrap.cxx.

 examplePYTHON_wrap.cxx:3220:17: error: use of undeclared identifier 'another_function' result = (int)another_function(); 

Descomente la línea de agregar dependencias manuales de CMakeLists.txt y la interfaz se regenerará correctamente. Sin embargo, quiero que esto funcione con las dependencias generadas desde swig -MM lugar de tener que especificar manualmente las dependencias.

 $ swig -python -MM -c++ ../example.i ../example_wrap.cxx: \ ../example.i \ ../swig_example.h \ 

Convertir mis comentarios en una respuesta.

No creo que, si desea hacer esto automáticamente y, por ejemplo, desee utilizar swig -MM , se pueda hacer esto sin cambiar el código de uso de UseSWIG.cmake .

Cuando miro por qué se revirtió el bash anterior que ha vinculado, a saber, la discusión en “0012307: regresión en 2.8.5 rc2: UseSWIG.cmake broken” – No creo que SWIG_GET_WRAPPER_DEPENDENCIES() realidad se haya roto una nueva restricción: “esto simplemente requiere que todos los encabezados para que esté presente el módulo SWIG_ADD_MODULE() ” antes de llamar a SWIG_ADD_MODULE() .

Así que sugerí agregar la opción -ignoremissing -ignoremissing, pero esto necesitaría más pruebas.


Actualización (abril 2017)

Con CMake versión 3.8.0 llegó una solución “Analizar automáticamente las dependencias de los archivos SWIG para los generadores de Makefile” que funciona para los generadores de makefile .


Referencia

La discusión general sobre cómo solucionar este problema (incluida mi sugerencia) se describe en “Problema nº 4147: [MÓDULOS] [UseSWIG] Use swig para calcular dependencias” . El boleto aún está abierto (se volvió a abrir), así que siéntase libre de agregar su apoyo, sugerencias o resultados de pruebas allí.