C++ Static Library Build Issues

Hi all,

I'm trying to create an SPM module for a C++ static library.

Here's the directory structure of my SPM module:

.
├── Sources
│   └── Essentia
│       ├── include
│       │   └── essentia
│       │       ├── scheduler
│       │       │   ├── graphutils.h
│       │       │   ├── network.h
│       │       │   └── networkparser.h
│       │       ├── streaming
│       │       │   ├── accumulatoralgorithm.h
│       │       │   ├── multiratebuffer.h
│       │       │   ├── phantombuffer.h
│       │       │   ├── phantombuffer_impl.h
│       │       │   ├── sink.h
│       │       │   ├── sinkbase.h
│       │       │   ├── sinkproxy.h
│       │       │   ├── source.h
│       │       │   ├── sourcebase.h
│       │       │   ├── sourceproxy.h
│       │       │   ├── streamingalgorithm.h
│       │       │   ├── streamingalgorithmcomposite.h
│       │       │   └── streamingalgorithmwrapper.h
│       │       ├── utils
│       │       │   ├── extractor_freesound
│       │       │   │   ├── FreesoundDescriptorsSet.h
│       │       │   │   ├── FreesoundLowlevelDescriptors.h
│       │       │   │   ├── FreesoundRhythmDescriptors.h
│       │       │   │   ├── FreesoundSfxDescriptors.h
│       │       │   │   ├── FreesoundTonalDescriptors.h
│       │       │   │   └── extractor_version.h
│       │       │   ├── extractor_music
│       │       │   │   ├── MusicDescriptorsSet.h
│       │       │   │   ├── MusicLowlevelDescriptors.h
│       │       │   │   ├── MusicRhythmDescriptors.h
│       │       │   │   ├── MusicTonalDescriptors.h
│       │       │   │   ├── extractor_version.h
│       │       │   │   └── tagwhitelist.h
│       │       │   ├── tnt
│       │       │   │   ├── jama_cholesky.h
│       │       │   │   ├── jama_eig.h
│       │       │   │   ├── jama_lu.h
│       │       │   │   ├── jama_qr.h
│       │       │   │   ├── jama_svd.h
│       │       │   │   ├── tnt.h
│       │       │   │   ├── tnt2essentiautils.h
│       │       │   │   ├── tnt2vector.h
│       │       │   │   ├── tnt_array1d.h
│       │       │   │   ├── tnt_array1d_utils.h
│       │       │   │   ├── tnt_array2d.h
│       │       │   │   ├── tnt_array2d_utils.h
│       │       │   │   ├── tnt_array3d.h
│       │       │   │   ├── tnt_array3d_utils.h
│       │       │   │   ├── tnt_cmat.h
│       │       │   │   ├── tnt_fortran_array1d.h
│       │       │   │   ├── tnt_fortran_array1d_utils.h
│       │       │   │   ├── tnt_fortran_array2d.h
│       │       │   │   ├── tnt_fortran_array2d_utils.h
│       │       │   │   ├── tnt_fortran_array3d.h
│       │       │   │   ├── tnt_fortran_array3d_utils.h
│       │       │   │   ├── tnt_i_refvec.h
│       │       │   │   ├── tnt_math_utils.h
│       │       │   │   ├── tnt_sparse_matrix_csr.h
│       │       │   │   ├── tnt_stopwatch.h
│       │       │   │   ├── tnt_subscript.h
│       │       │   │   ├── tnt_vec.h
│       │       │   │   └── tnt_version.h
│       │       │   ├── MersenneTwister.h
│       │       │   ├── asciidag.h
│       │       │   ├── asciidagparser.h
│       │       │   ├── atomic.h
│       │       │   ├── audiocontext.h
│       │       │   ├── betools.h
│       │       │   ├── bpfutil.h
│       │       │   ├── bpmutil.h
│       │       │   ├── ffmpegapi.h
│       │       │   ├── jsonconvert.h
│       │       │   ├── metadatautils.h
│       │       │   ├── output.h
│       │       │   ├── peak.h
│       │       │   ├── ringbufferimpl.h
│       │       │   ├── synth_utils.h
│       │       │   ├── types.h
│       │       │   └── yamlast.h
│       │       ├── algorithm.h
│       │       ├── algorithmfactory.h
│       │       ├── algorithmfactory_impl.h
│       │       ├── config.h
│       │       ├── configurable.h
│       │       ├── connector.h
│       │       ├── debugging.h
│       │       ├── essentia.h
│       │       ├── essentiamath.h
│       │       ├── essentiautil.h
│       │       ├── iotypewrappers.h
│       │       ├── iotypewrappers_impl.h
│       │       ├── module.modulemap
│       │       ├── parameter.h
│       │       ├── pool.h
│       │       ├── range.h
│       │       ├── roguevector.h
│       │       ├── streamconnector.h
│       │       ├── streamutil.h
│       │       ├── stringutil.h
│       │       ├── threading.h
│       │       └── version.h
│       └── lib
│           └── libessentia.a
└── Package.swift

And here's the contents of my Package.swift file:

// swift-tools-version:5.7
import PackageDescription

