rrthomas / plptools

Tools for connection to EPOC devices
GNU General Public License v2.0
19 stars 8 forks source link

Where is plpfuse? #10

Closed mikeydelamonde closed 6 months ago

mikeydelamonde commented 6 months ago

I have run make install on my mac and got ncpd with plpftp working. I can see the following commands in these locations

/usr/local/bin/plpftp /usr/local/bin/sisinstall /usr/local/sbin/ncpd /usr/local/sbin/plpprintd

However, I can't find where plpfuse is, and there's no mention of it in the output of make. I have MacFUSE installed so hoping that I can use plpfuse. Any ideas? Thanks for your help!

rrthomas commented 6 months ago

Look at the output of ./configure, most likely it hasn't recognised/found your FUSE implementation, and is assuming you don't have FUSE.

I will happily accept patches to the documentation and/or configure.ac to explain how to get/change things so that the build system works with MacFUSE.

mikeydelamonde commented 6 months ago

Ah OK. I'll try that again as I might have installed MacFuse after configure

mikeydelamonde commented 6 months ago

Fuse related output is: checking for fuse >= 2.6... yes config.status: creating plpfuse/Makefile config.status: creating doc/plpfuse.man

rrthomas commented 6 months ago

Great, looks like you're good to go!

mikeydelamonde commented 6 months ago

Hmm then ran ./configure then make then make install but no mention of plpfuse in the outputs. Any other ideas?

mikeydelamonde commented 6 months ago

Could it be that there are some errors when running make install

Making install in plpftp
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl   -g -O2 -MT ftp.o -MD -MP -MF .deps/ftp.Tpo -c -o ftp.o ftp.cc
ftp.cc:1518:36: error: assigning to 'Function *' (aka 'int (*)(const char *, int)') from incompatible type 'char *(const char *, int)': different return type ('int' vs 'char *')
    rl_completion_entry_function = null_completion;
                                   ^~~~~~~~~~~~~~~
ftp.cc:1532:2: error: use of undeclared identifier 'rl_filename_quoting_desired'; did you mean 'rl_filename_completion_desired'?
        rl_filename_quoting_desired = 1;
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
        rl_filename_completion_desired
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/readline/readline.h:131:13: note: 'rl_filename_completion_desired' declared here
extern int              rl_filename_completion_desired;
                        ^
ftp.cc:1566:24: warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings]
    rl_readline_name = "plpftp";
                       ^
ftp.cc:1567:36: error: assigning to 'Function *' (aka 'int (*)(const char *, int)') from incompatible type 'char *(const char *, int)': different return type ('int' vs 'char *')
    rl_completion_entry_function = null_completion;
                                   ^~~~~~~~~~~~~~~
ftp.cc:1569:38: warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings]
    rl_basic_word_break_characters = " \t\n\"\\'`@><=;|&{(";

It doesn't seem to affect plpftp, but perhaps stops the execution?

rrthomas commented 6 months ago

Yes, you got a compilation error above. You are not using readline. See the macOS-specific instructions in README.

You can check the exit status to see if you got an error if you're not sure from the sometimes-confusing output of make.

rrthomas commented 6 months ago

@kapfab, I had not fully understood that macOS is claiming to have readline in some way (via libedit?) but it's not real. I could really do with an autoconf check for this, to avoid confusing macOS users like this. Any ideas?

kapfab commented 6 months ago

Yes, it comes with a BSD libedit version that includes a not-so-compatible readline.

We might check the readline version as it's way older than the GNU one everyone should have now?

rrthomas commented 6 months ago

Thanks, I'll look into that.

kapfab commented 6 months ago

Or maybe play with libhistory support (the macOS version has none AFAIR).

mikeydelamonde commented 6 months ago

I did install readline, just fyi. Homebrew says Warning: readline 8.2.7 is already installed and up-to-date.

rrthomas commented 6 months ago

OK, looks like libedit claims readline v4. Version 5 is already ancient, so I guess I can check for that.

mikeydelamonde commented 6 months ago

Yes the output of make is: make[1]: *** [ftp.o] Error 1 make: *** [install-recursive] Error 1

rrthomas commented 6 months ago

@mikeydelamonde see the instructions in README: you have to point the compiler at the right readline!

mikeydelamonde commented 6 months ago

Ah! Sorry!

rrthomas commented 6 months ago

OK, I see the problem, which is that Apple uses an outdated libedit that is simply broken. I think I can avoid both a macOS-specific test while keeping libedit compatibility by testing for readline version ≥ 4.3, as the fixed BSD libedit advertises 4.3, while Apple's libedit advertises 4.2.

rrthomas commented 6 months ago

Why Apple can't even update BSD-licensed software they use is beyond me…

kapfab commented 6 months ago

Seems fine. We could let the build go without readline if 4.3 or later is not found (it makes plpftp a bit cumbersome to use but it still works).

rrthomas commented 6 months ago

I have added a version check for libreadline to git master; I would be most obliged if someone could check that it now gives a nice error on macOS when GNU readline (or sufficiently new libedit) is not installed.

rrthomas commented 6 months ago

It doesn't seem to affect plpftp, but perhaps stops the execution?

I just realised I hadn't noticed this: plpftp was built despite the error. Weird. You had some bone fide errors, including an assignment to an unknown identifier. So there is no way that compilation produced an object file. I wonder how you got a plpftp binary…

rrthomas commented 6 months ago

Closing this issue; I will shortly make a new release with the build system fixes.

kapfab commented 6 months ago

Wasn't it just the binary generated by the previous successful build?

rrthomas commented 6 months ago

I had the impression from the report that @mikeydelamonde didn't change anything readline-related up to the point where he reported the error.

mikeydelamonde commented 6 months ago

I think that the previous build I did run the command that refers to the installed readline. I did that again now and didn’t get the errors, although still no plpfuse.

