Vraag & Antwoord

OS Linux

Autoconf / Automake, Hoe?

Anoniem
Bamboe
10 antwoorden
  • Hoi,

    KDevelop kan geen shared library's maken, dus moet ik mijn eigen configure en makefile gaan maken. Ik denk dat ik dat het beste kan doen met autoconf etc, maar de vraag is hoe? de man pagina's houden zich bij hun traditie: cryptisch, rot, moeilijk, info-loos :roll:

    Barry
  • Een eigen Makefile maken is niet zo moeilijk hoor.

    Kijk hier eens:

    http://www.gnu.org/manual/make/html_node/make_toc.html


    GreetZzz
  • En zolang je het niet te gek maakt voldoen Makefiles prima.
  • Je bedoelt dus zonder configure ;) ?
  • Een automatische makefile-generator kan toch wel handig zijn. Vooral als je veel source files hebt en er regelmatig afhankelijkheden wijzigingen (dus #include's bijkomen of verdwijnen)
    Elke keer je makefile aanpassen als er een #include wijzigt is nogal omslachtig, en ik geraakte ook niet aan automake / autoconf aanuit, dus heb ik toen zelf maar een bash-scriptje geschreven dat er ongeveer zo uit zag:
    #!/bin/sh

    echo "COMP=g++ -c"
    echo -e "LINK=g++"

    echo -e "program: lijst_van_alle_.o_files\n"
    echo -e "\t \$(LINK) lijst_van_alle_.o_files -o program\n"
    echo -e "\tchmod a+rx program\n"

    for i in *.cxx; do
    j=`echo "$i" | cut -f 1 -d .`;
    echo "$j".o: `grep "#include" "$j".* |grep -v "<" | cut -f 2 -d " |uniq |tr -s "\n" " "` "$i";
    echo -e "\t(\$COMP)" "$i" "\n";

    done

    echo clean:
    echo -e "\t rm -Rf *~ *.o "

    het stuk in de for-lus ziet er nogal cryptisch uit, maar is heus niet moeilijk te ontrafelen. Het komt er op neer dat je van elke cxx file gaat nagaan welke files er geinclude worden door die cxx file, en genereert dan een passende lijn voor de make file ervoor. Je zou iets gelijkaardig kunnen doen voor de lijst_van_alle_.o_files, maar ik had dat toen niet gedaan omdat er nog andere .o files rondzwerfden (voor testdoeleinden) die niet mee gelinkt mochten worden.

    de -e achter de echo dient om echo rekening te laten houden met escape characters (\n en \t enzo)

    Deze manier van een makefile genereren is uiteraard niet geschikt om voor elk mogelijk programma ne makefile te genereren, maar 't is misschien een stap in de richting als ge zelf een goeie manier zoekt om snel een propere, leesbare makefile te genereren.
  • Weet je ook een truukje om bv alle namen van cpp bestanden in een dir. naar de makefile te schrijven?
  • Oke hebben, mijn zelfgemaakte configure:

    [code:1:e8094b7c98]
    #!/bin/sh

    echo -e "# Automaticly generated makefile, do not modify!"
    echo ""
    export SOURCE=netengine
    export EXEC=libnetengine.so
    echo ""
    echo -e "COMPILER = g++"
    echo -e "FLAGS = -O3 -march=i686 -Wnon-virtual-dtor -Wno-long-long -Wbad-function-cast -Wundef -Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion"
    echo -e "COMPILE = \$(COMPILER) \$(FLAGS) -c"
    echo -e "COMPILE_SHARED = \$(COMPILER) \$(FLAGS) -shared -o"
    echo -e "COMPILE_LINK = \$(COMPILER) \$(FLAGS) -o"
    echo -e "PREFIX_INCLUDE = /usr/include"
    echo -e "PREFIX_LIB = /usr/lib"
    echo -e "PREFIX_EXEC = /usr/bin"
    echo -e ""
    echo -e "all: $SOURCE\n"
    echo -e -n "$SOURCE:"
    for i in *.cpp; do
    j=`echo "$i" | cut -f 1 -d .`;
    echo -n " $j.o";
    done
    echo -e -n "\n\t \$(COMPILE_SHARED) $EXEC"
    for i in *.cpp; do
    j=`echo "$i" | cut -f 1 -d .`;
    echo -n " $j.o";
    done
    echo -e "\n"
    for i in *.cpp; do
    j=`echo "$i" | cut -f 1 -d .`;
    echo -e "$j.o: $j.cpp";
    echo -e "\t \$(COMPILE) $j.cpp\n";
    done

    echo clean:
    echo -e "\t rm -Rf *.o *.so *~"
    echo ""
    echo -e "install: netengine\n"
    #for i in *.cpp; do
    #j=`echo "$i" | cut -f 1 -d .`;
    #echo -n " $j.o";
    #done
    #echo -e "\n"

    for i in *.h; do
    echo -e "\t cp $i \$(PREFIX_INCLUDE)";
    done
    echo -e "\n"

    for i in *~; do
    echo -e "\t cp $i \$(PREFIX_EXEC)";
    done
    echo -e "\n"

    for i in *.so; do
    echo -e "\t cp $i \$(PREFIX_LIB)";
    done
    echo -e "\n"
    [/code:1:e8094b7c98]

    Bedankt iedereen!!!
    Barry
  • Ik heb je script nu niet getest, maar op 't eerste zicht schijnt het toch niet echt te kloppen.
    't is namelijk de bedoeling dat elke cpp file opnieuw gecompileerd wordt als één v/d .h files waar hij afhankelijk van is verandert.
    Als je dus hebt staan in je makefile:
    [code:1:57fdaae108]
    blabla.o: blabla.cpp
    $(COMP) blabla.cpp
    [/code:1:57fdaae108]
    dan gaat blabla.o opnieuw gemaakt worden als blabla.cpp gewijzigd is
    stel nu dat in blabla.cpp ook #include "hoho.h" staat, en je verandert iets in hoho.h. Dan zou bij het uitvoeren van make blabla.cpp ook gehercompileerd moeten worden, maar volgens die 2 regels in de makefile gebeurt dat niet!
    er zou dus eigenlijk moeten staan op de eerste regel (in de veronderstelling dat blabla.cpp ook nog blabla.h include):

    [code:1:57fdaae108]
    blabla.o: blabla.cpp blabla.h hoho.h
    [/code:1:57fdaae108]

    En volgens mij doet jou makefile-generator dat niet, en de mijne wel.

    Correct me if I'm wrong…
  • Ja je hebt gelijk, ik moet nog 'ns een beetje gaan rommelen
  • Klaar! dit is v2 (met een beetje van jouw code ;) )

    [code:1:a434c91548]
    #!/bin/sh

    echo -e "# Automaticly generated makefile, do not modify!"
    echo ""
    export SOURCE=netengine
    export EXEC=libnetengine.so
    echo ""
    echo -e "COMPILER = g++"
    echo -e "FLAGS = -O3 -march=i686 -Wnon-virtual-dtor -Wno-long-long -Wbad-function-cast -Wundef -Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion"
    echo -e "COMPILE = \$(COMPILER) \$(FLAGS) -c"
    echo -e "COMPILE_SHARED = \$(COMPILER) \$(FLAGS) -shared -o"
    echo -e "COMPILE_LINK = \$(COMPILER) \$(FLAGS) -o"
    echo -e "PREFIX_INCLUDE = /usr/include"
    echo -e "PREFIX_LIB = /usr/lib"
    echo -e "PREFIX_EXEC = /usr/bin"
    echo -e ""
    echo -e "all: $SOURCE\n"
    echo -e -n "$SOURCE:"
    for i in *.cpp; do
    j=`echo "$i" | cut -f 1 -d .`;
    echo -n " $j.o";
    done
    echo -e -n "\n\t \$(COMPILE_SHARED) $EXEC"
    for i in *.cpp; do
    j=`echo "$i" | cut -f 1 -d .`;
    echo -n " $j.o";
    done
    echo -e "\n"
    for i in *.cpp; do
    j=`echo "$i" | cut -f 1 -d .`;
    echo -e -n "$j.o: ";
    echo `grep "#include" "$j".* | grep -v "<" | cut -f 2 -d \" | uniq | tr -s "\n" " "` "$i";
    echo -e "\t \$(COMPILE) $j.cpp\n";
    done

    echo clean:
    echo -e "\t rm -Rf *.o *.so *~"
    echo ""
    echo -e "install: netengine\n"

    for i in *.h; do
    echo -e "\t cp $i \$(PREFIX_INCLUDE)";
    done
    echo -e "\n"

    for i in *~; do
    echo -e "\t cp $i \$(PREFIX_EXEC)";
    done
    echo -e "\n"

    for i in *.so; do
    echo -e "\t cp $i \$(PREFIX_LIB)";
    done
    [/code:1:a434c91548]

    Genereert deze prachtige makefile:

    [code:1:a434c91548]
    # Automaticly generated makefile, do not modify!


    COMPILER = g++
    FLAGS = -O3 -march=i686 -Wnon-virtual-dtor -Wno-long-long -Wbad-function-cast -Wundef -Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion
    COMPILE = $(COMPILER) $(FLAGS) -c
    COMPILE_SHARED = $(COMPILER) $(FLAGS) -shared -o
    COMPILE_LINK = $(COMPILER) $(FLAGS) -o
    PREFIX_INCLUDE = /usr/include
    PREFIX_LIB = /usr/lib
    PREFIX_EXEC = /usr/bin

    all: netengine

    netengine: clientsocket.o netengine.o serversocket.o
    $(COMPILE_SHARED) libnetengine.so clientsocket.o netengine.o serversocket.o

    clientsocket.o: clientsocket.cpp
    $(COMPILE) clientsocket.cpp

    netengine.o: netengine.h netengine.cpp
    $(COMPILE) netengine.cpp

    serversocket.o: serversocket.cpp
    $(COMPILE) serversocket.cpp

    clean:
    rm -Rf *.o *.so *~

    install: netengine

    cp clientsocket.h $(PREFIX_INCLUDE)
    cp netengine.h $(PREFIX_INCLUDE)
    cp serversocket.h $(PREFIX_INCLUDE)


    cp *~ $(PREFIX_EXEC)


    cp libnetengine.so $(PREFIX_LIB)
    [/code:1:a434c91548]

    Bedankt!,

    Barry

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.