meson: Meson 0.52.0 no longer builds D shared libraries on Linux

The unit_threaded Meson build used to work fine. I built unit_threaded 0.10.3 using the Meson build of the time 2019-10-15 which I think was a Meson 0.51.1 setup from 2019-07-24. On upgrading the unit_threaded Git repository to try and build 0.10.4, Ninja did a rebuild of build files due to Meson 0.51.1 → 0.52.0 and now I get the error:

|> ninja
[31/35] Linking target libunit-threaded.so.0.10.4.
FAILED: libunit-threaded.so.0.10.4 
ldc2  -of=libunit-threaded.so.0.10.4 'unit-threaded@sha/.._source_unit_threaded_attrs.d.o' 'unit-threaded@sha/.._source_unit_threaded_io.d.o' 'unit-threaded@sha/.._source_unit_threaded_light.d.o' 'unit-threaded@sha/.._source_unit_threaded_package.d.o' 'unit-threaded@sha/.._source_unit_threaded_reflection.d.o' 'unit-threaded@sha/.._source_unit_threaded_should.d.o' 'unit-threaded@sha/.._source_unit_threaded_static_.d.o' 'unit-threaded@sha/.._source_unit_threaded_testcase.d.o' 'unit-threaded@sha/.._subpackages_assertions_source_unit_threaded_assertions.d.o' 'unit-threaded@sha/.._subpackages_exception_source_unit_threaded_exception.d.o' 'unit-threaded@sha/.._subpackages_from_source_unit_threaded_from.d.o' 'unit-threaded@sha/.._subpackages_integration_source_unit_threaded_integration.d.o' 'unit-threaded@sha/.._subpackages_mocks_source_unit_threaded_mock.d.o' 'unit-threaded@sha/.._subpackages_property_source_unit_threaded_property.d.o' 'unit-threaded@sha/.._subpackages_property_source_unit_threaded_randomized_benchmark.d.o' 'unit-threaded@sha/.._subpackages_property_source_unit_threaded_randomized_gen.d.o' 'unit-threaded@sha/.._subpackages_property_source_unit_threaded_randomized_package.d.o' 'unit-threaded@sha/.._subpackages_property_source_unit_threaded_randomized_random.d.o' 'unit-threaded@sha/.._subpackages_runner_source_unit_threaded_runner_attrs.d.o' 'unit-threaded@sha/.._subpackages_runner_source_unit_threaded_runner_factory.d.o' 'unit-threaded@sha/.._subpackages_runner_source_unit_threaded_runner_io.d.o' 'unit-threaded@sha/.._subpackages_runner_source_unit_threaded_runner_options.d.o' 'unit-threaded@sha/.._subpackages_runner_source_unit_threaded_runner_package.d.o' 'unit-threaded@sha/.._subpackages_runner_source_unit_threaded_runner_reflection.d.o' 'unit-threaded@sha/.._subpackages_runner_source_unit_threaded_runner_runner.d.o' 'unit-threaded@sha/.._subpackages_runner_source_unit_threaded_runner_static._.d.o' 'unit-threaded@sha/.._subpackages_runner_source_unit_threaded_runner_testcase.d.o' 'unit-threaded@sha/.._subpackages_runner_source_unit_threaded_runner_testsuite.d.o' 'unit-threaded@sha/.._subpackages_runner_source_unit_threaded_runner_traits.d.o' -L=--start-group -L-soname,libunit-threaded.so.0 -L=--end-group -L--allow-shlib-undefined -relocation-model=pic
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o:function _start: error: undefined reference to 'main'
collect2: error: ld returned 1 exit status
Error: /usr/bin/gcc failed with status: 1
[33/35] Compiling D object 'gen-ut-main@exe/.._gen_source_unit_threaded_runtime_runtime.d.o'.
ninja: build stopped: subcommand failed.

The Meson file for unit_threaded is:

# -*- mode: python; -*-

project(
    'unit-threaded',
    'd',
    version: '0.10.4',
    meson_version: '>=0.48',
    default_options: ['buildtype=release'],
)

