[Problem] Paket erstellen für ISC dhcpd - Compileprobleme

silanea

Neuer User
Mitglied seit
18 Jan 2013
Beiträge
11
Punkte für Reaktionen
0
Punkte
1
Hallo!

Ich habe auf meiner 7390 seit gut einem Jahr den ISC dhcpd laufen. Bislang habe ich diesen immer händisch kompiliert und dann auf die Box geschoben. Mit der neuen Firmware habe ich nun beschlossen, das Ganze endlich vernünftig anzugehen und ein sauberes Freetz-Paket daraus zu machen. Allerdings hat der dhcpd beim Cross-Compile eine unangenehme Besonderheit: Er benötigt eine zusätzliche Datei im source tree und einen configure-Parameter. Eigentlich nicht wild, dachte ich. Bis gestern Abend. Ich habe es mit einem Patch versucht, ich habe im Makefile herumgedoktert, aber ich bekomme es einfach nicht hin. Auch das Absuchen der Makefiles und Patches anderer Pakete brachte mir keine funktionierende Idee. Kann mir hier jemand weiterhelfen?

Das Ganze auf trunk (11532), .config kann ich bei Bedarf gerne zur Verfügung stellen wenn das hilft.

Benötigte Datei: {entpackte Source}/config.cache
Code:
ac_cv_file__dev_random=yes

make/dhcp/dhcp.mk
Code:
$(call PKG_INIT_BIN, 4.2.5-P1)
$(PKG)_SOURCE:=dhcp-$($(PKG)_VERSION).tar.gz
$(PKG)_SOURCE_MD5:=f68e3c1f00a9af5742bc5e71d567cf93
$(PKG)_SITE:=http://ftp.mirrorservice.org/sites/ftp.isc.org/isc/dhcp/$($(PKG)_VERSION)
$(PKG)_BINARY:=$($(PKG)_DIR)/server/dhcpd
$(PKG)_TARGET_BINARY:=$($(PKG)_DEST_DIR)/usr/sbin/dhcpd

# --- Vor Aufruf von .configure eine vorbereitete config.cache aus dem make/dhcp-Verzeichnis ins build-Verzeichnis kopieren
$(PKG)_CONFIGURE_PRE_CMDS += (cp $(MAKE_DIR)/dhcp/config.cache $($(PKG)_DIR)/)

# --- Das ist der zusätzlich notwendige configure-Parameter:
$(PKG)_CONFIGURE_OPTIONS += --cache-file=config.cache

$(PKG_SOURCE_DOWNLOAD)
$(PKG_UNPACKED):
        touch $($(PKG)_DIR)/config.cache

$(PKG_CONFIGURED_CONFIGURE)

$($(PKG)_BINARY): $($(PKG)_DIR)/.configured
        $(SUBMAKE) -C $(DHCP_DIR) \
                CC="$(TARGET_CC)" \
                CFLAGS="$(TARGET_CFLAGS)"

$($(PKG)_TARGET_BINARY): $($(PKG)_BINARY)
        $(INSTALL_BINARY_STRIP)

$(pkg):

$(pkg)-precompiled: $($(PKG)_TARGET_BINARY)

$(pkg)-clean:
        -$(SUBMAKE) -C $(DHCP_DIR) clean
        $(RM) $(DHCP_DIR)/.configured

$(pkg)-uninstall:
        $(RM) $(DHCP_TARGET_BINARY)

$(PKG_FINISH)

