[Gelöst] html2text kompilieren

b_s101

Neuer User
Mitglied seit
12 Mrz 2012
Beiträge
17
Punkte für Reaktionen
0
Punkte
1
Hallo zusammen,

ich wollte mir html2text (Link: http://www.mbayer.de/html2text/ , Source: http://www.mbayer.de/html2text/downloads/html2text-1.3.2a.tar.gz) für die Fritzbox kompilieren. Zunächst habe ich es manuell versucht, bin aber letztlich gescheitert. Jedenfalls ging ich davon aus, da jedes mal ein x86 Binary kompiliert wurde. Ich hab es dann auf meine mangelhafte Erfahrung hinsichtlich Cross-Compiling geschoben (fehlende Umgebungsvariablen, etc.). Heute habe ich mich erneut daran versucht, mit dem Unterschied dass ich ein Freetz-Package erstellen wollte, damit alle Vorraussetzungen (Umgebungsvariablen, etc.) ganz sicher stimmen. Jetzt wurde jedoch wieder ein x86 Binary kompiliert.

Ich habe die Vermutung, dass es mit dieser Ausgabe des configure-Scripts zusammenhängt, gleichzeitig aber keine Idee wie ich den Umstand beheben könnte:
Code:
[..]
Checking "makedepend" includes... use "-I/usr/include -I/usr/include/c++/4.6 -I/usr/include/c++/4.6/backward -I/usr/include/c++/4.6/bits -I/usr/include/c++/4.6/debug -I/usr/include/c++/4.6/ext -I/usr/include/c++/4.6/i686-linux-gnu/./bits -I/usr/include/i386-linux-gnu/bits -I/usr/include/i386-linux-gnu/gnu -I/usr/include/i386-linux-gnu/sys -I/usr/lib/gcc/i686-linux-gnu/4.6/include "
Creating "./Makefile" from "./Makefile.in"... done

So sieht das (mitgelieferte) configure-Script aus:
Code:
#! /bin/sh

echo='/bin/echo -e'

rm -rf configure-tmp || exit 1;
mkdir configure-tmp || exit 1;
tmp_file="configure-tmp/xxx";
makedirs=".";

#
# $CXX
#

$echo 'Checking C++ compiler... \c';
cat <<EOF >$tmp_file.C;
#include <iostream>
int main(int, char **) {
  std::cout << "hello" << std::endl;
  return 0;
}
EOF
CXX=unknown;
for i in "CC" "g++" "cc" "$CC"; do
  if $i -c $tmp_file.C 2>/dev/null; then
    CXX="$i";
    break;
  fi;
done;
if test "$CXX" = unknown; then
  $echo "Error: Could not find a working C++ compiler.";
  exit 1;
fi;
$echo "use \"$CXX\"";

#
# $SYS_POLL_MISSING
#

$echo 'Checking <sys/poll.h>... \c';
SYS_POLL_MISSING=unknown;
cat <<EOF >$tmp_file.C;
#ifdef SYS_POLL_MISSING /* { */
struct pollfd { int fd; short events; short revents; };
extern "C" int poll(struct pollfd *ufds, unsigned int nfds, int timeout);
#define POLLIN      0x0001
#define POLLPRI     0x0002
#define POLLOUT     0x0004
#define POLLERR     0x0008
#define POLLHUP     0x0010
#define POLLNVAL    0x0020
#else /* } { */
#include <sys/poll.h>
#endif /* } */
int main() {
  struct pollfd fds[3];
  return poll(fds, 3, 700);
}
EOF
for i in "" -DSYS_POLL_MISSING; do
  if $CXX $tmp_file.C $i -o $tmp_file 2>/dev/null; then
    SYS_POLL_MISSING="$i";
    break;
  fi;
done;
case "$SYS_POLL_MISSING" in
unknown)
  $echo 'Error: Could not get "poll()" to working.';
  exit 1;;
"")
  $echo "OK";;
*)
  $echo "use \"$SYS_POLL_MISSING\"";;
esac;

#
# $SOCKET_LIBRARIES
#

$echo 'Checking for socket libraries... \c';
SOCKET_LIBRARIES=unknown;
cat >$tmp_file.C <<EOF;
extern "C" int socket();
extern "C" void gethostbyname();
int main() {
  socket();
  gethostbyname();
  return 0;
}
EOF
for i in "" "-lbsocket" "-lbsocket -lnsl" "-lsocket" "-lsocket -lnsl"; do
  if $CXX $tmp_file.C $i -o $tmp_file 2>/dev/null; then
    SOCKET_LIBRARIES="$i";
    break;
  fi;
done;
if test "$SOCKET_LIBRARIES" = unknown; then
  $echo "Error: Could not determine the library for the socket API.";
  exit 1;
fi;
if test "$SOCKET_LIBRARIES" = ""; then
  $echo "no extra libraries required";