On Sat, 24 Feb 2024 at 11:04, Reuben Thomas @.***> wrote:

I had the impression from the report that @mikeydelamonde https://github.com/mikeydelamonde didn't change anything readline-related up to the point where he reported the error.

— Reply to this email directly, view it on GitHub https://github.com/rrthomas/plptools/issues/10#issuecomment-1962328962, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAI5UN5RPBXG7YKLAOVB5UDYVHCMJAVCNFSM6AAAAABDWW5NQCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTSNRSGMZDQOJWGI . You are receiving this because you were mentioned.Message ID: @.***>

rrthomas commented 6 months ago

@mikeydelamonde Thanks for the explanation. If configure says it is detecting FUSE OK, but is not building plpfuse, then that sounds like a bug and the issue should be reopened. To see what's happening, in the top-level directory, please grep BUILD_PLPFUSE config.log and also grep SUBDIRS Makefile and show the results.

mikeydelamonde commented 6 months ago

config.log Makefile.txt

I just did a fresh git pull and ran everything again, here's the results:

During .configure:

checking for fuse >= 2.6... yes
config.status: creating plpfuse/Makefile
config.status: creating doc/plpfuse.man

I've attached the config.log to this post..

grep BUILD_PLPFUSE config.log
BUILD_PLPFUSE_FALSE=''
BUILD_PLPFUSE_TRUE='#'

I've attached the Makefile (with .txt on the end) to this post..

grep SUBDIRS Makefile
DIST_SUBDIRS = po lib ncpd plpftp plpprint sisinstall doc plpfuse
SUBDIRS = po lib ncpd plpftp plpprint sisinstall doc $(am__append_1)
      distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
      *) list='$(SUBDIRS)' ;; \
    list='$(SUBDIRS)'; for subdir in $$list; do \
    @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \

Here's the whole output of make

