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
>
>
>
>
>

Reply via email to