dma icon indicating copy to clipboard operation
dma copied to clipboard

Unable to compile on Solaris

Open mohag opened this issue 14 years ago • 10 comments

Hi,

Low priority.

dma version: 0.7

Unable to compile on Solaris 9 or 10.

The yacc does not support the -o option. Setting YACC to bison fixes that...

get-version.sh need to be edited to use bash. (The "$()" construct is not valid in real Bourne shell)

err.h needs some help to be found...

Output for Solaris 10 with GNU make is then: $ C_INCLUDE_PATH=/usr/sfw/include/openssl gmake get-version.sh: syntax error at line 3: gitver=$' unexpected gcc -O -pipe -Wall -DDMA_VERSION='""' -DLIBEXEC_PATH='"/usr/local/lib"' -DCONF_PATH='"/etc/dma"' -include dfcompat.h -o aliases_parse.o -c aliases_parse.c In file included from aliases_parse.y:5: **dma.h:111: error: redefinition ofstruct queue'** aliases_parse.y: In function yyerror': aliases_parse.y:15: warning: implicit declaration of functionwarnx' /usr/ccs/bin/yaccpar: At top level: /usr/ccs/bin/yaccpar:5: warning: ignoring #pragma ident /usr/ccs/bin/yaccpar: In function yyparse': /usr/ccs/bin/yaccpar:164: warning: labelyynewstate' defined but not used /usr/ccs/bin/yaccpar:374: warning: label `yyerrlab' defined but not used gmake: *** [aliases_parse.o] Error 1

It might be that it is mostly documentation problems... (Dependencies, etc is not clear from the README)

Thanks, Gert van den Berg

mohag avatar Jan 12 '12 14:01 mohag

Thanks for your report!

I'll look into changing the yacc command line.

$() is a valid command substitution according to SUS: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03; I think this is a Solaris specialty.

I'll have to see what I can do about err.h.

Could you tell me what defines struct queue?

corecode avatar Jan 12 '12 15:01 corecode

Hi, The Solaris sh man page is here: http://docs.oracle.com/cd/E19963-01/html/821-1461/sh-1.html

(There is a POSIX-compliant option in /usr/xpg4/bin, but it is not the default) (/bin is a symlink to /usr/bin on Solaris)

The Solaris sh seem to be an actual derivative of the Bourne shell... A version can be found here for testing: http://heirloom.sourceforge.net/sh.html

Solaris 11 uses ksh as its /bin/sh, which might work better. (It might make sense to mention in the documentation that a standard compliant /bin/sh is required)

bison works fine as yacc, it might make sense to mention in the readme (or a "INSTALL" file) which yacc is expected.

I'll try to find the gcc parameter that gives preprocessed code for the struct queue issue if I'm near the Solaris server again...

(Things like "make install" might also need work on Solaris - sendmail is installed and runs by default, but that is probably a matter for packagers / another issue)

An option to compile without OpenSSL might also have its uses (e.g. for embedded systems), but that should probably be a feature request.

For the documentation it might make sense to mention something like this: (I have not actually tested this list, specifying versions might also be necessary if some versions is known bad...) (Noting when POSIX-compliant versions is fine might also help) Requirements: cc - gcc is known to work yacc - bison works make - BSD make, GNU make works A POSIX compliant shell - edit get-version.sh to paoint to it if it is not in /bin/sh (Bash is known to work) lex - flex works openssl - version xxxx or newer, ensure that the headers can be found or add their location to C_INCLUDE_PATH install - BSD, GNU install works

Set the CC, YACC, INSTALL and LEX variable to relevant commands if you have problems.

Gert

mohag avatar Jan 12 '12 17:01 mohag

Thanks for the useful feedback. I'll try to update the docs as soon as I have time. If you send me a pull request, I can update them right away.

On 01/12/2012 06:48 PM, mohag wrote:

Hi, The Solaris sh man page is here: http://docs.oracle.com/cd/E19963-01/html/821-1461/sh-1.html

(There is a POSIX-compliant option in /usr/xpg4/bin, but it is not the default) (/bin is a symlink to /usr/bin on Solaris)

The Solaris sh seem to be an actual derivative of the Bourne shell... A version can be found here for testing: http://heirloom.sourceforge.net/sh.html

Solaris 11 uses ksh as its /bin/sh, which might work better. (It might make sense to mention in the documentation that a standard compliant /bin/sh is required)

bison works fine as yacc, it might make sense to mention in the readme (or a "INSTALL" file) which yacc is expected.

I'll try to find the gcc parameter that gives preprocessed code for the struct queue issue if I'm near the Solaris server again...

(Things like "make install" might also need work on Solaris - sendmail is installed and runs by default, but that is probably a matter for packagers / another issue)

An option to compile without OpenSSL might also have its uses (e.g. for embedded systems), but that should probably be a feature request.

For the documentation it might make sense to mention something like this: (I have not actually tested this list, specifying versions might also be necessary if some versions is known bad...) (Noting when POSIX-compliant versions is fine might also help) Requirements: cc - gcc is known to work yacc - bison works make - BSD make, GNU make works A POSIX compliant shell - edit get-version.sh to paoint to it if it is not in /bin/sh (Bash is known to work) lex - flex works openssl - version xxxx or newer, ensure that the headers can be found or add their location to C_INCLUDE_PATH install - BSD, GNU install works

