Duplicate declaration of time_t

I'm attempting to build a Swift project on Ubuntu 18.04 which includes mbedTLS in a C system library module.

When I attempt to build the C module, I get the following error:

/mbedTLS/include/mbedtls/platform_time.h:53:9: error: 
declaration of 'time_t' must be imported from module 'SwiftGlibc.POSIX.sys.types' before it is required 
typedef time_t mbedtls_time_t;
//usr/include/x86_64-linux-gnu/bits/types/time_t.h:7:18: note: previous declaration is here
typedef __time_t time_t;
/swift-client/Sources/Client/main.swift:4:8: error: could not build C module 'CMODULE'
import CMODULE

So it seems like the issue3 is that time_t is defined in both mbedTLS and also in the Swift system libraries.

How can I get around this issue?

You'll notice that the second time_t is actually defined in the system glibc headers, which the glibc modulemap is pulling in. My guess is that you're also hitting the long-standing SR-486, which I hit last year.

A variation of the workaround mentioned by Bryan Chan there should work, try adding /usr/include/x86_64-linux-gnu/bits/types/time_t.h to your mbedTLS modulemap, before this platform_time.h one or it won't work, or to the glibc.modulemap in the Swift toolchain's lib/swift/linux/x86_64 if that doesn't work.

Thanks for the reply!

I was also able to solve this by including the sys/types header in my umbrella header:

#include <sys/types.h>

I'm not sure if this approach has advantages or drawbacks compared to the solution you describe

OK, I assumed that all necessary headers were already included to use mbedTLS as a C library, and in my case the problem was Swift code from Foundation calling the Bionic libc headers, so there was no intermediary C header that I controlled and could edit. Anyway, Bryan Chan's original workaround in that bug report was to modify such a C header, so your fix is closer to what he suggested.