Portál AbcLinuxu, 11. května 2025 04:27

Dotaz: autoconf, automake a spatne linkovani

20.3.2005 22:00 0
autoconf, automake a spatne linkovani
Přečteno: 156×
Odpovědět | Admin

Mam problemy s nasledujicim Makefile.am:

bin_PROGRAMS = darkbat.bin
bin_SCRIPTS = darkbat
darkbat_bin_SOURCES = dark.f90 darkbat.f90 
darkbat_bin_LDADD = -L$(top_srcdir)/lib -L../lib -lmunipack

Po korektnin vygenerovani pod autoconf259/automake19 me to na systemu, kde to generuju pracuje sprave avsak po preneseni jinam to to krachne na prikazu, ktery vubec nema udelat:

gcc   darkbat.o   -o darkbat

Vypada to, jako by to bylo zmateno z jine koncovky pro binarky. Darkbat je shellovej script, ktery vola prave binarku darkbat.bin. Nedari se me nijak najit reseni, jak to obejit.

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Stanislav Brabec avatar 21.3.2005 15:20 Stanislav Brabec | skóre: 45 | Praha
Rozbalit Rozbalit vše Re: autoconf, automake a spatne linkovani
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nevím, ale napadá mne toto:

Funguje to s darkbat_bin? Pouštěl jste při vytváření tarballu "make distcheck"?
21.3.2005 20:16 0
Rozbalit Rozbalit vše Re: autoconf, automake a spatne linkovani
Ne, je to uplne stejne. Mam aspon ten Makefile.am script dobre?
Stanislav Brabec avatar 21.3.2005 21:28 Stanislav Brabec | skóre: 45 | Praha
Rozbalit Rozbalit vše Re: autoconf, automake a spatne linkovani
S těmi -L v LDADD bych si nebyl jistý, viděl bych to spíš na $(top_builddir)/lib/libmunipack.la.

Ale asi ho mate, že darkbat.f90 není zdrojákem pro darkbat, jak by se dalo logicky očekávat.
21.3.2005 22:10 0
Rozbalit Rozbalit vše Re: autoconf, automake a spatne linkovani

To jsou jen ruzne kosmeticke upravy. Na funkcnost to nemuze mit vliv.

Po velkem laborovani jsem nakonec prisel na to, ze pravdepodobne se pouzije implicitni pravidlo na buildovani darkbat i kdyz je to script. Nechapu proc. Nakonec pomohl tenhle figl:

bin_PROGRAMS = darkbat.bin
dist_bin_SCRIPTS = darkbat
darkbat_bin_SOURCES = dark.f90 darkbat.f90 
darkbat_bin_LDADD = -L$(top_srcdir)/lib -L../lib -lmunipack
darkbat:
        echo
21.3.2005 22:15 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: autoconf, automake a spatne linkovani
Aha, takže s křížkem po funuse :-)
21.3.2005 22:14 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: autoconf, automake a spatne linkovani
Odpovědět | | Sbalit | Link | Blokovat | Admin
IMHO v adresáři se zdrojákama není skript darkbat (*_SCRIPTS defaultně nejde do distribuce, na to je dist_*_SCRIPTS, viz info automake), takže se ho make snaží vytvořit implicitní rulou z darkbat.o (ten vznikl při kompilaci darkbat.bin), viz info make.

Takže by snad mělo stačit přidat ten skript do distribuce, případně pro něj udělat prázdnou rulu.
21.3.2005 22:26 0
Rozbalit Rozbalit vše Re: autoconf, automake a spatne linkovani
Nevim cim to, ale pokud mam v adresari mix scriptu a .c tak to funguje korektne bez toho implicitniho pravidla, s .f90 ne. Zajimave.
21.3.2005 22:48 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: autoconf, automake a spatne linkovani
Zkus updatnout timestamp toho c souboru a přestane to fungovat:
$ head foo foo.c bar.c Makefile.am
==> foo <==
#!/bin/sh

echo "Ja jsem foo"

==> foo.c <==
#include <stdio.h>

void bar(void);

int main(void)
{
	puts("Ja jsem " __FILE__);
	bar();
}

==> bar.c <==
#include <stdio.h>

void bar(void)
{
	puts("Ja jsem " __FILE__);
}

==> Makefile.am <==
bin_PROGRAMS = foobar
foobar_SOURCES = foo.c bar.c
bin_SCRIPTS  = foo

$ make
make  all-am
make[1]: Entering directory `/home/michal/tmp/pok'
if gcc ... -c -o foo.o foo.c; \
then mv -f ".deps/foo.Tpo" ".deps/foo.Po"; else rm -f ".deps/foo.Tpo"; exit 1; fi
if gcc ... -c -o bar.o bar.c; \
then mv -f ".deps/bar.Tpo" ".deps/bar.Po"; else rm -f ".deps/bar.Tpo"; exit 1; fi
gcc  -g -O2   -o foobar  foo.o bar.o  
make[1]: Leaving directory `/home/michal/tmp/pok'
# to bylo jeste OK
$ touch foo.c
$ make
make  all-am
make[1]: Entering directory `/home/michal/tmp/pok'
if gcc ... -c -o foo.o foo.c; \
then mv -f ".deps/foo.Tpo" ".deps/foo.Po"; else rm -f ".deps/foo.Tpo"; exit 1; fi
gcc  -g -O2   -o foobar  foo.o bar.o  
gcc -g -O2    foo.c   -o foo
/tmp/ccEt2cj5.o(.text+0x17): In function `main':
/home/michal/tmp/pok/foo.c:8: undefined reference to `bar'
collect2: ld returned 1 exit status
make[1]: *** [foo] Error 1
make[1]: Leaving directory `/home/michal/tmp/pok'
make: *** [all] Error 2
# tady uz zauradovala implicitni rula make a prepsala mi ten skript...
21.3.2005 22:53 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: autoconf, automake a spatne linkovani
Takže místo echo by bylo asi nejlepší dát tam
darkbat:
        touch $@
21.3.2005 23:11 0
Rozbalit Rozbalit vše Re: autoconf, automake a spatne linkovani
Je to dobry napad, ale zvazim to, protoze by me to porad menilo cas u souboru a matlo.
Stanislav Brabec avatar 22.3.2005 09:33 Stanislav Brabec | skóre: 45 | Praha
Rozbalit Rozbalit vše Re: autoconf, automake a spatne linkovani
Já si myslím, že nejlepší by bylo přejmenovat zdrojáky (pokud je to možné), tak aby nevyvolávaly v automake nečekané asociace.
darkbat:
        touch $@
Toto je možná špatně mne špatně. Zkuste:
mkdir build
cd build
../configure
make
make install
Pokud se nemýlím, tak to nainstaluje prázdný soubor darkbat.
22.3.2005 12:05 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: autoconf, automake a spatne linkovani
S tímto balíkem mi to funguje, ale už se v tom trochu ztrácím :-)

Nejlepší by asi fakt bylo přejmenovat/přesunout ty zdrojáky.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.