mesonbuild / meson

The Meson Build System
http://mesonbuild.com
Apache License 2.0
5.51k stars 1.6k forks source link

SWIG support #341

Open ignatenkobrain opened 8 years ago

ignatenkobrain commented 8 years ago

I am using swig I'd like to get support of it in meson. It is not so trivial, but it is possible. I am using it in way: https://github.com/ignatenkobrain/libsmartcols-bindings/blob/master/CMakeLists.txt

Zaharid commented 7 years ago

Basic support for swig could start with something like this:

swig = find_program('swig')
swig_gen = generator(
    swig,
    output: ['@BASENAME@.cxx'],
    arguments: ['-c++', '-python', '-py3', '-o', './@OUTPUT@',
                '-outdir', '.', '-I../src', '-MMD',
                '@INPUT@'],
    depfile: '@BASENAME@.d',
)

swig_sources = [
    'wrapper/src/dataset.i',
    'wrapper/src/commondata.i',
]

wrapper_deps = [
    dependency('python'),
]

foreach swig_source: swig_sources
    cpp_source = swig_gen.process(swig_source)
    shared_library(
       swig_source.split('.').get(-2),
       cpp_source,
       dependencies: dependencies + wrapper_deps,
       install: true,
       install_dir: 'lib/',
    )
endforeach

But this has the following limitations:

JoelStienlet commented 4 years ago

Hello, What is the current status of SWIG support in meson? Couldn't find much info in the documentation, and googling it wasn't helpful either. 3 years later, is Zaharid's suggestion still the best way to implement it?

radarsat1 commented 4 years ago

I'm also using swig here, and I want to ask the same question but in a more pointed sense. I got the build steps for swig working fine, but the one thing I have not been able to avoid yet is embedding a list of the generated .java files in my meson.build, for telling javac what to compile.

The problem is that it is impossible to know in advance the names of all the .java files generated by swig. I mean, you can know them as they are deterministic, but it is really cumbersome to maintain this list since they change as I work on the binding code.

So, to the question, is there a way to get Meson to dynamically determine a list of output files of a given command? All it needs is a way to glob the output files in @PRIVATE_DIR@ so that they can be passed to another command (javac in this case). This is not the same as globbing input files and would not have the same effect on performance when checking for changes. I can imagine for instance,

swig_output = custom_target('swig',
    input: 'myfile.i',
    output: ['@BASENAME@.cpp', '@PRIVATE_DIR@/*.java'],
    command: [swig, '-c++',
              '-o', '@OUTPUT0@',
              '-outdir', '@PRIVATE_DIR@']
              '-java', '-package', java_package_name, '@INPUT@'])

By the way there is a similar problem with javac as it generates more .class files than .java input files, if there are any inner classes. This need to dynamically determine output files seems general enough that I was wondering if there is any existing thought to how to support it.

rgommers commented 9 months ago

I just ran into this in https://github.com/scikit-umfpack/scikit-umfpack/pull/91. A key problem with using SWIG is that it wants -I/path/to/incdir arguments for where to find other SWIG files and headers to parse. So when you do something like:

foo_dep = cc.find_library('foo', has_headers : ['foo.h']

then that typically succeeds when foo is installed (say <prefix>/lib/libfoo.so and <prefix>/include/foo.h). But the <prefix>/include is then on the compiler search path, and there is no way to retrieve it (xref gh-8334).

The best I could come up with to get at that <prefix>/include location is the -print-sysroot' hack below, but that's of course not going to be very robust:

# SWIG needs to find umfpack.h, so add all potential candidates
swig_inc_args = []
foreach _dir : suitesparse_incdirs  # a bunch of hardcoded locations
    swig_inc_args += '-I' + _dir
endforeach

# This is a hack that gets at the location for conda envs, when building with conda compilers. 
_cc_incdir = run_command([cc, '-print-sysroot'], check: true).stdout().strip()
if _cc_incdir.contains('bin/../')
 swig_inc_args += '-I' + _cc_incdir.split('bin/../')[0] / 'include'
endif
# The above took care of all fixed directories. We also need the default
# compiler search directories, but Meson doesn't expose those.
_umfpack_swig = custom_target('_umfpack_swig',
    output: [
        '_umfpack_wrap.c',
        '_umfpack.py',
    ],
    input: 'umfpack.i',
    command: [swig, '-python'] + swig_inc_args + [
              '-o', '@OUTPUT0@', '-outdir', '@OUTDIR@', '@INPUT@'],
    install: true,
    install_dir: py.get_install_dir() / 'scikits/umfpack',  # need to install _umfpack.py
    install_tag: 'python-runtime',
)

Another way would be to do a compile check like:

#include <umfpack.h>

int main(void) {
    return 0;
}

with the compiler-specific flag to echo include paths to stdout, e.g. for GCC the `-H flag (see https://stackoverflow.com/questions/5834778/how-to-tell-where-a-header-file-is-included-from):

$ gcc -H tmp.c $CFLAGS
. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack.h
.. /home/rgommers/mambaforge/envs/scipy-dev/include/SuiteSparse_config.h
.....

but that's very verbose:

``` . /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/SuiteSparse_config.h ... /home/rgommers/mambaforge/envs/scipy-dev/lib/gcc/x86_64-conda-linux-gnu/12.2.0/include-fixed/limits.h .... /home/rgommers/mambaforge/envs/scipy-dev/lib/gcc/x86_64-conda-linux-gnu/12.2.0/include-fixed/syslimits.h ..... /home/rgommers/mambaforge/envs/scipy-dev/lib/gcc/x86_64-conda-linux-gnu/12.2.0/include-fixed/limits.h ...... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/limits.h ....... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/features.h ........ /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/sys/cdefs.h ......... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wordsize.h ........ /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/gnu/stubs.h ......... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wordsize.h ......... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/gnu/stubs-64.h ....... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/posix1_lim.h ........ /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/local_lim.h ......... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/linux/limits.h ....... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/posix2_lim.h ... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/stdlib.h .... /home/rgommers/mambaforge/envs/scipy-dev/lib/gcc/x86_64-conda-linux-gnu/12.2.0/include/stddef.h .... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/waitflags.h .... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/waitstatus.h ..... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/endian.h ...... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/endian.h ...... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/byteswap.h ....... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wordsize.h .... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/sys/types.h ..... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/types.h ...... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wordsize.h ...... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/typesizes.h ..... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/time.h ..... /home/rgommers/mambaforge/envs/scipy-dev/lib/gcc/x86_64-conda-linux-gnu/12.2.0/include/stddef.h ..... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/sys/select.h ...... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/select.h ....... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wordsize.h ...... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigset.h ...... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/time.h ...... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/time.h ..... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/sys/sysmacros.h ..... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/pthreadtypes.h ...... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/wordsize.h .... /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/alloca.h ..... /home/rgommers/mambaforge/envs/scipy-dev/lib/gcc/x86_64-conda-linux-gnu/12.2.0/include/stddef.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_symbolic.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_numeric.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_solve.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_free_symbolic.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_free_numeric.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_defaults.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_qsymbolic.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_wsolve.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_triplet_to_col.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_col_to_triplet.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_transpose.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_scale.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_get_lunz.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_get_numeric.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_get_symbolic.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_save_numeric.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_load_numeric.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_save_symbolic.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_load_symbolic.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_get_determinant.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_status.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_info.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_control.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_matrix.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_triplet.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_vector.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_symbolic.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_numeric.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_perm.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_timer.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_tictoc.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/amd.h ... /home/rgommers/mambaforge/envs/scipy-dev/lib/gcc/x86_64-conda-linux-gnu/12.2.0/include/stddef.h .. /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_global.h Multiple include guards may be useful for: /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_col_to_triplet.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_defaults.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_free_numeric.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_free_symbolic.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_get_determinant.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_get_lunz.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_get_numeric.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_get_symbolic.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_global.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_load_numeric.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_load_symbolic.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_numeric.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_qsymbolic.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_control.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_info.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_matrix.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_numeric.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_perm.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_status.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_symbolic.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_triplet.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_report_vector.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_save_numeric.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_save_symbolic.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_scale.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_solve.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_symbolic.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_tictoc.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_timer.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_transpose.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_triplet_to_col.h /home/rgommers/mambaforge/envs/scipy-dev/include/umfpack_wsolve.h /home/rgommers/mambaforge/envs/scipy-dev/lib/gcc/x86_64-conda-linux-gnu/12.2.0/include-fixed/syslimits.h /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/byteswap.h /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/endian.h /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/local_lim.h /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/select.h /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/sigset.h /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/time.h /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/typesizes.h /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/waitflags.h /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/bits/waitstatus.h /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/gnu/stubs-64.h /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/gnu/stubs.h /home/rgommers/mambaforge/envs/scipy-dev/x86_64-conda-linux-gnu/sysroot/usr/include/limits.h ```