/Library/Developer/CommandLineTools/usr/bin/make  all-recursive
Making all in po
make[2]: Nothing to be done for `all'.
Making all in lib
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT bufferarray.lo -MD -MP -MF .deps/bufferarray.Tpo -c -o bufferarray.lo bufferarray.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT bufferarray.lo -MD -MP -MF .deps/bufferarray.Tpo -c bufferarray.cc  -fno-common -DPIC -o .libs/bufferarray.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT bufferarray.lo -MD -MP -MF .deps/bufferarray.Tpo -c bufferarray.cc -o bufferarray.o >/dev/null 2>&1
mv -f .deps/bufferarray.Tpo .deps/bufferarray.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT bufferstore.lo -MD -MP -MF .deps/bufferstore.Tpo -c -o bufferstore.lo bufferstore.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT bufferstore.lo -MD -MP -MF .deps/bufferstore.Tpo -c bufferstore.cc  -fno-common -DPIC -o .libs/bufferstore.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT bufferstore.lo -MD -MP -MF .deps/bufferstore.Tpo -c bufferstore.cc -o bufferstore.o >/dev/null 2>&1
mv -f .deps/bufferstore.Tpo .deps/bufferstore.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT iowatch.lo -MD -MP -MF .deps/iowatch.Tpo -c -o iowatch.lo iowatch.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT iowatch.lo -MD -MP -MF .deps/iowatch.Tpo -c iowatch.cc  -fno-common -DPIC -o .libs/iowatch.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT iowatch.lo -MD -MP -MF .deps/iowatch.Tpo -c iowatch.cc -o iowatch.o >/dev/null 2>&1
mv -f .deps/iowatch.Tpo .deps/iowatch.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT ppsocket.lo -MD -MP -MF .deps/ppsocket.Tpo -c -o ppsocket.lo ppsocket.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT ppsocket.lo -MD -MP -MF .deps/ppsocket.Tpo -c ppsocket.cc  -fno-common -DPIC -o .libs/ppsocket.o
ppsocket.cc:135:2: warning: 'sprintf' is deprecated: This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead. [-Wdeprecated-declarations]
        sprintf(nbuf, "%d", ntohs(((struct sockaddr_in *) &m_HostAddr)->sin_port));
        ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h:180:1: note: 'sprintf' has been explicitly marked deprecated here
__deprecated_msg("This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead.")
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h:215:48: note: expanded from macro '__deprecated_msg'
        #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg)))
                                                      ^
ppsocket.cc:143:2: warning: 'sprintf' is deprecated: This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead. [-Wdeprecated-declarations]
        sprintf(nbuf, "%d", ntohs(((struct sockaddr_in *) &m_PeerAddr)->sin_port));
        ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h:180:1: note: 'sprintf' has been explicitly marked deprecated here
__deprecated_msg("This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead.")
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h:215:48: note: expanded from macro '__deprecated_msg'
        #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg)))
                                                      ^
2 warnings generated.
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT ppsocket.lo -MD -MP -MF .deps/ppsocket.Tpo -c ppsocket.cc -o ppsocket.o >/dev/null 2>&1
mv -f .deps/ppsocket.Tpo .deps/ppsocket.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT rfsv16.lo -MD -MP -MF .deps/rfsv16.Tpo -c -o rfsv16.lo rfsv16.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rfsv16.lo -MD -MP -MF .deps/rfsv16.Tpo -c rfsv16.cc  -fno-common -DPIC -o .libs/rfsv16.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rfsv16.lo -MD -MP -MF .deps/rfsv16.Tpo -c rfsv16.cc -o rfsv16.o >/dev/null 2>&1
mv -f .deps/rfsv16.Tpo .deps/rfsv16.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT rfsv32.lo -MD -MP -MF .deps/rfsv32.Tpo -c -o rfsv32.lo rfsv32.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rfsv32.lo -MD -MP -MF .deps/rfsv32.Tpo -c rfsv32.cc  -fno-common -DPIC -o .libs/rfsv32.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rfsv32.lo -MD -MP -MF .deps/rfsv32.Tpo -c rfsv32.cc -o rfsv32.o >/dev/null 2>&1
mv -f .deps/rfsv32.Tpo .deps/rfsv32.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT rfsvfactory.lo -MD -MP -MF .deps/rfsvfactory.Tpo -c -o rfsvfactory.lo rfsvfactory.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rfsvfactory.lo -MD -MP -MF .deps/rfsvfactory.Tpo -c rfsvfactory.cc  -fno-common -DPIC -o .libs/rfsvfactory.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rfsvfactory.lo -MD -MP -MF .deps/rfsvfactory.Tpo -c rfsvfactory.cc -o rfsvfactory.o >/dev/null 2>&1
mv -f .deps/rfsvfactory.Tpo .deps/rfsvfactory.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT log.lo -MD -MP -MF .deps/log.Tpo -c -o log.lo log.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT log.lo -MD -MP -MF .deps/log.Tpo -c log.cc  -fno-common -DPIC -o .libs/log.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT log.lo -MD -MP -MF .deps/log.Tpo -c log.cc -o log.o >/dev/null 2>&1
mv -f .deps/log.Tpo .deps/log.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT rfsv.lo -MD -MP -MF .deps/rfsv.Tpo -c -o rfsv.lo rfsv.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rfsv.lo -MD -MP -MF .deps/rfsv.Tpo -c rfsv.cc  -fno-common -DPIC -o .libs/rfsv.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rfsv.lo -MD -MP -MF .deps/rfsv.Tpo -c rfsv.cc -o rfsv.o >/dev/null 2>&1
mv -f .deps/rfsv.Tpo .deps/rfsv.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT rpcs32.lo -MD -MP -MF .deps/rpcs32.Tpo -c -o rpcs32.lo rpcs32.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rpcs32.lo -MD -MP -MF .deps/rpcs32.Tpo -c rpcs32.cc  -fno-common -DPIC -o .libs/rpcs32.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rpcs32.lo -MD -MP -MF .deps/rpcs32.Tpo -c rpcs32.cc -o rpcs32.o >/dev/null 2>&1
mv -f .deps/rpcs32.Tpo .deps/rpcs32.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT rpcs16.lo -MD -MP -MF .deps/rpcs16.Tpo -c -o rpcs16.lo rpcs16.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rpcs16.lo -MD -MP -MF .deps/rpcs16.Tpo -c rpcs16.cc  -fno-common -DPIC -o .libs/rpcs16.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rpcs16.lo -MD -MP -MF .deps/rpcs16.Tpo -c rpcs16.cc -o rpcs16.o >/dev/null 2>&1
mv -f .deps/rpcs16.Tpo .deps/rpcs16.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT rpcs.lo -MD -MP -MF .deps/rpcs.Tpo -c -o rpcs.lo rpcs.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rpcs.lo -MD -MP -MF .deps/rpcs.Tpo -c rpcs.cc  -fno-common -DPIC -o .libs/rpcs.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rpcs.lo -MD -MP -MF .deps/rpcs.Tpo -c rpcs.cc -o rpcs.o >/dev/null 2>&1
mv -f .deps/rpcs.Tpo .deps/rpcs.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT rpcsfactory.lo -MD -MP -MF .deps/rpcsfactory.Tpo -c -o rpcsfactory.lo rpcsfactory.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rpcsfactory.lo -MD -MP -MF .deps/rpcsfactory.Tpo -c rpcsfactory.cc  -fno-common -DPIC -o .libs/rpcsfactory.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rpcsfactory.lo -MD -MP -MF .deps/rpcsfactory.Tpo -c rpcsfactory.cc -o rpcsfactory.o >/dev/null 2>&1
mv -f .deps/rpcsfactory.Tpo .deps/rpcsfactory.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT psitime.lo -MD -MP -MF .deps/psitime.Tpo -c -o psitime.lo psitime.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT psitime.lo -MD -MP -MF .deps/psitime.Tpo -c psitime.cc  -fno-common -DPIC -o .libs/psitime.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT psitime.lo -MD -MP -MF .deps/psitime.Tpo -c psitime.cc -o psitime.o >/dev/null 2>&1
mv -f .deps/psitime.Tpo .deps/psitime.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT Enum.lo -MD -MP -MF .deps/Enum.Tpo -c -o Enum.lo Enum.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT Enum.lo -MD -MP -MF .deps/Enum.Tpo -c Enum.cc  -fno-common -DPIC -o .libs/Enum.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT Enum.lo -MD -MP -MF .deps/Enum.Tpo -c Enum.cc -o Enum.o >/dev/null 2>&1
mv -f .deps/Enum.Tpo .deps/Enum.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT plpdirent.lo -MD -MP -MF .deps/plpdirent.Tpo -c -o plpdirent.lo plpdirent.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT plpdirent.lo -MD -MP -MF .deps/plpdirent.Tpo -c plpdirent.cc  -fno-common -DPIC -o .libs/plpdirent.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT plpdirent.lo -MD -MP -MF .deps/plpdirent.Tpo -c plpdirent.cc -o plpdirent.o >/dev/null 2>&1
mv -f .deps/plpdirent.Tpo .deps/plpdirent.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT wprt.lo -MD -MP -MF .deps/wprt.Tpo -c -o wprt.lo wprt.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT wprt.lo -MD -MP -MF .deps/wprt.Tpo -c wprt.cc  -fno-common -DPIC -o .libs/wprt.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT wprt.lo -MD -MP -MF .deps/wprt.Tpo -c wprt.cc -o wprt.o >/dev/null 2>&1
mv -f .deps/wprt.Tpo .deps/wprt.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT rclip.lo -MD -MP -MF .deps/rclip.Tpo -c -o rclip.lo rclip.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rclip.lo -MD -MP -MF .deps/rclip.Tpo -c rclip.cc  -fno-common -DPIC -o .libs/rclip.o
rclip.cc:98:13: warning: enumeration value 'RCLIP_LISTEN' not handled in switch [-Wswitch]
    switch (cc) {
            ^~
rclip.cc:98:13: note: add missing switch cases
    switch (cc) {
            ^
1 warning generated.
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT rclip.lo -MD -MP -MF .deps/rclip.Tpo -c rclip.cc -o rclip.o >/dev/null 2>&1
mv -f .deps/rclip.Tpo .deps/rclip.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT siscomponentrecord.lo -MD -MP -MF .deps/siscomponentrecord.Tpo -c -o siscomponentrecord.lo siscomponentrecord.cpp
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT siscomponentrecord.lo -MD -MP -MF .deps/siscomponentrecord.Tpo -c siscomponentrecord.cpp  -fno-common -DPIC -o .libs/siscomponentrecord.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT siscomponentrecord.lo -MD -MP -MF .deps/siscomponentrecord.Tpo -c siscomponentrecord.cpp -o siscomponentrecord.o >/dev/null 2>&1
mv -f .deps/siscomponentrecord.Tpo .deps/siscomponentrecord.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT sisfile.lo -MD -MP -MF .deps/sisfile.Tpo -c -o sisfile.lo sisfile.cpp
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT sisfile.lo -MD -MP -MF .deps/sisfile.Tpo -c sisfile.cpp  -fno-common -DPIC -o .libs/sisfile.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT sisfile.lo -MD -MP -MF .deps/sisfile.Tpo -c sisfile.cpp -o sisfile.o >/dev/null 2>&1
mv -f .deps/sisfile.Tpo .deps/sisfile.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT sisfileheader.lo -MD -MP -MF .deps/sisfileheader.Tpo -c -o sisfileheader.lo sisfileheader.cpp
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT sisfileheader.lo -MD -MP -MF .deps/sisfileheader.Tpo -c sisfileheader.cpp  -fno-common -DPIC -o .libs/sisfileheader.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT sisfileheader.lo -MD -MP -MF .deps/sisfileheader.Tpo -c sisfileheader.cpp -o sisfileheader.o >/dev/null 2>&1
mv -f .deps/sisfileheader.Tpo .deps/sisfileheader.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT sisfilerecord.lo -MD -MP -MF .deps/sisfilerecord.Tpo -c -o sisfilerecord.lo sisfilerecord.cpp
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT sisfilerecord.lo -MD -MP -MF .deps/sisfilerecord.Tpo -c sisfilerecord.cpp  -fno-common -DPIC -o .libs/sisfilerecord.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT sisfilerecord.lo -MD -MP -MF .deps/sisfilerecord.Tpo -c sisfilerecord.cpp -o sisfilerecord.o >/dev/null 2>&1
mv -f .deps/sisfilerecord.Tpo .deps/sisfilerecord.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT sislangrecord.lo -MD -MP -MF .deps/sislangrecord.Tpo -c -o sislangrecord.lo sislangrecord.cpp
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT sislangrecord.lo -MD -MP -MF .deps/sislangrecord.Tpo -c sislangrecord.cpp  -fno-common -DPIC -o .libs/sislangrecord.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT sislangrecord.lo -MD -MP -MF .deps/sislangrecord.Tpo -c sislangrecord.cpp -o sislangrecord.o >/dev/null 2>&1
mv -f .deps/sislangrecord.Tpo .deps/sislangrecord.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT sisreqrecord.lo -MD -MP -MF .deps/sisreqrecord.Tpo -c -o sisreqrecord.lo sisreqrecord.cpp
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT sisreqrecord.lo -MD -MP -MF .deps/sisreqrecord.Tpo -c sisreqrecord.cpp  -fno-common -DPIC -o .libs/sisreqrecord.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT sisreqrecord.lo -MD -MP -MF .deps/sisreqrecord.Tpo -c sisreqrecord.cpp -o sisreqrecord.o >/dev/null 2>&1
mv -f .deps/sisreqrecord.Tpo .deps/sisreqrecord.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT sistypes.lo -MD -MP -MF .deps/sistypes.Tpo -c -o sistypes.lo sistypes.cpp
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT sistypes.lo -MD -MP -MF .deps/sistypes.Tpo -c sistypes.cpp  -fno-common -DPIC -o .libs/sistypes.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT sistypes.lo -MD -MP -MF .deps/sistypes.Tpo -c sistypes.cpp -o sistypes.o >/dev/null 2>&1
mv -f .deps/sistypes.Tpo .deps/sistypes.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT psibitmap.lo -MD -MP -MF .deps/psibitmap.Tpo -c -o psibitmap.lo psibitmap.cpp
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT psibitmap.lo -MD -MP -MF .deps/psibitmap.Tpo -c psibitmap.cpp  -fno-common -DPIC -o .libs/psibitmap.o
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT psibitmap.lo -MD -MP -MF .deps/psibitmap.Tpo -c psibitmap.cpp -o psibitmap.o >/dev/null 2>&1
mv -f .deps/psibitmap.Tpo .deps/psibitmap.Plo
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT psiprocess.lo -MD -MP -MF .deps/psiprocess.Tpo -c -o psiprocess.lo psiprocess.cc
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT psiprocess.lo -MD -MP -MF .deps/psiprocess.Tpo -c psiprocess.cc  -fno-common -DPIC -o .libs/psiprocess.o
psiprocess.cc:69:12: warning: returning address of local temporary object [-Wreturn-stack-address]
    return tmp.str().c_str();
           ^~~~~~~~~
1 warning generated.
libtool: compile:  g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I.. -I../intl -I/opt/homebrew/opt/readline/include -g -O2 -MT psiprocess.lo -MD -MP -MF .deps/psiprocess.Tpo -c psiprocess.cc -o psiprocess.o >/dev/null 2>&1
mv -f .deps/psiprocess.Tpo .deps/psiprocess.Plo
/bin/sh ../libtool  --tag=CXX   --mode=link g++ -std=gnu++11  -g -O2  -L/opt/homebrew/opt/readline/lib -o libplp.la -rpath /usr/local/lib/plptools bufferarray.lo bufferstore.lo iowatch.lo ppsocket.lo rfsv16.lo rfsv32.lo rfsvfactory.lo log.lo rfsv.lo rpcs32.lo rpcs16.lo rpcs.lo rpcsfactory.lo psitime.lo Enum.lo plpdirent.lo wprt.lo rclip.lo siscomponentrecord.lo sisfile.lo sisfileheader.lo sisfilerecord.lo sislangrecord.lo sisreqrecord.lo sistypes.lo psibitmap.lo psiprocess.lo  -lreadline
libtool: link: rm -fr  .libs/libplp.0.dylib .libs/libplp.a .libs/libplp.dylib .libs/libplp.la .libs/libplp.lai
libtool: link: g++ -std=gnu++11 -r -keep_private_externs -nostdlib -o .libs/libplp.0.dylib-master.o  .libs/bufferarray.o .libs/bufferstore.o .libs/iowatch.o .libs/ppsocket.o .libs/rfsv16.o .libs/rfsv32.o .libs/rfsvfactory.o .libs/log.o .libs/rfsv.o .libs/rpcs32.o .libs/rpcs16.o .libs/rpcs.o .libs/rpcsfactory.o .libs/psitime.o .libs/Enum.o .libs/plpdirent.o .libs/wprt.o .libs/rclip.o .libs/siscomponentrecord.o .libs/sisfile.o .libs/sisfileheader.o .libs/sisfilerecord.o .libs/sislangrecord.o .libs/sisreqrecord.o .libs/sistypes.o .libs/psibitmap.o .libs/psiprocess.o 
libtool: link: g++ -std=gnu++11 -dynamiclib -Wl,-undefined -Wl,dynamic_lookup -o .libs/libplp.0.dylib .libs/libplp.0.dylib-master.o  -L/opt/homebrew/opt/readline/lib -lreadline  -g -O2   -install_name  /usr/local/lib/plptools/libplp.0.dylib -compatibility_version 1 -current_version 1.0
libtool: link: (cd ".libs" && rm -f "libplp.dylib" && ln -s "libplp.0.dylib" "libplp.dylib")
libtool: link: ar cr .libs/libplp.a  bufferarray.o bufferstore.o iowatch.o ppsocket.o rfsv16.o rfsv32.o rfsvfactory.o log.o rfsv.o rpcs32.o rpcs16.o rpcs.o rpcsfactory.o psitime.o Enum.o plpdirent.o wprt.o rclip.o siscomponentrecord.o sisfile.o sisfileheader.o sisfilerecord.o sislangrecord.o sisreqrecord.o sistypes.o psibitmap.o psiprocess.o
libtool: link: ranlib .libs/libplp.a
libtool: link: ( cd ".libs" && rm -f "libplp.la" && ln -s "../libplp.la" "libplp.la" )
Making all in ncpd
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT channel.o -MD -MP -MF .deps/channel.Tpo -c -o channel.o channel.cc
mv -f .deps/channel.Tpo .deps/channel.Po
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT link.o -MD -MP -MF .deps/link.Tpo -c -o link.o link.cc
mv -f .deps/link.Tpo .deps/link.Po
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT linkchan.o -MD -MP -MF .deps/linkchan.Tpo -c -o linkchan.o linkchan.cc
mv -f .deps/linkchan.Tpo .deps/linkchan.Po
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cc
mv -f .deps/main.Tpo .deps/main.Po
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT ncp.o -MD -MP -MF .deps/ncp.Tpo -c -o ncp.o ncp.cc
mv -f .deps/ncp.Tpo .deps/ncp.Po
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT packet.o -MD -MP -MF .deps/packet.Tpo -c -o packet.o packet.cc
mv -f .deps/packet.Tpo .deps/packet.Po
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT socketchan.o -MD -MP -MF .deps/socketchan.Tpo -c -o socketchan.o socketchan.cc
mv -f .deps/socketchan.Tpo .deps/socketchan.Po
gcc -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -Wall -W -Wmissing-prototypes -Wstrict-prototypes -pedantic -MT mp_serial.o -MD -MP -MF .deps/mp_serial.Tpo -c -o mp_serial.o mp_serial.c
mv -f .deps/mp_serial.Tpo .deps/mp_serial.Po
/bin/sh ../libtool  --tag=CXX   --mode=link g++ -std=gnu++11  -g -O2  -L/opt/homebrew/opt/readline/lib -o ncpd channel.o link.o linkchan.o main.o ncp.o packet.o socketchan.o mp_serial.o ../lib/libplp.la -lpthread  -lreadline
libtool: link: g++ -std=gnu++11 -g -O2 -o .libs/ncpd channel.o link.o linkchan.o main.o ncp.o packet.o socketchan.o mp_serial.o -Wl,-bind_at_load  -L/opt/homebrew/opt/readline/lib ../lib/.libs/libplp.dylib -lpthread -lreadline
ld: warning: -bind_at_load is deprecated on macOS
Making all in plpftp
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT ftp.o -MD -MP -MF .deps/ftp.Tpo -c -o ftp.o ftp.cc
mv -f .deps/ftp.Tpo .deps/ftp.Po
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cc
mv -f .deps/main.Tpo .deps/main.Po
/bin/sh ../libtool  --tag=CXX   --mode=link g++ -std=gnu++11  -g -O2  -L/opt/homebrew/opt/readline/lib -o plpftp ftp.o main.o ../lib/libplp.la    -lreadline
libtool: link: g++ -std=gnu++11 -g -O2 -o .libs/plpftp ftp.o main.o -Wl,-bind_at_load  -L/opt/homebrew/opt/readline/lib ../lib/.libs/libplp.dylib -lreadline
ld: warning: -bind_at_load is deprecated on macOS
Making all in plpprint
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -DPKGDATADIR="\"/usr/local/share/plptools\"" -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT plpprintd-plpprintd.o -MD -MP -MF .deps/plpprintd-plpprintd.Tpo -c -o plpprintd-plpprintd.o `test -f 'plpprintd.cc' || echo './'`plpprintd.cc
plpprintd.cc:803:25: warning: 'sprintf' is deprecated: This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead. [-Wdeprecated-declarations]
                        sprintf(jname, "%s/%s", spooldir, TEMPLATE);
                        ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h:180:1: note: 'sprintf' has been explicitly marked deprecated here
__deprecated_msg("This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead.")
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h:215:48: note: expanded from macro '__deprecated_msg'
        #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg)))
                                                      ^
plpprintd.cc:786:21: warning: 73 enumeration values not handled in switch: 'E_PSI_INTERNAL', 'E_PSI_NOT_SIBO', 'E_PSI_FILE_HANDLE'... [-Wswitch]
            switch (wPrt->getData(buf)) {
                    ^~~~~~~~~~~~~~~~~~
plpprintd.cc:786:21: note: add missing switch cases
            switch (wPrt->getData(buf)) {
                    ^
2 warnings generated.
mv -f .deps/plpprintd-plpprintd.Tpo .deps/plpprintd-plpprintd.Po
/bin/sh ../libtool  --tag=CXX   --mode=link g++ -std=gnu++11  -g -O2  -L/opt/homebrew/opt/readline/lib -o plpprintd plpprintd-plpprintd.o ../lib/libplp.la  -lreadline
libtool: link: g++ -std=gnu++11 -g -O2 -o .libs/plpprintd plpprintd-plpprintd.o -Wl,-bind_at_load  -L/opt/homebrew/opt/readline/lib ../lib/.libs/libplp.dylib -lreadline
ld: warning: -bind_at_load is deprecated on macOS
Making all in sisinstall
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT psion.o -MD -MP -MF .deps/psion.Tpo -c -o psion.o psion.cpp
mv -f .deps/psion.Tpo .deps/psion.Po
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT sisinstaller.o -MD -MP -MF .deps/sisinstaller.Tpo -c -o sisinstaller.o sisinstaller.cpp
sisinstaller.cpp:106:9: warning: 'sprintf' is deprecated: This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead. [-Wdeprecated-declarations]
        sprintf(msgbuf,
        ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h:180:1: note: 'sprintf' has been explicitly marked deprecated here
__deprecated_msg("This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead.")
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h:215:48: note: expanded from macro '__deprecated_msg'
        #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg)))
                                                      ^
sisinstaller.cpp:259:25: warning: 'sprintf' is deprecated: This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead. [-Wdeprecated-declarations]
                        sprintf(sisname, "%s%s", SYSTEMINSTALL, file.getName());
                        ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h:180:1: note: 'sprintf' has been explicitly marked deprecated here
__deprecated_msg("This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead.")
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h:215:48: note: expanded from macro '__deprecated_msg'
        #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg)))
                                                      ^
sisinstaller.cpp:264:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
sisinstaller.cpp:347:25: warning: 'sprintf' is deprecated: This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead. [-Wdeprecated-declarations]
                        sprintf(msgbuf,
                        ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h:180:1: note: 'sprintf' has been explicitly marked deprecated here
__deprecated_msg("This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead.")
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h:215:48: note: expanded from macro '__deprecated_msg'
        #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg)))
                                                      ^
sisinstaller.cpp:373:9: warning: 'sprintf' is deprecated: This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead. [-Wdeprecated-declarations]
        sprintf(msgbuf, _("Installing component: `%s'"), compName);
        ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h:180:1: note: 'sprintf' has been explicitly marked deprecated here