else
  $echo "use \"$SOCKET_LIBRARIES\"";
fi;

#
# $BOOL_DEFINITION
#

$echo 'Checking "bool"... \c';
BOOL_DEFINITION=unknown;
cat <<EOF >$tmp_file.C;
#ifdef BOOL_DEFINITION
BOOL_DEFINITION
#endif
int main(int argc, char **) {
  bool x = argc == 3;
  x = !x;
  if (x && argc == 7) x = false;
  return 0;
}
EOF
for i in \
  '' \
  '-DBOOL_DEFINITION="typedef unsigned char bool;const bool false=0,true=1;"' \
  '-DBOOL_DEFINITION="enum bool{false,true};"'; \
do
  if eval "$CXX $tmp_file.C $i -o $tmp_file 2>/dev/null"; then
    BOOL_DEFINITION="$i";
    break;
  fi;
done;
case "$BOOL_DEFINITION" in
unknown)
  $echo 'Error: Could not a suitable definition for "bool".';
  exit 1;;
"")
  $echo "built-in";;
*)
  $echo "use '$BOOL_DEFINITION'";;
esac;

#
# $EXPLICIT
#

$echo 'Checking "explicit"... \c';
EXPLICIT=unknown;
cat <<EOF >$tmp_file.C;
struct C {
  explicit C(int) {}
};
int main(int, char **) { C x(7); return 0; }
EOF
for i in \
  '' \
  '-Dexplicit='; \
do
  if eval "$CXX $tmp_file.C $i -o $tmp_file 2>/dev/null"; then
    EXPLICIT="$i";
    break;
  fi;
done;
case "$EXPLICIT" in
unknown)
  $echo 'Error: Could not a suitable definition for "explicit".';
  exit 1;;
"")
  $echo "built-in";;
*)
  $echo "use '$EXPLICIT'";;
esac;

#
# $LIBSTDCXX_INCLUDES, $LIBSTDCXX_LIBS
#

$echo 'Checking Standard C++ library... \c';
cat <<EOF >$tmp_file.C;
#include <string>
#include <list>
#include <memory>
#include <utility>
#include <map>
#include <set>
#include <new>
#include <vector>
using namespace std;
void func() { map<string, string> x; }
EOF
if $CXX -c $tmp_file.C 2>/dev/null; then
  LIBSTDCXX_INCLUDES="";
  LIBSTDCXX_LIBS="";
  $echo 'works; no need to make "./libstd"';
else
  LIBSTDCXX_INCLUDES='-Ilibstd/include';
  LIBSTDCXX_LIBS='libstd/libstd.a';
  echo 'not available or not working; use "./libstd"';
  makedirs="$makedirs ./libstd";
fi;

#
# $AUTO_PTR_BROKEN
#
AUTO_PTR_BROKEN="";
$echo 'Checking "auto_ptr"... \c';
cat <<EOF >$tmp_file.C;
#include <memory>
#include <string>
#include <list>
using namespace std;
int main(int, char**) {
  auto_ptr<string> x(new string("hello"));
  *x = "world";
  (void) x.get();
  (void) x.release();
  x.reset(0);   // egcs-2.91.66 lacks "reset()"!

  // G++ 2.95.1 on AIX 4.2 cannot compile this:
  auto_ptr<int> api;
  list<auto_ptr<int> > lapi;
  lapi.push_back(api);

  return 0;
}  
EOF
if eval "$CXX -c $LIBSTDCXX_INCLUDES $EXPLICIT $BOOL_DEFINITION $tmp_file.C" 2>/dev/null; then
  $echo 'defined in <memory>, good';
else
  $echo 'not defined or not working, use "./libstd/include/auto_ptr.h"';
  AUTO_PTR_BROKEN="-DAUTO_PTR_BROKEN";
fi;

#
# $MAKEDEPEND_INCLUDES
#
MAKEDEPEND_INCLUDES="";
$echo 'Checking "makedepend" includes... \c';
echo "#include <iostream>" >$tmp_file.C;
MAKEDEPEND_INCLUDES=`$CXX -E $tmp_file.C 2>/dev/null |
sed -n \
  -e 's/^#line .*"\(\/.*\)\/.*".*/-I\1/p' \
  -e 's/^# [1-9][0-9]* "\(\/.*\)\/.*".*/-I\1/p' |
sort -u |
tr '\n' ' '`;

if test "$MAKEDEPEND_INCLUDES" = ""; then
  $echo none;
else
  $echo "use \"$MAKEDEPEND_INCLUDES\"";
fi;

#
# Create "Makefile" from "Makefile.in".
#

rm -f Makefile libstd/Makefile;
cmd=sed;
for i in \
  SYS_POLL_MISSING \
  SOCKET_LIBRARIES \
  CXX \
  BOOL_DEFINITION \
  EXPLICIT \
  LIBSTDCXX_INCLUDES \
  LIBSTDCXX_LIBS \
  AUTO_PTR_BROKEN \
  MAKEDEPEND_INCLUDES; \