let package = Package(
    name: "Essentia",
    products: [
        .library(
            name: "Essentia",
            targets: ["Essentia"]
        )
    ],
    targets: [
        .target(
            name: "Essentia",
            path: "Sources/Essentia",
            publicHeadersPath: "include/essentia",
            cxxSettings: [
                .headerSearchPath("include/essentia")
            ],
            linkerSettings: [
                .linkedLibrary("c++"),
                .unsafeFlags(["-LSources/Essentia/lib", "-lessentia"]),
            ]
        )
    ],
    cxxLanguageStandard: .cxx17
)

Notably, essentia.h is not implemented as a valid umbrella header. I added include/essentia/module.modulemap that looks like so:

module Essentia {
    header "scheduler/graphutils.h"
    header "scheduler/network.h"
    header "scheduler/networkparser.h"

    header "streaming/accumulatoralgorithm.h"
    header "streaming/multiratebuffer.h"
    header "streaming/phantombuffer.h"
    header "streaming/phantombuffer_impl.h"
    header "streaming/sink.h"
    header "streaming/sinkbase.h"
    header "streaming/sinkproxy.h"
    header "streaming/source.h"
    header "streaming/sourcebase.h"
    header "streaming/sourceproxy.h"
    header "streaming/streamingalgorithm.h"
    header "streaming/streamingalgorithmcomposite.h"
    header "streaming/streamingalgorithmwrapper.h"

    header "utils/extractor_freesound/FreesoundDescriptorsSet.h"
    header "utils/extractor_freesound/FreesoundLowlevelDescriptors.h"
    header "utils/extractor_freesound/FreesoundRhythmDescriptors.h"
    header "utils/extractor_freesound/FreesoundSfxDescriptors.h"
    header "utils/extractor_freesound/FreesoundTonalDescriptors.h"
    header "utils/extractor_freesound/extractor_version.h"

    header "utils/extractor_music/MusicDescriptorsSet.h"
    header "utils/extractor_music/MusicLowlevelDescriptors.h"
    header "utils/extractor_music/MusicRhythmDescriptors.h"
    header "utils/extractor_music/MusicTonalDescriptors.h"
    header "utils/extractor_music/extractor_version.h"
    header "utils/extractor_music/tagwhitelist.h"

    header "utils/tnt/jama_cholesky.h"
    header "utils/tnt/jama_eig.h"
    header "utils/tnt/jama_lu.h"
    header "utils/tnt/jama_qr.h"
    header "utils/tnt/jama_svd.h"
    header "utils/tnt/tnt.h"
    header "utils/tnt/tnt2essentiautils.h"
    header "utils/tnt/tnt2vector.h"
    header "utils/tnt/tnt_array1d.h"
    header "utils/tnt/tnt_array1d_utils.h"
    header "utils/tnt/tnt_array2d.h"
    header "utils/tnt/tnt_array2d_utils.h"
    header "utils/tnt/tnt_array3d.h"
    header "utils/tnt/tnt_array3d_utils.h"
    header "utils/tnt/tnt_cmat.h"
    header "utils/tnt/tnt_fortran_array1d.h"
    header "utils/tnt/tnt_fortran_array1d_utils.h"
    header "utils/tnt/tnt_fortran_array2d.h"
    header "utils/tnt/tnt_fortran_array2d_utils.h"
    header "utils/tnt/tnt_fortran_array3d.h"
    header "utils/tnt/tnt_fortran_array3d_utils.h"
    header "utils/tnt/tnt_i_refvec.h"
    header "utils/tnt/tnt_math_utils.h"
    header "utils/tnt/tnt_sparse_matrix_csr.h"
    header "utils/tnt/tnt_stopwatch.h"
    header "utils/tnt/tnt_subscript.h"
    header "utils/tnt/tnt_vec.h"
    header "utils/tnt/tnt_version.h"

    header "utils/MersenneTwister.h"
    header "utils/asciidag.h"
    header "utils/asciidagparser.h"
    header "utils/atomic.h"
    header "utils/audiocontext.h"
    header "utils/betools.h"
    header "utils/bpfutil.h"
    header "utils/bpmutil.h"
    header "utils/ffmpegapi.h"
    header "utils/jsonconvert.h"
    header "utils/metadatautils.h"
    header "utils/output.h"
    header "utils/peak.h"
    header "utils/ringbufferimpl.h"
    header "utils/synth_utils.h"
    header "utils/yamlast.h"

    header "algorithm.h"
    header "algorithmfactory.h"
    header "algorithmfactory_impl.h"
    header "config.h"
    header "configurable.h"
    header "connector.h"
    header "debugging.h"
    header "essentiamath.h"
    header "essentiautil.h"
    header "iotypewrappers.h"
    header "iotypewrappers_impl.h"
    header "parameter.h"
    header "pool.h"
    header "range.h"
    header "roguevector.h"
    header "streamconnector.h"
    header "streamutil.h"
    header "stringutil.h"
    header "threading.h"
    header "types.h"
    header "version.h"
    
    export *
}

When I build the SPM project in Xcode or run swift build on it, everything builds successfully.

In Xcode, on a fresh, empty, new project, I added the Package Dependency straightforwardly (e.g. Project Settings > Package Dependencies > +).

However, when I go to build the Xcode project with the dependency added, I get the following compiler error:

Build input file cannot be found: '/Users/joshavant/Library/Developer/Xcode/DerivedData/EssentiaTest-gduqrskidqpqctcbbjizgohcycrt/Build/Products/Debug/Essentia.o'. Did you forget to declare this file as an output of a script phase or custom build rule which produces it?

Any thoughts on what I might need to do here?