__deprecated_msg("This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead.")
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h:215:48: note: expanded from macro '__deprecated_msg'
        #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg)))
                                                      ^
sisinstaller.cpp:414:25: warning: 7 enumeration values not handled in switch: 'SIS_OK', 'SIS_TRUNCATED', 'SIS_TRUNCATEDDATA'... [-Wswitch]
                switch (sisFile->compareApp(m_file))
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
sisinstaller.cpp:414:25: note: add missing switch cases
                switch (sisFile->compareApp(m_file))
                        ^
sisinstaller.cpp:446:25: warning: 'sprintf' is deprecated: This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead. [-Wdeprecated-declarations]
                        sprintf(msgbuf, "%s", _("Uninstalling the previous version first."));
                        ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h:180:1: note: 'sprintf' has been explicitly marked deprecated here
__deprecated_msg("This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead.")
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h:215:48: note: expanded from macro '__deprecated_msg'
        #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg)))
                                                      ^
sisinstaller.cpp:513:9: warning: 'sprintf' is deprecated: This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead. [-Wdeprecated-declarations]
        sprintf(resname, "C:\\System\\Install\\%.*s.sis", namelen, compName);
        ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h:180:1: note: 'sprintf' has been explicitly marked deprecated here
__deprecated_msg("This function is provided for compatibility reasons only.  Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead.")
^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h:215:48: note: expanded from macro '__deprecated_msg'
        #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg)))
                                                      ^