do cmd="$cmd -e \"s|@$i@|\$$i|g\""; done;
for dir in $makedirs; do
  $echo "Creating \"$dir/Makefile\" from \"$dir/Makefile.in\"... \\c";
  cat <<EOF >$dir/Makefile;

#
# This make file was generated from "Makefile.in" by "./configure" on
# `date` -- all your changes will be lost if you
# run "./configure" again!
#

EOF
  eval "$cmd" <$dir/Makefile.in >>$dir/Makefile;
  $echo 'done';
  if test -f $dir/Dependencies; then true; else >$dir/Dependencies; fi;
done;

#
# Clean up.
#

rm -rf configure-tmp;
rm -f xxx.o;

cat <<EOF;

Preparing completed. You may now run "make" (or "gmake").

EOF

Vielleicht kann mir jemand auf die Sprünge helfen.
 
Zuletzt bearbeitet:
Das ist kein "richtiges" configure Skript, es ist nicht für Cross-Compile ausgelegt.

Das einfachste wäre, wenn der Autor ein richtiges configure Skript mit autoconf erstellt (oder Du machst es selbst).
 
Dann lag ich ja schonmal nicht völlig daneben.
Der Autor hat im Mai 2005 das letzte mal den Sourcecode veröffentlicht. Ich denke nicht, dass er noch an dem Projekt arbeitet.

Ich versuch es einfach mal selbst...

EDIT:
Wenn man das zum ersten mal macht, scheint es fast unmöglich zu sein. Ich habe mich an folgenden Guide gehalten: http://wirbel.htpc-forum.de/autotools_howto/index2.html
Ein Configure Script erhalte ich, werde aber bei Ausführung mit folgender Fehlermeldung beglückt:
Code:
configure: error: cannot find install-sh, install.sh, or shtool in "." "./.." "./../.."

EDIT2:
Ich bin etwas weiter. Den o.g. Error konnte ich mit einem Link von /usr/bin/install nach install-sh im Sourceverzeichnis beseitigen (ob das aber so richtig ist...?). Configure läuft jetzt durch, ein anschließendes 'make' spuckt aber folgenden Error aus:
Code:
Makefile:133: Dependencies: Datei oder Verzeichnis nicht gefunden
make: *** Keine Regel, um »Dependencies« zu erstellen.  Schluss.
Der (scheinbar) relevante Teil im Makefile:
Code:
depend : local-depend
local-depend : HTMLParser.h
        @>Dependencies
        makedepend -f Dependencies $(CPPFLAGS) $(MAKEDEPEND_INCLUDES) *.C
        @rm -f Dependencies.bak

# -----------------------------------------------------------------------------

include Dependencies

EDIT3:

'makedepend' habe ich inzwischen installiert, jedoch wird die Datei 'Dependencies' nicht erstellt.

Sollte jemand eine Idee haben, immer her damit.

Den Autor von html2text habe ich inzwischen gebeten ein Configure Script zu erstellen. Mal schauen, ob er sich meldet. Ich versuche es erstmal weiter
 

Anhänge

  • configure.txt
    186 KB · Aufrufe: 0
  • Makefile.txt
    4.2 KB · Aufrufe: 1
Zuletzt bearbeitet:
Du kannst alternativ versuchen, in der vorhandenen configure CXX auf mipsel-linux-g++ bzw. mips-linux-g++ zu setzen, vielleicht reicht das schon.
 
Ich versuche erstmal das Programm für x86 zu kompilieren. Wenn das funktioniert, würde ich versuchen es für MIPS/MIPSEL zu kompilieren. Ich will eben nicht gleich mehrere Fehlerquellen haben

EDIT:
Du kannst alternativ versuchen, in der vorhandenen configure CXX auf mipsel-linux-g++ bzw. mips-linux-g++ zu setzen, vielleicht reicht das schon.
Ich habe deinen Rat jetzt doch befolgt, nachdem ich es einfach nicht geschafft habe ein 'vernünftiges', generisches configure Script zu erzeugen. Es war fast so, wie du geschrieben hast. CXX auf mips(el)-linux-g++ zu setzen hat nicht funktioniert. Danach wird aber ein Array mit Compilern durchsucht. Da hab ich mips-linux-g++ an die erste Stelle gesetzt und schon funktionierte es.

Ich füge jetzt beide Compiler (mips-linux-g++ und mipsel-linux-g++) dem configure Script hinzu und teste, ob es für die verschiedenen Fritzboxen gebaut wird.

EDIT2:
Funktioniert :)
Den Patch habe ich an das entsprechende Ticket angehängt.

Vielen Dank für die Hilfe
 
Zuletzt bearbeitet:
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.