xtb icon indicating copy to clipboard operation
xtb copied to clipboard

Meson: Can't link non-PIC static library 'mctc-lib' into shared library 'xtb'

Open RemiLacroix-IDRIS opened this issue 2 years ago • 4 comments

I am trying to build the GPU version of xtb with NVIDIA HPC SDK 21.9 but I stuck with an error during the Mason setup.

I have tried both Meson 0.59.2 and 0.62.1 and I am getting the same error each time:

$ meson ../ -Dc_std=none -Dla_backend=mkl-rt -Dopenmp=false -Dgpu=true -Dcusolver=true -Dgpu_arch=70
The Meson build system
Version: 0.59.2
Source dir: ...
Build dir: .../build
Build type: native build
Project name: xtb
Project version: 6.5.0
Fortran compiler for the host machine: nvfortran (nvidia_hpc 21.9-0)
Fortran linker for the host machine: nvfortran pgi 21.9-0
C compiler for the host machine: nvc (nvidia_hpc 21.9-0)
C linker for the host machine: nvc pgi 21.9-0
Host machine cpu family: x86_64
Host machine cpu: x86_64
Program git found: YES (/bin/git)
Program date found: YES (/bin/date)
Program whoami found: YES (/bin/whoami)
Program hostname found: YES (/bin/hostname)
Configuring xtb_version.fh using configuration
Library mkl_rt found: YES
Run-time dependency threads found: YES
Found pkg-config: /bin/pkg-config (1.4.2)
Did not find CMake 'cmake'
Found CMake: NO
Run-time dependency mctc-lib found: NO (tried pkgconfig and cmake)
Looking for a fallback subproject for the dependency mctc-lib

Executing subproject mctc-lib

mctc-lib| Project name: mctc-lib
mctc-lib| Project version: 0.3.0
mctc-lib| Fortran compiler for the host machine: nvfortran (nvidia_hpc 21.9-0)
mctc-lib| Fortran linker for the host machine: nvfortran pgi 21.9-0
mctc-lib| Run-time dependency json-fortran found: NO (tried pkgconfig and cmake)
mctc-lib| Looking for a fallback subproject for the dependency json-fortran
mctc-lib| Using subprojects/mctc-lib/subprojects/json-fortran-8.2.5.wrap

Executing subproject mctc-lib:json-fortran-8.2.5

json-fortran-8.2.5| Project name: jsonfortran
json-fortran-8.2.5| Project version: 8.2.5
json-fortran-8.2.5| Fortran compiler for the host machine: nvfortran (nvidia_hpc 21.9-0)
json-fortran-8.2.5| Fortran linker for the host machine: nvfortran pgi 21.9-0
json-fortran-8.2.5| Build targets in project: 1
json-fortran-8.2.5| Subproject json-fortran-8.2.5 finished.

mctc-lib| Dependency json-fortran from subproject subprojects/json-fortran-8.2.5 found: YES 8.2.5
mctc-lib| Build targets in project: 4
mctc-lib| Subproject mctc-lib finished.

Dependency mctc-lib from subproject subprojects/mctc-lib found: YES 0.3.0

../meson.build:96:0: ERROR: Can't link non-PIC static library 'mctc-lib' into shared library 'xtb'. Use the 'pic' option to static_library to build with PIC.

Also note that I had to work around some other issues:

  • -Dc_std=none is needed to avoid this error: ../meson.build:19:0: ERROR: Value "c11" (of type "string") for combo option "C language standard to use" is not one of the choices. Possible choices are (as string): "none"..
  • -Dla_backend=mkl does not work: ../meson/meson.build:124:6: ERROR: Fortran shared or static library 'mkl_intel_lp64' not found. This happens because mkl_intel_lp64 depends on other libs, e.g. mkl_sequential and mkl_core.
  • -Dopenmp=false is required because mctc-lib cannot figure out how to compile with OpenMP:
mctc-lib| Run-time dependency OpenMP found: NO (tried system)

../subprojects/mctc-lib/config/meson.build:51:2: ERROR: Dependency "openmp" not found, tried syste

RemiLacroix-IDRIS avatar Jul 07 '22 13:07 RemiLacroix-IDRIS

Am I the only one to run into this issue? I don't think there are anything specific with our NVIDIA SDK install.

RemiLacroix-IDRIS avatar Jul 15 '22 14:07 RemiLacroix-IDRIS

Some of those are known issues

  • https://github.com/mesonbuild/meson/issues/8400
  • https://github.com/mesonbuild/meson/issues/8058

From my observations there are also some recurring issues like

  • MKL doesn't work with NVIDIA SDK (workaround: use other BLAS backend)
  • static libraries cannot be linked into shared ones with NVIDIA's linker (workaround: use --default-library=static)
  • C/Fortran language standard support in some vendor compilers is broken

awvwgk avatar Jul 15 '22 14:07 awvwgk

Thanks for your feedback on this!

MKL doesn't work with NVIDIA SDK (workaround: use other BLAS backend)

It does work but you cannot test the libraries one by one as currently done in the Meson script. If you do cc.find_library('mkl_intel_lp64') it will fail because mkl_intel_lp64 depends on mkl_sequential and mkl_core. You would need to be able to test for a set of libraries.

static libraries cannot be linked into shared ones with NVIDIA's linker (workaround: use --default-library=static)

I will try, doing a static only build should work I guess. Would it be possible to force -fPIC so that it works with shared libraries too?

C/Fortran language standard support in some vendor compilers is broken

As far as I can tell, Meson is returning that the "c_std=c11" option is not supported by NVIDIA SDK but it looks like it is:

       -c8x      Use the C89 standard as the C source language.
       -c89      Use the C89 standard as the C source language.
       -c9x      Use the C99 standard as the C source language.
       -c99      Use the C99 standard as the C source language.
       -c11      Use the C11 standard as the C source language.
       -c1x      Use the C11 standard as the C source language.

RemiLacroix-IDRIS avatar Jul 15 '22 15:07 RemiLacroix-IDRIS

It does work but you cannot test the libraries one by one as currently done in the Meson script. If you do cc.find_library('mkl_intel_lp64') it will fail because mkl_intel_lp64 depends on mkl_sequential and mkl_core. You would need to be able to test for a set of libraries.

That's not true, this works completely fine with other compilers like GCC and Intel Fortran, the detection is made in a way with meson that unresolved symbols for a single library usually don't interfere (sometimes they do as in #640).

As far as I can tell, Meson is returning that the "c_std=c11" option is not supported by NVIDIA SDK but it looks like it is:

This is an issue of meson not knowing about the supported standards than, feel free to raise this upstream at the meson repository.

awvwgk avatar Jul 15 '22 15:07 awvwgk