sisinstaller.cpp:547:48: warning: format specifies type 'unsigned long' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]
                                               plpdrive.getSpace(),
                                               ^~~~~~~~~~~~~~~~~~~
sisinstaller.cpp:548:48: warning: format specifies type 'unsigned long' but the argument has type 'uint64_t' (aka 'unsigned long long') [-Wformat]
                                               plpdrive.getSize());
                                               ^~~~~~~~~~~~~~~~~~
In file included from sisinstaller.cpp:7:
In file included from ./psion.h:4:
../lib/Enum.h:223:44: warning: returning address of local temporary object [-Wreturn-stack-address]
    operator const char *() const { return toString().c_str(); }
                                           ^~~~~~~~~~
sisinstaller.cpp:72:98: note: in instantiation of member function 'Enum<rfsv::errs>::operator const char *' requested here
                                                fprintf(stderr, " -> Failed: %s\n", (const char*)res);
                                                                                                 ^
11 warnings generated.
mv -f .deps/sisinstaller.Tpo .deps/sisinstaller.Po
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT sismain.o -MD -MP -MF .deps/sismain.Tpo -c -o sismain.o sismain.cpp
mv -f .deps/sismain.Tpo .deps/sismain.Po
g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I..  -I../lib -I../intl -I/opt/homebrew/opt/readline/include  -g -O2 -MT fakepsion.o -MD -MP -MF .deps/fakepsion.Tpo -c -o fakepsion.o fakepsion.cpp
mv -f .deps/fakepsion.Tpo .deps/fakepsion.Po
/bin/sh ../libtool  --tag=CXX   --mode=link g++ -std=gnu++11  -g -O2  -L/opt/homebrew/opt/readline/lib -o sisinstall psion.o sisinstaller.o sismain.o fakepsion.o sisfilelink.o ../lib/libplp.la  -lreadline
libtool: link: g++ -std=gnu++11 -g -O2 -o .libs/sisinstall psion.o sisinstaller.o sismain.o fakepsion.o sisfilelink.o -Wl,-bind_at_load  -L/opt/homebrew/opt/readline/lib ../lib/.libs/libplp.dylib -lreadline
ld: warning: -bind_at_load is deprecated on macOS
Making all in doc
rm -f ncpd.8 ncpd.8.tmp
sed -e 's|@MANDATE@|'`git log --pretty=format:"%ad" --date=short -1 ncpd.man.in`'|g' -e 's|@pkgdatadir[@]|/usr/local/share/plptools|g' ncpd.man >ncpd.8.tmp
mv ncpd.8.tmp ncpd.8
rm -f plpftp.1 plpftp.1.tmp
sed -e 's|@MANDATE@|'`git log --pretty=format:"%ad" --date=short -1 plpftp.man.in`'|g' -e 's|@pkgdatadir[@]|/usr/local/share/plptools|g' plpftp.man >plpftp.1.tmp
mv plpftp.1.tmp plpftp.1
rm -f sisinstall.1 sisinstall.1.tmp
sed -e 's|@MANDATE@|'`git log --pretty=format:"%ad" --date=short -1 sisinstall.man.in`'|g' -e 's|@pkgdatadir[@]|/usr/local/share/plptools|g' sisinstall.man >sisinstall.1.tmp
mv sisinstall.1.tmp sisinstall.1
rm -f plpprintd.8 plpprintd.8.tmp
sed -e 's|@MANDATE@|'`git log --pretty=format:"%ad" --date=short -1 plpprintd.man.in`'|g' -e 's|@pkgdatadir[@]|/usr/local/share/plptools|g' plpprintd.man >plpprintd.8.tmp
mv plpprintd.8.tmp plpprintd.8
make[2]: Nothing to be done for `all-am'.
rrthomas commented 6 months ago

Looks good, what happens when you build?

-- https://rrt.sc3d.org

On Sat, 24 Feb 2024, 12:39 mikeydelamonde, @.***> wrote:

I just did a fresh git pull and ran everything again, here's the results:

grep BUILD_PLPFUSE config.log BUILD_PLPFUSE_FALSE='' BUILD_PLPFUSE_TRUE='#'

DIST_SUBDIRS = po lib ncpd plpftp plpprint sisinstall doc plpfuse SUBDIRS = po lib ncpd plpftp plpprint sisinstall doc $(am__append_1) distclean- | maintainer-clean-) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ list='$(SUBDIRS)'; for subdir in $$list; do \ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do ```

