Hi,

ngircd 24 runs on the VoCore2 mini computer (mipsel/OpenWRT/uclibc): http://vocore.io/v2.html

Build system is Ubuntu 14.04 LTS x86_64 for cross-compiling, with the VoCore2/OpenWRT tools installed from <http://vocore.io/v2u.html> -> Downloads -> Toolchain: Download (Ubuntu 14.04 x64).

1) Unpack the toolchain
I unpacked these to ~/vocore2 and removed the "outer-shell" directories.


2) Prepare cross-build
$ PATH=$PATH:/home/goetz/vocore2/bin
$ export PATH
$ STAGING_DIR=/home/goetz/vocore2/
$ export STAGING_DIR


3) Fix "resolve.c"
Otherwise we’ll run into [1]:

$ diff ngircd-24/src/ngircd/resolve-orig.c ngircd-24/src/ngircd/resolve.c
112,113d111
< #if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO)
< #if !defined(WANT_IPV6) && defined(h_errno)
130,131d127
< #endif
< #endif

Basically, we need to “enforce” the definition of Get_Error. Without removing the conditionals, it will be missing and the cross-build will fail.


3) Configure for cross-build

$ ./configure --build=mipsel-unknown-linux-gnu --host=mipsel-openwrt-linux-uclibc --build=x86_64-unknown-linux-gnu

Check that the line
checking whether we are cross compiling... yes
is there.

The summary should look similar to:

ngIRCd 24 has been configured with the following options:

               Host: mipsel-openwrt-linux-uclibc
           Compiler: mipsel-openwrt-linux-uclibc-gcc -std=gnu99
     Compiler flags: -g -O2 -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes -DSYSCONFDIR='"$(sysconfdir)"' -DDOCDIR='"$(docdir)"'

    'ngircd' binary: /usr/local/sbin
 Configuration file: /usr/local/etc
       Manual pages: /usr/local/share/man
      Documentation: /usr/local/share/doc/ngircd

     Syslog support: yes     Enable debug code: no
   zlib compression: no            IRC sniffer: no
   Use TCP Wrappers: no        Strict RFC mode: no
      IDENT support: no          IRC+ protocol: yes
      IPv6 protocol: no            I/O backend: epoll(), select()
        PAM support: no            SSL support: no
   libiconv support: no


4) Build ngircd from source

$ make CC=mipsel-openwrt-linux-uclibc-gcc LD=mipsel-openwrt-linux-uclibc-ld


5) Check correct binary type

$ file src/ngircd/ngircd
src/ngircd/ngircd: ELF 32-bit LSB  executable, MIPS, MIPS32 rel2 version 1, dynamically linked (uses shared libs), not stripped

Looking good! Now you can copy over the binary to your VoCore2 and run it.


[1]: Error with unpatched resolve.c:
resolve.c: In function 'ForwardLookup':
resolve.c:285:11: warning: implicit declaration of function 'Get_Error' [-Wimplicit-function-declaration]
           hostname, Get_Error(h_errno));
           ^
resolve.c:236:56: warning: unused parameter 'af' [-Wunused-parameter]
 ForwardLookup(const char *hostname, array *IpAddr, int af)
                                                        ^
  CCLD   ngircd
client.o: In function `Client_Init':
ngircd-24/src/ngircd/client.c:94: warning: gethostbyname is obsolescent, use getnameinfo() instead.
resolve.o: In function `ForwardLookup':
ngircd-24/src/ngircd/resolve.c:284: undefined reference to `Get_Error'
collect2: error: ld returned 1 exit status


[2] Machine info:

BusyBox v1.23.2 (2016-09-03 09:56:08 CST) built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 CHAOS CALMER (Chaos Calmer, r49378)
 -----------------------------------------------------
  * 1 1/2 oz Gin            Shake with a glassful
  * 1/4 oz Triple Sec       of broken ice and pour
  * 3/4 oz Lime Juice       unstrained into a goblet.
  * 1 1/2 oz Orange Juice
  * 1 tsp. Grenadine Syrup
 -----------------------------------------------------
root@VoCore2:~# cat /proc/cpuinfo 
system type : MediaTek MT7628AN ver:1 eco:2
machine : VoCore2
processor : 0
cpu model : MIPS 24KEc V5.5
BogoMIPS : 385.84
wait instruction : yes
microsecond timers : yes
tlb_entries : 32
extra interrupt vector : yes
hardware watchpoint : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
isa : mips1 mips2 mips32r1 mips32r2
ASEs implemented : mips16 dsp
shadow register sets : 1
kscratch registers : 0
package : 0
core : 0
VCED exceptions : not available
VCEI exceptions : not available

root@VoCore2:~# free -m
             total         used         free       shared      buffers
Mem:        126476        37180        89296          252         4524
-/+ buffers:              32656        93820
Swap:            0            0            0

root@VoCore2:~# uname -a
Linux VoCore2 3.18.29 #22 Sun Oct 16 21:00:17 CST 2016 mips GNU/Linux

root@VoCore2:~# ./ngircd -n
[…]
[2803:4    0] No help text available, HELP command will be of limited use.
[2803:4    0] No administrative information configured but required by RFC!
[2803:5    0] ngIRCd 24-IRCPLUS+SYSLOG-mipsel/openwrt/linux-uclibc started.
[2803:6    0] Using configuration file "/usr/local/etc/ngircd.conf" ...
[2803:6    0] ServerUID must not be root(0), using "nobody" instead.
[2803:6    0] Running as user nobody(65534), group nogroup(65534), with PID 2803.
[2803:6    0] Not running with changed root directory.
[2803:6    0] IO subsystem: epoll (hint size 100, initial maxfd 100, masterfd 3).
[2803:6    0] Now listening on [0.0.0.0]:6667 (socket 6).

Regards
Götz
-- 
http://www.3rz.org