[PD-dev] qsort_r failure building puredata on Android?

Christof Ressi info at christofressi.com
Wed Oct 28 01:44:20 CET 2020


FYI, this is now fixed on current master via 
https://github.com/pure-data/pure-data/commit/afb43ee827ee84ac79e1f03c56384d29e249f785.

Christof

On 27.10.2020 16:49, Andi McClure wrote:
> I am building puredata via libpd on Android (a fork off 
> 0.51/d5766fd0). I am doing this by loading the libpd CMakeLists.txt 
> from my own CMakeLists invoked from gradle and then linking libpd in 
> my Android app.
>
> When it gets to the step of building libpd.so, it prints:
>
> libpd/CMakeFiles/libpd.dir/pure-data/src/x_text.c.o: In function 
> `text_define_sort':
>
> /path/to/repo/deps/libpd/pure-data/src/x_text.c:552: undefined 
> reference to `qsort_r'
>
>
> I asked around about this, and was told a few things:
> * Sometimes this kind of Android error magically goes away if you 
> fiddle with compileSdkVersion in gradle.
> * There is a list in this git repo:
> https://android.googlesource.com/platform/bionic/+/master/libc/libc.map.txt 
> <https://android.googlesource.com/platform/bionic/+/master/libc/libc.map.txt>
>    Of which libc symbols wind up in which binary in Android. However, 
> in current Android master, qsort_r is not in this list at all. Only qsort.
> * qsort_r is not a standard C function, it is a GNU thing, so it's 
> possible Android really just doesn't have it. If Android really 
> doesn't provide quicksort, it *might* be possible to fake qsort_r by 
> adding a single C++ file which wraps std::sort (this was added in 
> C++03 so Android *probably* has it), which doesn't have standard C 
> qsort's reentrancy problem.
>
> I found I was able to make it compile with the following patch:
>
> *diff --git a/src/x_text.c b/src/x_text.c*
>
> *index 44bf9521..18f3d9de 100644*
>
> *--- a/src/x_text.c*
>
> *+++ b/src/x_text.c*
>
> @@ -474,9 +474,9 @@equal:
>
> found in msvcrt (which indeed it isn't in).Rather than waste more time
>
> on this, just call qsort if we're Microsoft and single-instance.I hope 
> nobody
>
> will try to compile multi-instance Pd for 32-bit windows, but if they
>
> do, they might run into my qsort_s problem again. */
>
> -#if defined(_WIN32) && !defined(PDINSTANCE)
>
> +#if (defined(_WIN32) || defined(__ANDROID__)) && !defined(PDINSTANCE)
>
> #define MICROSOFT_STUPID_SORT
>
> static void *stupid_zkeyinfo;
>
> static int stupid_sortcompare(const void *z1, const void *z2) {
>
> return (text_sortcompare(z1, z2, stupid_zkeyinfo)); }
>
>
> So although I'm not exactly sure what x_text.c is doing here, I am 
> unblocked, I can proceed with my project as long as I don't need 
> multi-instance. But, I'd like to know, is this a known problem? I find 
> many references to people building PureData on Android but no one 
> seems to have hit this issue. If there is a known working 
> configuration for PureData on Android, what git revision of PureData 
> was it building and what NDK compileSdkVersion? Alternately, is it 
> possible the problem is not with my configuration, but with the libpd 
> CMakeLists, and this problem would go away if I added the right 
> #define or -l link argument?
>
> And if this is a new problem: Would a patch to address this be 
> welcome, and what approach would be preferred? Should I just submit a 
> patch triggering MICROSOFT_STUPID_SORT when __ANDROID__ is present?
>
> (I understand libpd is a different project from puredata and apologize 
> if this is the wrong place to ask given I'm building libpd. However 
> this seems (?) like a problem in the pure-data part of the code.)
>
> _______________________________________________
> Pd-dev mailing list
> Pd-dev at lists.iem.at
> https://lists.puredata.info/listinfo/pd-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puredata.info/pipermail/pd-dev/attachments/20201028/09340040/attachment.html>


More information about the Pd-dev mailing list