— Reply to this email directly, view it on GitHub https://github.com/rrthomas/plptools/issues/10#issuecomment-1962350169, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAEHZVBERWTLT3VQJV4C3DYVHNRJAVCNFSM6AAAAABDWW5NQCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTSNRSGM2TAMJWHE . You are receiving this because you modified the open/close state.Message ID: @.***>

kapfab commented 6 months ago

Same here: no error but plpfuse is not build.

Looking at the configure output, I see:

checking for fuse >= 2.6... yes
checking for attr/attributes.h... no

attr/attributes.h seems to be required by plpfuse, that might be why it does not get built.

rrthomas commented 6 months ago

But it will have tried to build it. What do the logs say?

-- https://rrt.sc3d.org

On Sat, 24 Feb 2024, 14:58 Capt.Fab., @.***> wrote:

Same here: no error but plpfuse is not build.

Looking at the configure output, I see:

checking for fuse >= 2.6... yes checking for attr/attributes.h... no

attr/attributes.h seems to be required by plpfuse, that might be why it does not get built.

— Reply to this email directly, view it on GitHub https://github.com/rrthomas/plptools/issues/10#issuecomment-1962394474, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAEHZUTAZUPFMHNPCHZPDLYVH5ZXAVCNFSM6AAAAABDWW5NQCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTSNRSGM4TINBXGQ . You are receiving this because you modified the open/close state.Message ID: @.***>

