Hi guys, Using swig using cmake is like using a blackbox and unfortunately is not consistent between cmake versions. This is better to hardcode your own swig sequence in CMake
I have not any time to spend in the code at the moment, but I may give you some tips to avoid to use cmake swig integration . This code snippet permits to use swig, but you have control on what will be done and understand what is done: cmake_minimum_required(VERSION 3.10) project(MyProject) find_package(SWIG REQUIRED) if(NOT WIN32) set(Python_ADDITIONAL_VERSIONS 2.7) find_package(PythonLibs 2.7 REQUIRED) else(NOT WIN32) set(PYTHON_LIBRARIES "/C/python38/libs/python38.lib") #Msys set(PYTHON_INCLUDE_DIRS "/C/python38/include") endif(NOT WIN32) include_directories(${PYTHON_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) add_definitions("-DSWIG") file(GLOB sources control.h control.C) add_custom_command(OUTPUT control_preprocessed.h COMMAND ${CMAKE_COMMAND} -E echo "Phase 1 : Generation control_preprocessed.h." COMMAND ${CMAKE_C_COMPILER} -E -P -DSWIG -I(optionals include dir) control.h -o ${CMAKE_CURRENT_BINARY_DIR}/control_preprocessed.h COMMAND ${CMAKE_COMMAND} -E echo "Done." WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/*.i DEPENDS ${sources}) set_source_files_properties(control.i PROPERTIES CPLUSPLUS ON) add_custom_command(OUTPUT control_wrap.cpp COMMAND ${CMAKE_COMMAND} -E echo "Phase2: generating control_wrap.cpp" COMMAND ${SWIG_EXECUTABLE} -c++ -python -I${CMAKE_CURRENT_BINARY_DIR} -o ${CMAKE_CURRENT_BINARY_DIR}/control_wrap.cpp control.i COMMAND ${CMAKE_COMMAND} -E echo "Done." WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS control_preprocessed.h) # generating shared library .so/.dll add_library(control SHARED control.h ${CMAKE_CURRENT_BINARY_DIR}/control_wrap.cpp control.C) set_target_properties(control PROPERTIES POSITION_INDEPENDENT_CODE TRUE) set_target_properties(control PROPERTIES PREFIX "") # removes lib prefix from target name if (WIN32) set_target_properties(control PROPERTIES SUFFIX ".pyd") endif(WIN32) set_target_properties(control PROPERTIES OUTPUT_NAME "_control") # rename shared lib as _control.so target_link_libraries(control python ${CMAKE_DL_LIBS}) set(COPY_TO_PATH control_shadow.py) add_custom_command(TARGET control POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy control.py ${COPY_TO_PATH} COMMENT "Copying 'control.py' python file to '${COPY_TO_PATH}'") install(TARGETS control DESTINATION ${INSTALL_DIRECTORY}) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/control_shadow.py DESTINATION ${INSTALL_DIRECTORY}) Le mar. 17 nov. 2020 à 07:52, Lukas Haase <lukasha...@gmx.at> a écrit : > Hi Nick, > > Indeed, I just removed the "2" and suddenly it works. > Insane. Totally crazy... > > Lukas > > > Gesendet: Montag, 16. November 2020 um 20:09 Uhr > Von: "Nick Foster" <bistrom...@gmail.com> > An: "Lukas Haase" <lukasha...@gmx.at> > Cc: "discuss-gnuradiognu.org" <discuss-gnuradio@gnu.org>, > cinaed.sim...@gmail.com > Betreff: Re: SWIG doesn't recognize argument in make() > > You're not crazy. I've seen similar behavior. Does it work if you remove > the underscore? The number? > > Who can fathom the esoteric secrets of SWIG? > > On Mon, Nov 16, 2020 at 3:06 PM Lukas Haase <lukasha...@gmx.at[mailto: > lukasha...@gmx.at]> wrote:Additional detail: I tried it again: > > $ gr_modtool rm tx_msg2tag > $ > $ gr_modtool add test > $ rm -rf build; mkdir build; cd build; cmake ..; make > > --> WORKS!! > > $ gr_modtool add tx_msg2tag > $ rm -rf build; mkdir build; cd build; cmake ..; make > > --> FAILS with the error below. > > > (of course, I edited the files to replace the <+...+> to make it compile). > > It really seems it's the name of the block (tx_msg2tag) that makes things > fail. > How can that be? > > Lukas > > Lukas wrote: > > Hi Cinaed, > > > > *I* am the author of gr-petro ;-) > > This is indeed a SWIG question. Or a question about OOT modules. > > > > I created the module with gr_modtool. I inserted bunch of blocks with > "add" > > command. Just this one below does not work. I have no idea why (and it > drives > > me crazy). > > > > Hence my questions: > > - What could be the issue? > > - What exactly generates *swigPYTHON_wrap.cxx files ? > > - How are the argument lists for the functions determined? > > > > Thanks, > > Lukas > > > > > >> Hi Lukas - gr-petro is a OOT module - an "out of tree "module - it's not > >> part of gnuradio. > >> > >> You need to contact the author of the module. > >> > >> It's highly unlikely it's a problem with make - it's more likely a > >> mismatch between gr-petro and your installed version of gnuradio. > >> > >> For instance, the OOT was written for a version of gnuradio prior to > >> 3.8. > >> > >> In any case, I couldn't find the gr-petro source code with a Google > >> search so I can't even guess what the problem might be. It also helps to > >> state which OS you're using. > >> > >> -- Cinaed > >> > >>> Hi everyone, > >>> > >>> It's driving me NUTS! SWIG just won't recognize an argument to my > make() > >>> function and hence build fails. I have other nearly identical blocks in > >>> the same module that work without issues. > >>> > >>> What exactly generates the *swigPYTHON_wrap.cxx files and how are the > >>> argument lists for the functions determined? > >>> > >>> Here is how my make fails: > >>> > >>> [ 77%] Building CXX object > >>> > swig/CMakeFiles/petro_swig.dir/CMakeFiles/petro_swig.dir/petro_swigPYTHO > >>> N_wrap.cxx.o > >>> > /home/petro/src/gr38/gr-petro/build/swig/CMakeFiles/petro_swig.dir/petro > >>> _swigPYTHON_wrap.cxx: In function ‘PyObject* > >>> _wrap_tx_msg2tag_make(PyObject*, PyObject*)’: > >>> > /home/petro/src/gr38/gr-petro/build/swig/CMakeFiles/petro_swig.dir/petro > >>> _swigPYTHON_wrap.cxx:18687:48: error: no matching function for call to > >>> ‘gr::petro::tx_msg2tag::make()’ 18687 | result = > >>> gr::petro::tx_msg2tag::make(); | > >>> ^ In file included from > >>> > /home/petro/src/gr38/gr-petro/build/swig/CMakeFiles/petro_swig.dir/petro > >>> _swigPYTHON_wrap.cxx:2881: > >>> /home/petro/src/gr38/gr-petro/lib/../include/petro/tx_msg2tag.h:48:19: > >>> note: candidate: ‘static gr::petro::tx_msg2tag::sptr > >>> gr::petro::tx_msg2tag::make(unsigned int)’ 48 | static sptr > >>> make(unsigned int time_increment_factor); | ^~~~ > >>> /home/petro/src/gr38/gr-petro/lib/../include/petro/tx_msg2tag.h:48:19: > >>> note: candidate expects 1 argument, 0 provided > >>> > /home/petro/src/gr38/gr-petro/build/swig/CMakeFiles/petro_swig.dir/petro > >>> _swigPYTHON_wrap.cxx: In function ‘PyObject* > >>> _wrap_tx_msg2tag_sptr_make(PyObject*, PyObject*)’: > >>> > /home/petro/src/gr38/gr-petro/build/swig/CMakeFiles/petro_swig.dir/petro > >>> _swigPYTHON_wrap.cxx:18914:30: error: no matching function for call to > >>> ‘gr::petro::tx_msg2tag::make()’ 18914 | result = (*arg1)->make(); > >>> | ^ In file included from > >>> > /home/petro/src/gr38/gr-petro/build/swig/CMakeFiles/petro_swig.dir/petro > >>> _swigPYTHON_wrap.cxx:2881: > >>> /home/petro/src/gr38/gr-petro/lib/../include/petro/tx_msg2tag.h:48:19: > >>> note: candidate: ‘static gr::petro::tx_msg2tag::sptr > >>> gr::petro::tx_msg2tag::make(unsigned int)’ 48 | static sptr > >>> make(unsigned int time_increment_factor); | ^~~~ > >>> /home/petro/src/gr38/gr-petro/lib/../include/petro/tx_msg2tag.h:48:19: > >>> note: candidate expects 1 argument, 0 provided make[2]: *** > >>> [swig/CMakeFiles/petro_swig.dir/build.make:63: > >>> > swig/CMakeFiles/petro_swig.dir/CMakeFiles/petro_swig.dir/petro_swigPYTHO > >>> N_wrap.cxx.o] Error 1 make[1]: *** [CMakeFiles/Makefile2:466: > >>> swig/CMakeFiles/petro_swig.dir/all] Error 2 make: *** [Makefile:141: > >>> all] Error 2 > >>> > >>> As can be very, very clearly seen, tx_msg2tag::make(unsigned int) has > >>> ONE parameter (time_increment_factor). Yet SWIG wants to call > >>> gr::petro::tx_msg2tag::make(). > >>> > >>> I have tried regenerating the file, deleting build directory and > >>> starting from scratch but this error follows me like a nightmare. > >>> > >>> Thanks for suggestions! > >>> > >>> Lukas > > > > >