Nachdem Pastebin hier anscheinend geschasst wird, muss ich den Output leider so hier reinklatschen:
Code:
freetz@freetz-linux:~/freetz-source/trunk$ make
mkdir -p packages/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/root
if test -d make/dhcp/files; then tar -c -C make/dhcp/files --exclude=.svn . | tar -x -C packages/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1 ; fi
---> package/dhcp: preparing... tools/gunzip -c dl/dhcp-4.2.5-P1.tar.gz | tar -C source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl -x
set -e; shopt -s nullglob; for i in make/dhcp/patches/*.patch; do tools/freetz_patch source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1 $i; done
configuring... (conf_cmd() { ./configure  "$@"  || { printf "\n\\033[33m%s\\033[m\n" "ERROR: Build failed.";  exit 1; } }; cd source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1;   rm -f config.{cache,status}; (cp make/dhcp/config.cache source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/)   PATH="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin:/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3/mips-unknown-linux-gnu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" CC="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-gcc" CXX="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-g++-wrapper" CFLAGS="-march=24kc -Os -pipe -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" CXXFLAGS="-march=24kc -Os -pipe -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" LDFLAGS="" PKG_CONFIG_PATH="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/../lib/pkgconfig" PKG_CONFIG_LIBDIR="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/../lib/pkgconfig" GLOBAL_LIBDIR=/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/usr/lib  FREETZ_TARGET_LFS="y" CONFIG_SITE=/home/freetz/freetz-source/trunk/include/site/mips-linux-uclibc conf_cmd   --cache-file=/home/freetz/freetz-source/trunk/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/config.cache --target=mips-linux --host=mips-linux --build=i386-pc-linux-gnu --program-prefix="" --program-suffix="" --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --datadir=/usr/share --includedir=/usr/include --infodir=/usr/share/info --libdir=/usr/lib --libexecdir=/usr/lib --localstatedir=/var --mandir=/usr/share/man --sbindir=/usr/sbin --sysconfdir=/etc --with-gnu-ld --disable-nls  --cache-file=config.cache    )
/bin/bash: -c: line 0: syntax error near unexpected token `PATH="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin:/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3/mips-unknown-linux-gnu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"'
/bin/bash: -c: line 0: `(conf_cmd() { ./configure  "$@"  || { printf "\n\\033[33m%s\\033[m\n" "ERROR: Build failed.";  exit 1; } }; cd source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1;   rm -f config.{cache,status}; (cp make/dhcp/config.cache source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/)   PATH="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin:/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3/mips-unknown-linux-gnu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" CC="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-gcc" CXX="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-g++-wrapper" CFLAGS="-march=24kc -Os -pipe -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" CXXFLAGS="-march=24kc -Os -pipe -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" LDFLAGS="" PKG_CONFIG_PATH="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/../lib/pkgconfig" PKG_CONFIG_LIBDIR="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/../lib/pkgconfig" GLOBAL_LIBDIR=/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/usr/lib  FREETZ_TARGET_LFS="y" CONFIG_SITE=/home/freetz/freetz-source/trunk/include/site/mips-linux-uclibc conf_cmd   --cache-file=/home/freetz/freetz-source/trunk/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/config.cache --target=mips-linux --host=mips-linux --build=i386-pc-linux-gnu --program-prefix="" --program-suffix="" --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --datadir=/usr/share --includedir=/usr/include --infodir=/usr/share/info --libdir=/usr/lib --libexecdir=/usr/lib --localstatedir=/var --mandir=/usr/share/man --sbindir=/usr/sbin --sysconfdir=/etc --with-gnu-ld --disable-nls  --cache-file=config.cache    )'
make: *** [source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/.configured] Error 1
Das Kopieren der Datei erfolgt nicht. Wahrscheinlich Syntaxfehler meinerseits? Bin mit Makefiles noch nicht so oft in Berührung gekommen.

Alternativ habe ich es mit einem Patch versucht, der die benötigte Datei erzeugen soll, dann natürlich ohne die CONFIGURE_PRE_CMDS-Zeile im Makefile:

make/dhcp/patches/100-cache.patch

Code:
--- /dev/null   2014-01-10 15:17:35.640216409 +0100
+++ config.cache       2014-01-10 23:03:42.290864495 +0100
@@ -0,0 +1,1 @@
+ac_cv_file__dev_random=yes
Die Datei existiert im source tree nicht, deshalb das /dev/null als Quelldatei oben, den Tip habe ich ergoogelt, ich weiß aber nicht ob das wirklich der korrekte Weg ist. Die Datei wird auch erstellt, ist nach dem .configure-Durchlauf aber leer, wobei es normal ist dass im Durchlauf der Dateiinhalt verändert wird, ergo weiß ich nicht ob der Patch einfach nicht den korrekten Inhalt schreibt oder ob .configure die Datei nur im Durchlauf leert. Beim manuellen Compile wird die Datei aber kräftig gefüllt, also scheint hier eher ein Fehler vorzuliegen.

Der Output dieser Variante:

Code:
freetz@freetz-linux:~/freetz-source/trunk$ make
mkdir -p packages/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/root
if test -d make/dhcp/files; then tar -c -C make/dhcp/files --exclude=.svn . | tar -x -C packages/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1 ; fi
---> package/dhcp: preparing... tools/gunzip -c dl/dhcp-4.2.5-P1.tar.gz | tar -C source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl -x
set -e; shopt -s nullglob; for i in make/dhcp/patches/*.patch; do tools/freetz_patch source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1 $i; done
    applying patch file make/dhcp/patches/100-cache.patch
    patching file config.cache
    ----------------------------------------------------------------------
configuring... (conf_cmd() { ./configure  "$@"  || { printf "\n\\033[33m%s\\033[m\n" "ERROR: Build failed.";  exit 1; } }; cd source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1;   rm -f config.{cache,status};    PATH="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin:/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3/mips-unknown-linux-gnu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" CC="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-gcc" CXX="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-g++-wrapper" CFLAGS="-march=24kc -Os -pipe -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" CXXFLAGS="-march=24kc -Os -pipe -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" LDFLAGS="" PKG_CONFIG_PATH="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/../lib/pkgconfig" PKG_CONFIG_LIBDIR="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/../lib/pkgconfig" GLOBAL_LIBDIR=/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/usr/lib  FREETZ_TARGET_LFS="y" CONFIG_SITE=/home/freetz/freetz-source/trunk/include/site/mips-linux-uclibc conf_cmd   --cache-file=/home/freetz/freetz-source/trunk/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/config.cache --target=mips-linux --host=mips-linux --build=i386-pc-linux-gnu --program-prefix="" --program-suffix="" --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --datadir=/usr/share --includedir=/usr/include --infodir=/usr/share/info --libdir=/usr/lib --libexecdir=/usr/lib --localstatedir=/var --mandir=/usr/share/man --sbindir=/usr/sbin --sysconfdir=/etc --with-gnu-ld --disable-nls  --cache-file=config.cache    )
configure: loading site script /home/freetz/freetz-source/trunk/include/site/mips-linux-uclibc
configure: creating cache config.cache
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for mips-linux-strip... mips-linux-strip
checking whether to enable maintainer-specific portions of Makefiles... no
checking for mips-linux-gcc... /home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... yes
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether /home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-gcc accepts -g... yes
checking for /home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of /home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-gcc... gcc3
checking how to run the C preprocessor... /home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for AIX... no
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking minix/config.h usability... no
checking minix/config.h presence... no
checking for minix/config.h... no
checking whether it is safe to define __EXTENSIONS__... yes
checking for mips-linux-ranlib... mips-linux-ranlib
checking whether byte ordering is bigendian... (cached) yes
checking for dhcpd.leases location.../var/lib/dhcp/dhcpd.leases
checking for dhcpd6.leases location.../var/lib/dhcp/dhcpd6.leases
checking for dhclient.leases location.../var/lib/dhcp/dhclient.leases
checking for dhclient6.leases location.../var/lib/dhcp/dhclient6.leases
checking for int8_t... yes
checking for int16_t... yes
checking for int32_t... yes
checking for int64_t... yes
checking for u_int8_t... yes
checking for u_int16_t... yes
checking for u_int32_t... yes
checking for u_int64_t... yes
checking ifaddrs.h usability... yes
checking ifaddrs.h presence... yes
checking for ifaddrs.h... yes
checking linux/types.h usability... yes
checking linux/types.h presence... yes
checking for linux/types.h... yes
checking for linux/filter.h... yes
checking for struct lifnum... no
checking for struct if_laddrconf... no
checking for struct if_laddrreq... no
checking for GCC noreturn attribute... yes
checking sys/socket.h usability... yes
checking sys/socket.h presence... yes
checking for sys/socket.h... yes
checking net/if_dl.h usability... no
checking net/if_dl.h presence... no
checking for net/if_dl.h... no
checking net/if6.h usability... no
checking net/if6.h presence... no
checking for net/if6.h... no
checking regex.h usability... yes
checking regex.h presence... yes
checking for regex.h... yes
checking for library containing socket... none required
checking for library containing inet_ntoa... none required
checking for library containing inet_aton... none required
checking for library containing regcomp... none required
checking for library containing if_nametoindex... none required
checking for /dev/random... configure: error: cannot check for file existence when cross compiling

ERROR: Build failed.
make: *** [source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/.configured] Error 1

Dieser Fehler (checking for /dev/random...) legt nahe dass der Parameter nicht an .configure übergeben wurde, zumindest konnte ich ihn im manuellen Compile nur so provozieren. Habe ich hier etwas falsch gemacht?

Schon mal vielen Dank!
 
Nachdem Pastebin hier anscheinend geschasst wird, muss ich den Output leider so hier reinklatschen
Es ist so auch einfacher zu lesen.

Wie im Folgebeitrag steht, braucht man die Datei config.cache nicht, man kann den Wert auch als Parameter bei configure angeben, oder man übergibt ihn im Environment.
Letzteres geht am einfachsten mit
Code:
$(PKG)_CONFIGURE_ENV += ac_cv_file__dev_random=yes
Damit ist es weder notwendig, die Datei config.cache zu erstellen, noch diese als Parameter bei configure anzugeben.

Hinter $(PKG_UNPACKED) gehört kein Doppelpunkt, und auch die folgende Zeile mit touch gehört nicht dahin. Was sollte das denn bewirken?
Alternativ habe ich es mit einem Patch versucht, der die benötigte Datei erzeugen soll
Wenn Du Dir die Ausgabe von make genauer ansiehst, findest Du dort auch die Zeile
Code:
configuring... (conf_cmd() { ...;   rm -f config.{cache,status}; ...
Daher können beide Varianten nicht funktionieren, weder als Kopie noch als Patch.

Versuch es mal damit:
Code:
$(call PKG_INIT_BIN, 4.2.5-P1)
$(PKG)_SOURCE:=dhcp-$($(PKG)_VERSION).tar.gz
$(PKG)_SOURCE_MD5:=f68e3c1f00a9af5742bc5e71d567cf93
$(PKG)_SITE:=http://ftp.mirrorservice.org/sites/ftp.isc.org/isc/dhcp/$($(PKG)_VERSION)
$(PKG)_BINARY:=$($(PKG)_DIR)/server/dhcpd
$(PKG)_TARGET_BINARY:=$($(PKG)_DEST_DIR)/usr/sbin/dhcpd

$(PKG)_CONFIGURE_ENV += ac_cv_file__dev_random=yes

$(PKG_SOURCE_DOWNLOAD)
$(PKG_UNPACKED)
$(PKG_CONFIGURED_CONFIGURE)

$($(PKG)_BINARY): $($(PKG)_DIR)/.configured
        $(SUBMAKE) -C $(DHCP_DIR)

$($(PKG)_TARGET_BINARY): $($(PKG)_BINARY)
        $(INSTALL_BINARY_STRIP)

$(pkg):

$(pkg)-precompiled: $($(PKG)_TARGET_BINARY)

$(pkg)-clean:
        -$(SUBMAKE) -C $(DHCP_DIR) clean

$(pkg)-uninstall:
        $(RM) $(DHCP_TARGET_BINARY)

$(PKG_FINISH)
 
Hmm, den Wald sehe ich nicht, denn es stehen läuter Bäume davor ;-) Ich zitiere Dich mal...
Code:
freetz@freetz-linux:~/freetz-source/trunk$ make
/bin/bash: -c: line 0: syntax error near unexpected token `PATH="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin:/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3/mips-unknown-linux-gnu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"'

Grund: in der CONFIGURE_PRE_CMDS fehlt das Semicolon, Klammern sind überflüssig. Das ist aber alles Shell und hat nichts mit make zu tun.
make/dhcp/dhcp.mk
Code:
# --- Vor Aufruf von .configure eine vorbereitete config.cache aus dem make/dhcp-Verzeichnis ins build-Verzeichnis kopieren
$(PKG)_CONFIGURE_PRE_CMDS += cp $(MAKE_DIR)/dhcp/config.cache $($(PKG)_DIR)/[B];[/B]

Abgesehen davon, der richtige Weg ist
Code:
$(PKG)_CONFIGURE_ENV += ac_cv_file__dev_random=yes
ohne irgendwelche Tricksereien mit config.cache

Edit: Ralf war schneller ;-)

@Ralf: mit CONFIGURE_PRE_CMDS würde es schon funktionieren, denn rm -f config.cache wird vor CONFIGURE_PRE_CMDS ausgeführt.
 
Zuletzt bearbeitet:
Erst einmal herzlichen Dank für eure schnellen Antworten! Ralf, mit deinem Makefile bin ich nun schon einen ganzen Schritt weiter. Das configure für dhcpd läuft durch und make beginnt. Nun stehe ich vor dem nächsten Problem. Als erster Schritt von make werden in einem Unterverzeichnis des source Exportbibliotheken für BIND kompiliert. Dies schlägt aber fehl:

Code:
freetz@freetz-linux:~/freetz-source/trunk$ make
[...]
Now you can type make to build ISC DHCP

cmd() { PATH="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin:/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3/mips-unknown-linux-gnu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" LD_RUN_PATH="/usr/lib/freetz" make -j4  "$@"  || { printf "\n\\033[33m%s\\033[m\n" "ERROR: Build failed.";  exit 1; } };        if [ -e source/.echo_item_start -a ! -e source/.echo_item_build ]; then echo -n "building... "; touch source/.echo_item_build; fi; cmd -C source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1 \
        CC="/home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-gcc" \
        CFLAGS="-march=24kc -Os -pipe -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64"
building... make[1]: Entering directory `/home/freetz/freetz-source/trunk/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1'
Making all in bind
make[2]: Entering directory `/home/freetz/freetz-source/trunk/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/bind'
Configuring BIND Export libraries for DHCP.
configure: error: in `/home/freetz/freetz-source/trunk/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/bind/bind-9.8.4-P2':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details
make[2]: *** [all] Error 1
make[2]: Leaving directory `/home/freetz/freetz-source/trunk/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/bind'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/freetz/freetz-source/trunk/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1'

ERROR: Build failed.
make: *** [source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/server/dhcpd] Error 1

Die genannte Logdatei ist auch nicht besonders hilfreich:

/home/freetz/freetz-source/trunk/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/bind/configure.log
Code:
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking whether make sets $(MAKE)... yes
checking for gcc... /home/freetz/freetz-source/trunk/toolchain/build/mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/mips-linux-uclibc/bin/mips-linux-uclibc-gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling...

Soweit ich das verstehe gibt es in dem Unterverzeichnis dhcp-4.2.5-P1/bind eine eigene configure-Datei, die anscheinend nicht mitbekommt dass ein Crosscompile stattfinden soll. Beim manuellen Compile reicht es, dem configure von dhcp den Parameter --host=... zu übergeben, die Bibliotheken werden dann korrekt mitgebaut. Muss ich bei der Integration in freetz im Makefile noch weitere Umgebungsvariablen setzen die dann auch für das untergeordnete configure gelten?
 
Zuletzt bearbeitet:
Ein vernünftiges configure ruft auch das configure in allen benötigten Unterverzeichnissen mit auf.

Mit den folgenden Änderungen läuft das configure durch, allerdings versucht es nachher ein Programm gen aufzurufen, welches auch für die Box gebaut wird und daher auf dem Build System nicht läuft.
Code:
$($(PKG)_BINARY): $($(PKG)_DIR)/.configured
        export \
                host_alias="$(GNU_TARGET_NAME)" \
                CC="$(TARGET_CC)" \
                BUILD_CC="$(HOSTCC)" \
                CONFIG_SITE=$(CONFIG_SITE) \
                FREETZ_BASE_DIR="$(FREETZ_BASE_DIR)" \
                with_randomdev=/dev/random \
        ; $(SUBMAKE) -C $(DHCP_DIR)
Konkret ist es so, dass in source/target-mipsel_gcc-4.6.4_uClibc-0.9.32.1/dhcp-4.2.5-P1/bind/bind-9.8.4-P2/lib/dns/Makefile ${BUILD_CC} verwendet wird, was funktioniert, und in source/target-mipsel_gcc-4.6.4_uClibc-0.9.32.1/dhcp-4.2.5-P1/bind/bind-9.8.4-P2/lib/export/dns/Makefile wird ${CC} verwendet, was nicht funktioniert.
Leider kann man das auch nicht so leicht patchen, weil diese Dateien erst von source/target-mipsel_gcc-4.6.4_uClibc-0.9.32.1/dhcp-4.2.5-P1/bind/Makefile extrahiert werden, man müsste also diese Datei so ändern, dass sie source/target-mipsel_gcc-4.6.4_uClibc-0.9.32.1/dhcp-4.2.5-P1/bind/bind-9.8.4-P2/lib/export/dns/Makefile anpasst.

Wenn es mit der Datei config.cache funktioniert, dann kopiere diese so, wie er13 in #3 schreibt.
Bzw. da der Inhalt nur eine einzige Zeile ist, kannst Du sie auch direkt anlegen, statt eine Vorlage zu kopieren:
Code:
$(PKG)_CONFIGURE_PRE_CMDS += echo ac_cv_file__dev_random=yes > $($(PKG)_DIR)/config.cache ;
 
Viel bessere Lösung wäre, das Freetz-Paket bind so anzupassen, dass die export-Libraries, die ISC-dhcp benötigt, gebaut und ins TARGET_TOOLCHAIN_STAGING_DIR installiert werden. Anschließend sollte folgende Zeile in make/dhcp/dhcp.mk genügen:
Code:
$(PKG)_CONFIGURE_OPTIONS += --with-libbind="$(TARGET_TOOLCHAIN_STAGING_DIR)/usr"

Ansonsten kannst Du Dir make/bind/bind.mk anschauen, wie die Build-Probleme dort gelöst sind und die Lösungen in Dein-Paket übernehmen (wovon ich jedoch dringend abraten würde, wenn Du möchtest, dass Dein Paket in den trunk übernommen wird).

Btw: bind nutzt /dev/urandom und nicht /dev/random

p.s. habe die bind-Version im trunk auf dieselbe Version wie in Deiner Version von ISC-dhcp aktualisiert

Edit: bind anzupassen sollte nicht so schwierig sein, in etwa so:
Code:
-$(PKG)_CONFIGURE_OPTIONS += --disable-shared
-$(PKG)_CONFIGURE_OPTIONS += --enable-static
+$(PKG)_CONFIGURE_OPTIONS += --enable-shared
+$(PKG)_CONFIGURE_OPTIONS += --disable-static
+$(PKG)_CONFIGURE_OPTIONS += --enable-exportlib
Und dann noch ein wenig Fleißarbeit, um die Libraries zu installieren und im menuconfig anzubieten.
 
Zuletzt bearbeitet:
Dankeschön euch beiden, ich werde mich die nächsten Tage mit euren Ratschlägen vergnügen. :)
 
Ich habe mal das bind-Paket so angepasst, dass export-libs gebaut und in BIND_EXPORT_LIB_DIR zur Verfügung gestellt werden.

Nach meinem Verständnis (ungetestet) sollte folgende Erweiterung der .mk-Datei von Ralf aus #2 ausreichen, um einen Schritt weiter zu kommen.
Code:
$(PKG)_DEPENDS_ON := bind
$(PKG)_CONFIGURE_OPTIONS += --with-libbind="$(BIND_EXPORT_LIB_DIR)"

p.s. Bind bietet zwei Versionen seiner Libraries: eine größere (die allerdings nur intern genutzt wird) und eine abgespeckte (genau diese wird exportlib genannt). ISC-dhcp braucht die abgespeckte Version. Ob es auch mit der nicht abgespeckten Version laufen wird, weiß ich nicht. Da es sich um zwei verschiedene Versionen der Libraries handelt, habe ich mich für die Lösung entschieden, keine Shared-Libraries anzubieten (diese habe ich #6 angedeutet, da habe ich aber noch nicht gewusst, dass es zwei verschiedene Versionen sind). Debian macht es übrigens genauso (extra nachgeschaut).
 
er13, kurze Rückmeldung: Compile von bind bricht ab mit Meldung
Code:
make[3]: *** No rule to make target `unix/socket.lo', needed by `libisc.la'.  Stop.
Ich werde leider erst morgen dazu kommen dem Fehler nachzuspüren.
 
Der build von bind läuft nun durch, dafür kommt wieder beim dhcp der obige Fehler. Allerdings bringt das configure von dhcp diesmal:
Code:
  CFLAGS:        -march=24kc -Os -pipe -Wa,--trap -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64  [B]-I/home/freetz/freetz-source/trunk/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/bind-9.8.4-P2/_exportlib/include[/B]
Der Parameter kommt also an, dennoch versucht make wieder die Bibliotheken aus dem bind-Unterverzeichnis im dhcp-Source zu bauen:
Code:
make[2]: Entering directory `/home/freetz/freetz-source/trunk/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/bind'
Configuring BIND Export libraries for DHCP.
configure: error: in `/home/freetz/freetz-source/trunk/source/target-mips_gcc-4.7.3_uClibc-0.9.33.2-nptl/dhcp-4.2.5-P1/bind/bind-9.8.4-P2':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details
Ich habe einen etwas älteren Patch für dhcp gefunden der anscheinend genau dieses Problem beheben soll, allerdings für eine Version von anno Tobak. Ich versuche ihn testweise für die aktuelle Version umzuschreiben und gebe dann Bescheid ob es damit funktioniert.
 
Anhang anzeigen 101-fix-libraries.patch.txt

Ich verzweifle am Patch. Output von make:
Code:
    applying patch file make/dhcp/patches/101-fix-libraries.patch
    patching file Makefile.am
    patching file client/Makefile.am
    patching file configure.ac
    patching file dhcpctl/Makefile.am
    Hunk #2 FAILED at 15.
    1 out of 2 hunks FAILED -- saving rejects to file dhcpctl/Makefile.am.rej
    patching file omapip/Makefile.am
    patching file relay/Makefile.am
    patching file server/Makefile.am

Es funktioniert alles bis auf den EINEN Patchteil. Ich habe ihn zigmal neu geschrieben, die Passage aus dem source kopiert, Tabs und Leerzeichen gezählt und geprüft... Bin ich zu doof?
 
Das ist ja lustig, schreibst Du sie händisch?

Füge eine leere Zeile vor der @@ -15,1 +15,1 @@-Zeile hinzu ;-)
 
Formal betrachtet ist der Patch in Ordnung, sonst würde patch nicht versuchen, ihn anzuwenden. Eine Leerzeile vor der Zeile @15 bewirkt, dass der Patch dort zu Ende ist und der Block ab @15 als Vorspann es nächsten Patches ignoriert wird.

Ein mit diff erstellter Patch sieht so aus:
Code:
@@ -9 +9 @@
-               ../bind/lib/libdns.a ../bind/lib/libisc.a
+               $(libbind)/lib/libdns.a $(libbind)/lib/libisc.a
@@ -15 +15 @@
-              ../bind/lib/libdns.a ../bind/lib/libisc.a
\ Kein Zeilenumbruch am Dateiende.
+              $(libbind)/lib/libdns.a $(libbind)/lib/libisc.a
Daraus ergibt sich auch, wo das Problem liegt.
 
Vielen Dank, Patch läuft durch. Sehr lehrreicher Thread! :)

Allerdings mit exakt demselben Resultat wie in Beitrag 4, es wird wieder versucht die Bibliotheken im dhcp-Source zu bauen. Sollte dies nicht der erste Patchteil verhindern, der das Unterverzeichnis bind aus der Liste im "Hauptmakefile" wirft?

@er13: Nachdem ich "nur" eine Vorlage anpassen musste, ja. Sonst überlasse ich das auch lieber Werkzeugen.
 
Du passt ja automake-Dateien an (.am), da sind die .in-Dateien (in der Regel Makefile.in's) noch nicht automatisch mitangepasst. Sprich autoreconf-Aufruf (oder wie das Ding nochmal hieß) fehlt noch. Da ich kein Fan von autoreconf im Rahmen des Freetz-Build-Prozesses bin, würde ich persönlich direkt die Makefile.in's und das configure patchen (das könnte man sogar in dem Fall mit sed). Häng' mal Deinen aktuellen Stand an, ich schaue es mir an.
 
Habe es mit folgender dhcp.mk erfolgreich übersetzen können. Statt Patches zu erstellen habe ich ein paar sed-Befehle direkt in die .mk integriert.

Code:
$(call PKG_INIT_BIN, 4.2.5-P1)
$(PKG)_SOURCE:=dhcp-$($(PKG)_VERSION).tar.gz
$(PKG)_SOURCE_MD5:=f68e3c1f00a9af5742bc5e71d567cf93
$(PKG)_SITE:=http://ftp.mirrorservice.org/sites/ftp.isc.org/isc/dhcp/$($(PKG)_VERSION)

$(PKG)_BINARY:=$($(PKG)_DIR)/server/dhcpd
$(PKG)_TARGET_BINARY:=$($(PKG)_DEST_DIR)/usr/sbin/dhcpd

$(PKG)_DEPENDS_ON += bind

$(PKG)_MAKE_OPTIONS := -C $($(PKG)_DIR)

# do not process bind subdir while making dhcp
$(PKG)_CONFIGURE_PRE_CMDS += $(SED) -i -r -e '/^SUBDIRS[ \t]*=/ s,bind,,' Makefile.in;
# replace ../bind and ../../bind with $(libbind) in all Makefile.in's
$(PKG)_CONFIGURE_PRE_CMDS += $(SED) -i -r -e 's,(../)+bind/,$$$$(libbind)/,g' `find . -name Makefile.in`;

$(PKG)_MAKE_OPTIONS += libbind="$(BIND_EXPORT_LIB_DIR)"
$(PKG)_CONFIGURE_OPTIONS += --with-libbind="$(BIND_EXPORT_LIB_DIR)"

# add EXTRA_CFLAGS, EXTRA_LDFLAGS variables to all Makefile.in's
$(PKG)_CONFIGURE_PRE_CMDS += $(SED) -i -r -e 's,^((C|LD)FLAGS)[ \t]*=[ \t]*@\1@,& $$$$(EXTRA_\1),' `find . -name Makefile.in`;

# reduce binary size by setting appropriate CFLAGS/LDFLAGS
$(PKG)_MAKE_OPTIONS += EXTRA_CFLAGS="-ffunction-sections -fdata-sections"
$(PKG)_MAKE_OPTIONS += EXTRA_LDFLAGS="-Wl,--gc-sections"

$(PKG)_CONFIGURE_ENV += ac_cv_file__dev_random=yes

$(PKG_SOURCE_DOWNLOAD)
$(PKG_UNPACKED)
$(PKG_CONFIGURED_CONFIGURE)

$($(PKG)_BINARY): $($(PKG)_DIR)/.configured
	$(SUBMAKE) $(DHCP_MAKE_OPTIONS)

$($(PKG)_TARGET_BINARY): $($(PKG)_BINARY)
	$(INSTALL_BINARY_STRIP)

$(pkg):

$(pkg)-precompiled: $($(PKG)_TARGET_BINARY)

$(pkg)-clean:
	-$(SUBMAKE) $(DHCP_MAKE_OPTIONS) clean

$(pkg)-uninstall:
	$(RM) $(DHCP_TARGET_BINARY)

$(PKG_FINISH)

Die zusätzlichen CFLAGS/LDFLAGS sorgen dafür, dass das Binary etwa 200KB kleiner ist als ohne diese Flags.

Die korrekte Lösung, die upstream gehen könnte, bestünde allerdings darin Makefile.am's und configure.in anzupassen. Die saubere Unterstützung "interne vs. externe libbind-Libraries" bedarf etwas mehr Umsetzungsaufwandes (die Lösung, die Du Dir als Vorlage genommen hast, schaltet interne Variante einfach aus - Upstream würde wahrscheinlich sowas nicht akzeptieren).

Edit: anbei ein Patch, der die Unterstützung für die Variante "externe bind-Libraries" hinzufügt ohne dabei die "interne"-Variante zu entfernen. Oder anders ausgedrückt, wird with-libind=PATH angegeben, so werden die Libraries unter PATH verwendet. Wird nichts angegeben, so wird das im tarball enthaltende bind gebaut und die Libraries daraus verwendet. Nachdem Anwenden des Patches ist autoreconf -f -i aufzurufen, damit configure und Makefile.in's neu generiert werden.
 

Anhänge

  • 010-external_libbind_support.patch.txt
    4.2 KB · Aufrufe: 0
Zuletzt bearbeitet:
Super, build läuft komplett durch. Jetzt scheitere ich nur am Aufspielen auf die Box (Kernel-Prüfsummenfehler), aber dem werde ich mich heute in Ruhe annehmen. Sollte ja kein Problem des Patches sein.
 
@silenea: möchtest Du, dass Dein Paket in freetz aufgenommen wird? Wenn ja, so würdest Du es bitte um Config.in, external*, ggf. web-if erweitern (gerne auch erst im 2. Schritt) und hier als Patch anhängen. Danke!
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.