kapfab commented 6 months ago

No, it doesn’t even try.

Makefile shows:

SUBDIRS = po lib ncpd plpftp plpprint sisinstall doc $(am__append_1)

but am__append_1 is commented:

#am__append_1 = plpfuse

In configure.ac:

AC_CHECK_HEADER(attr/attributes.h,, enable_fuse=no)
kapfab commented 6 months ago

Seeing

checking for fuse >= 2.6... yes
config.status: creating plpfuse/Makefile
config.status: creating doc/plpfuse.man

and

DIST_SUBDIRS = po lib ncpd plpftp plpprint sisinstall doc plpfuse

initially made me think everything was fine.

kapfab commented 6 months ago

I didn’t expect that, but plpfuse builds without any related warning when running make in its module directory after commenting the attr/attributes.h include and the -lattr option.

I have no way to check how the binary behaves with MacFuse running as I don’t want to circumvent the OS security settings to actually activate MacFuse on my machine but I expected to get compiling errors due to libattr missing…

rrthomas commented 6 months ago

Sorry, I misread your results earlier. Indeed, it's not trying to build plpfuse for you, and the reason is that it needs libattr.

kapfab commented 6 months ago

But does plpfuse actually need libattr ? I can’t find it used anywhere in the source code.

rrthomas commented 6 months ago