main_source = run_command('sh', '-c', 'cd $MESON_SOURCE_ROOT && ls ../source/unit_threaded/*.d').stdout().split()
assertions_subpackage_source = run_command('sh', '-c', 'cd $MESON_SOURCE_ROOT && ls ../subpackages/assertions/source/unit_threaded/*.d').stdout().split()
exception_subpackage_source = run_command('sh', '-c', 'cd $MESON_SOURCE_ROOT && ls ../subpackages/exception/source/unit_threaded/*.d').stdout().split()
from_subpackage_source = run_command('sh', '-c', 'cd $MESON_SOURCE_ROOT && ls ../subpackages/from/source/unit_threaded/*.d').stdout().split()
integration_subpackage_source = run_command('sh', '-c', 'cd $MESON_SOURCE_ROOT && ls ../subpackages/integration/source/unit_threaded/*.d').stdout().split()
mocks_subpackage_source = run_command('sh', '-c', 'cd $MESON_SOURCE_ROOT && ls ../subpackages/mocks/source/unit_threaded/*.d').stdout().split()
property_subpackage_source = run_command('sh', '-c', 'cd $MESON_SOURCE_ROOT && ls ../subpackages/property/source/unit_threaded/*.d').stdout().split()
property_subpackage_randomized_source = run_command('sh', '-c', 'cd $MESON_SOURCE_ROOT && ls ../subpackages/property/source/unit_threaded/randomized/*.d').stdout().split()
runner_subpackage_source = run_command('sh', '-c', 'cd $MESON_SOURCE_ROOT && ls ../subpackages/runner/source/unit_threaded/runner/*.d').stdout().split()

# Treat the single source file packages differently to those with multiple files including a package.d file.
install_headers(main_source, subdir: 'd/unit_threaded')
install_headers(assertions_subpackage_source, subdir: 'd/unit_threaded')  # Single file package.
install_headers(exception_subpackage_source, subdir: 'd/unit_threaded')  # Single file package.
install_headers(from_subpackage_source, subdir: 'd/unit_threaded')  # Single file package.
install_headers(integration_subpackage_source, subdir: 'd/unit_threaded')  # Single file package.
install_headers(mocks_subpackage_source, subdir: 'd/unit_threaded')  # Single file package.
install_headers(property_subpackage_source, subdir: 'd/unit_threaded')  # Single file package.
install_headers(property_subpackage_randomized_source, subdir: 'd/unit_threaded/randomized')
install_headers(runner_subpackage_source, subdir: 'd/unit_threaded/runner')

include_dirs = [
    include_directories('../source/'),
    include_directories('../subpackages/assertions/source/'),
    include_directories('../subpackages/exception/source/'),
    include_directories('../subpackages/from/source/'),
    include_directories('../subpackages/integration/source/'),
    include_directories('../subpackages/mocks/source/'),
    include_directories('../subpackages/property/source/'),
    include_directories('../subpackages/runner/source/'),
]

lib = library(
    meson.project_name(),
    main_source +
        assertions_subpackage_source +
        exception_subpackage_source +
        from_subpackage_source +
        integration_subpackage_source +
        mocks_subpackage_source +
        property_subpackage_source +
        property_subpackage_randomized_source +
        runner_subpackage_source,
    include_directories: include_dirs,
    version: meson.project_version(),
    pic: true,
    install: true,
)

pkgconfig = import('pkgconfig')
pkgconfig.generate(
    name: meson.project_name(),
    libraries: lib,
    subdirs: 'd/',
    version: meson.project_version(),
    description: 'Advanced multi-threaded unit testing framework with minimal to no boilerplate using built-in unittest blocks.',
)

gen_ut_main_runtime_source = run_command('sh', '-c', 'cd $MESON_SOURCE_ROOT && ls ../gen/source/unit_threaded/runtime/*.d').stdout().split()

executable(
    'gen-ut-main',
    ['../gen/gen_ut_main.d'] + gen_ut_main_runtime_source,
    include_directories: include_dirs + [include_directories('../gen/source')],
    link_with: lib,
    link_args: ['-link-defaultlib-shared'],
    install: true,
)

unitthreaded_dep = declare_dependency(
    link_with: lib,
    include_directories: [include_dirs],
)

The unit_threaded Git repository is at: https://github.com/atilaneves/unit-threaded

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Comments: 15 (7 by maintainers)

Most upvoted comments

I retested the build of Unit_Threaded using Meson master and it seems to work fine. Thanks for fixing this regression.

It’s listed at the top of the merge request page: ldc2soname.