Set the CC, YACC, INSTALL and LEX variable to relevant commands if you have problems.

Gert


Reply to this email directly or view it on GitHub: https://github.com/corecode/dma/issues/1#issuecomment-3467263

corecode avatar Jan 12 '12 18:01 corecode

Just some notes on shells: bash / ksh93 / dash / zsh works for get-version.sh (That is what my Linux PC had installed to test with)

mohag avatar Jan 12 '12 19:01 mohag

I pasted the preprocessor output here: https://gist.github.com/1604902

Looks like stream.h might be the culprit...

mohag avatar Jan 13 '12 06:01 mohag

The relevant man page: http://docs.oracle.com/cd/E19683-01/816-0226/6m6nqfv66/index.html

mohag avatar Jan 13 '12 06:01 mohag

Defining _XPG_4_2 gets rid of the stream.h header (for STREAMS), but it results in some IPv6 related things breaking:

$ C_INCLUDE_PATH=/usr/sfw/include/openssl gcc -O -pipe -Wall -D_XPG4_2 -DDMA_VERSION='"v0.7"' -DLIBEXEC_PATH='"/usr/local/lib"' -DCONF_PATH='"/etc/dma"'  -include dfcompat.h -c aliases_parse.c
In file included from aliases_parse.y:5:
dma.h:147: error: `INET6_ADDRSTRLEN' undeclared here (not in a function)
dma.h:149: error: field `ai' has incomplete type
dma.h:150: error: field `sa' has incomplete type
aliases_parse.y: In function `yyerror':
aliases_parse.y:15: warning: implicit declaration of function `warnx'

mohag avatar Jan 13 '12 07:01 mohag

Oh that is inconvenient... How can we get to the IPv6 stuff then?

corecode avatar Jan 13 '12 07:01 corecode

This fixes the queue issue: for file in *.y *.c *.h; do mv "$file" "$file.bak" sed "s/struct queue /struct dma_queue /g" "$file.bak" > "$file" done

paths.h is also missing. It seem to be present on Solaris 11 though: http://docs.oracle.com/cd/E23824_01/html/821-1464/paths.h-3head.html

Commenting out the #include for it and adding this in a few place makes process, but it still fails on later files: #ifndef _PATH_MAILDIR #define _PATH_MAILDIR "/var/mail" #endif

The later errors seem to be mainly related to LOCK_EX not being defined on Solaris.

(LOCK_EX is defined in the include files in /usr/ucbinclude, but adding them to C_INCLUDE_PATH causes other failures)

Hardcoding the path to the file.h in util.c and spool.c with LOCK_EX gets me further....

It then fails in dfcompat.c with: dfcompat.c:119:2: #error "no getprogname implementation available"

Using this as a replacement makes it compile: const char * getprogname(void) { return getexecname(); }

It then returns some linker errors:

gcc  -o dma aliases_parse.o aliases_scan.o base64.o conf.o crypto.o dma.o dns.o local.o mail.o net.o spool.o util.o dfcompat.o -lssl -lcrypto -lresolv
Undefined                       first referenced
 symbol                             in file
err                                 dma.o
errx                                dma.o
flock                               spool.o
warnx                               aliases_parse.o
__ns_name_uncompress                dns.o
socket                              net.o  (symbol belongs to implicit dependency /usr/lib/libsocket.so.1)
strsep                              conf.o
getnameinfo                         dns.o  (symbol belongs to implicit dependency /usr/lib/libsocket.so.1)
roundup                             dns.o
connect                             net.o  (symbol belongs to implicit dependency /usr/lib/libsocket.so.1)
asprintf                            dma.o
getaddrinfo                         dns.o  (symbol belongs to implicit dependency /usr/lib/libsocket.so.1)
freeaddrinfo                        dns.o  (symbol belongs to implicit dependency /usr/lib/libsocket.so.1)
ld: fatal: Symbol referencing errors. No output written to dma
collect2: ld returned 1 exit status
gmake: **\* [dma] Error 1

Adding -lsocket to LDADD in the Makefile shorten the list...

Undefined                       first referenced
 symbol                             in file
err                                 dma.o
errx                                dma.o
flock                               spool.o
warnx                               aliases_parse.o
__ns_name_uncompress                dns.o
strsep                              conf.o
roundup                             dns.o
asprintf                            dma.o
ld: fatal: Symbol referencing errors. No output written to dma
collect2: ld returned 1 exit status
gmake: *** [dma] Error 1```

The roudup error can be solved by adding:
    #include <sys/sysmacros.h>
to dns.c

The strsep can be remove from the list by replacing it with strtok.

That is about the amount of progress that I was able to make today.

I'm quite sure that it might work somewhat easier to install some packages (Its GCC / libgcc version especially) from sunfreeware / blastwave to get some of the dependencies, but that would prevent it from compiling on a standard install without third-party packages.

mohag avatar Jan 13 '12 08:01 mohag

Not defining _XPG_4_2 and renaming the "queue" type (my script above renames it to dma_queue) gets rid of the conflict and allows the IPv6 stuff.

mohag avatar Jan 13 '12 13:01 mohag