Good question, it seems that it's only preprocessor constants that are needed. However, in principle there's nothing that says they will be preprocessor constants rather than values defined in the library, and in any case, the relevant headers are needed.

However, I'd be prepared to bet they are always preprocessor constants in practice. That means that indeed plpfuse only needs headers.

rrthomas commented 6 months ago

I've committed a change so that only the headers are now required; can you possibly build master HEAD @kapfab and let me know if that fixes things?

kapfab commented 6 months ago

I can't try for now but the header file won't be found anyway. Do you know which libattr attributes are used? They might be found in another macOS standard header…

rrthomas commented 6 months ago

As I understand it, macOS has /usr/include/sys/xattr.h (according to the man page anyway), so that should be fine. The libattr header file won't be found, but that doesn't matter, because it doesn't stop the configure check from passing.

rrthomas commented 6 months ago

Anyway, if you can give this a try when you have a chance, I'll get another release out. It will be good to sort out macOS support!

kapfab commented 6 months ago

Same result as it can’t find attr/attributes.h.

rrthomas commented 6 months ago

Thanks for bearing with me! I believe that header isn't needed either, so I've removed the reference to it. Try again?

rrthomas commented 6 months ago

Hmm, I take it back, it could be needed to define ENOATTR on some systems, so I'll restore its use but make it optional.

rrthomas commented 6 months ago

Done!

kapfab commented 6 months ago

plpfuse now gets built along with the other modules.

But I’m afraid it won’t be that simple…

There are two compile warnings that need a bit of attention:

fuse.c:575:19: warning: initialization of 'int (*)(const char *, const char *, const char *, size_t,  int,  uint32_t)' {aka 'int (*)(const char *, const char *, const char *, long unsigned int,  int,  unsigned int)'} from incompatible pointer type 'int (*)(const char *, const char *, const char *, size_t,  int)' {aka 'int (*)(const char *, const char *, const char *, long unsigned int,  int)'} [-Wincompatible-pointer-types]
  575 |   .setxattr     = plp_setxattr,
      |                   ^~~~~~~~~~~~
fuse.c:575:19: note: (near initialization for 'plp_oper.setxattr')
fuse.c:576:19: warning: initialization of 'int (*)(const char *, const char *, char *, size_t,  uint32_t)' {aka 'int (*)(const char *, const char *, char *, long unsigned int,  unsigned int)'} from incompatible pointer type 'int (*)(const char *, const char *, char *, size_t)' {aka 'int (*)(const char *, const char *, char *, long unsigned int)'} [-Wincompatible-pointer-types]
  576 |   .getxattr     = plp_getxattr,
      |                   ^~~~~~~~~~~~
fuse.c:576:19: note: (near initialization for 'plp_oper.getxattr')

For reference, an extract of man setxattr on macOS:

include <sys/xattr.h>

int setxattr(const char path, const char name, void *value, size_t size, u_int32_t position, int options);

setxattr() associates name and data together as an attribute of path.

An extended attribute's name is a simple NULL-terminated UTF-8 string. Value is a pointer to a data buffer of size bytes containing textual or binary data to be associated with the extended attribute. Position specifies the offset within the extended attribute. In the current implementation, only the resource fork extended attribute makes use of this argument. For all others, position is reserved and should be set to zero.

whereas on Linux:

include <sys/xattr.h>

int setxattr(const char path, const char name, const void value[.size], size_t size, int flags);

setxattr() sets the value of the extended attribute identified by name and associated with the given path in the filesystem. The size argument specifies the size (in bytes) of value; a zero-length value is permitted.

An extended attribute name is a null-terminated string. The name includes a namespace prefix; there may be several, disjoint namespaces associated with an individual inode. The value of an extended attribute is a chunk of arbitrary textual or binary data of specified length.

mikeydelamonde commented 6 months ago

Just to finish this off - I built it again and now it works - just browsed the filesystem using the MacOS Finder! That's everything working so thanks to all of you for getting it going.

kapfab commented 6 months ago

That's good news but I'm surprised all works fine with the differences between both xattr implementations!

rrthomas commented 6 months ago

@kapfab I'm less surprised this works. Note that plpfuse does not call setxattr. What matters is the API for the setxattr member of the fuse_operations struct.

Here, macFUSE cleverly reverses the last two arguments, so that, up to the penultimate, they are compatible with Linux. I guess this happens to work with the macOS ABI, in that the last argument position is passed but ignored? Note further from the macOS man page: "In the current implementation, only the resource fork extended attribute makes use of this argument. For all others, position is reserved and should be set to zero."

I can't find any relevant documentation for macFUSE, so I'm not sure what I can do other than replicate what happens in macFUSE's fuse.h:

#ifdef __APPLE__
    int (*setxattr) (const char *, const char *, const char *, size_t, int, uint32_t);
#else
    int (*setxattr) (const char *, const char *, const char *, size_t, int);
#endif

…which is not great, but hey. I'll do it.

kapfab commented 6 months ago

Not great but that's a lesser evil!

rrthomas commented 6 months ago

Fix pushed; I'd be most grateful if you can try again!