Makefile & FreeBSD

Midian

Well-Known Member
Hallöchen, ich bräuchte etwas Hilfe mit einem Makefile. Für mein (Mini-)Programm habe ich eins geschrieben, entwickelt wurde allerdings unter Linux, entsprechend sieht das Makefile folgendermaßen aus:

Code:
#--------------------------------------------------------------------------
# variables
#--------------------------------------------------------------------------

OBJDIR = obj
APPL = $(OBJDIR)/main.o $(OBJDIR)/http.o
DISTBIN = unitydownloader

LFLAGS = -lcurl
CFLAGS = -I ./ -c -ggdb -Wreturn-type -Wformat -pedantic -Wunused-variable -Wunused-label -Wunused-value -Wno-long-long

#--------------------------------------------------------------------------
# more variables
#--------------------------------------------------------------------------

CC       = g++

doCompile    = $(CC) $(CFLAGS)
doLink       = $(CC) $(LFLAGS)
doClean      = rm -f *.o *~ *.a

#--------------------------------------------------------------------------
# targets
#--------------------------------------------------------------------------

all:
    @(echo -; echo Making $(DISTBIN) ...; make $(DISTBIN))

$(DISTBIN):  $(APPL)
    @echo Linking "$*" ...
    $(doLink) $(APPL) -o $@

clean:
    @(echo Cleanup of $(DISTBIN) ... )
    $(doClean)
    (cd $(OBJDIR) && $(doClean))

#--------------------------------------------------------------------------
# compile
#--------------------------------------------------------------------------

$(OBJDIR)/%.o: %.cc
    @echo Compile "$(*F)" ...
    $(doCompile) $(*F).cc -o $@

#--------------------------------------------------------------------------
# source files
#--------------------------------------------------------------------------

$(OBJDIR)/main.o     :      main.cc
$(OBJDIR)/http.o     :      http.cc

Damit kann ich mein Programm wunderbar unter Linux mit Make bauen. Leider funktioniert das unter FreeBSD nicht, ich bekomme folgenden Fehler:

make clean
Code:
07:50:06 s710@epoch:~/um> make clean
Cleanup of unitydownloader ...
rm -f *.o *~ *.a
(cd obj && rm -f *.o *~ *.a)
cd: obj: No such file or directory
*** [clean] Error code 2

Stop in /usr/home/s710/um.

make

Code:
07:50:10 s710@epoch:~/um> make
-
Making unitydownloader ...
make: don't know how to make unitydownloader. Stop
*** [all] Error code 2

Stop in /usr/home/s710/um.

Nun bin ich leider weder unter Linux noch unter FreeBSD ein Makefile-Experte (tatsächlich hab ich meins auch nur irgendwo her kopiert und freu mich dass es funktioniert). Kann mir daher jemand unter die Arme greifen?

Wie ist denn das übliche Vorgehen, wenn ich Software auf unterschiedlichen Systemen bereitstellen will? Schreibe ich ein (GNU)-Makefile, und verlasse mich drauf, dass die anderen Plattformen selbiges entsprechend nutzen können (unter FreeBSD müsste ich dann gmake statt make verwenden?), oder sollte ich für andere Plattformen (in diesem Fall nur FreeBSD) ein separates Makefile anbieten?
 
Ich habe da mal ein wenig experementiert - da scheint tatsächlich ein Unterscheid zwischen make und gmake zu sein.

Ich habe da ein @pwd eingefügt:
clean:
@pwd
@(echo Cleanup of $(DISTBIN) ... )
$(doClean)
(cd $(OBJDIR) && $(doClean))

das Verzeichnis obj angelegt und die Ausgabe ist

> gmake clean
/home/user/tmp/makefile
Cleanup of unitydownloader ...
rm -f *.o *~ *.a
(cd obj && rm -f *.o *~ *.a)

> make clean
/home/user/tmp/makefile/obj
Cleanup of unitydownloader ...
rm -f *.o *~ *.a
(cd obj && rm -f *.o *~ *.a)
cd: obj: No such file or directory
*** Error code 2

Stop.
make: stopped in /home/user/tmp/makefile

scheint automatisch das obj Verzeichnis mitzunehmen...

Grüße, Norbert
 
Achso, ich vergaß zu erwähnen, dass ich auch gmake auf meiner Kutsche hab, aber damit mein Makefile auch nicht funktioniert. Clean (s. Beitrag von Norbert) geht zwar, das Kompilieren selbst aber nicht:

Code:
08:44:02 s710@epoch:~/um> gmake
-
Making unitydownloader ...
Linking unitydownloader ...
g++ -lcurl obj/main.o obj/http.o -o unitydownloader
g++: obj/main.o: No such file or directory
g++: obj/http.o: No such file or directory
*** [unitydownloader] Error code 1

Stop in /usr/home/s710/um.
gmake: *** [all] Error 1

Er kompiliert die Quelldateien einfach nicht, so dass beim Linken auch keine Object-Files zum Linken da sind.
 
Wenn man das Makefile ein wenig ändert, funktioniert alles... Ich habe das mit 2 entsprechendne dummy *.cc dateien probiert...

-- snip --
#--------------------------------------------------------------------------
# variables
#--------------------------------------------------------------------------

OBJDIR = obj
APPL = main.o http.o
DISTBIN = unitydownloader

#LFLAGS = -lcurl
CFLAGS = -I ./ -c -ggdb -Wreturn-type -Wformat -pedantic -Wunused-variable -Wunused-label -Wunused-value -Wno-long-long

#--------------------------------------------------------------------------
# more variables
#--------------------------------------------------------------------------

CC = c++

doCompile = $(CC) $(CFLAGS)
doLink = $(CC) $(LFLAGS)
doClean = rm -f *.o *~ *.a

#--------------------------------------------------------------------------
# targets
#--------------------------------------------------------------------------

all:
@(echo -; echo Making $(DISTBIN) ...; make $(DISTBIN))

$(DISTBIN): $(APPL)
@echo Linking "$*" ...
$(doLink) $(APPL) -o $@

clean:
@pwd
@(echo Cleanup of $(DISTBIN) ... )
$(doClean)
(cd $(OBJDIR) && $(doClean))

#--------------------------------------------------------------------------
# compile
#--------------------------------------------------------------------------

$(OBJDIR)/%.o: %.cc
@echo Compile "$(*F)" ...
$(doCompile) $(*F).cc -o $@

#--------------------------------------------------------------------------
# source files
#--------------------------------------------------------------------------

main.o: main.cc

http.o: http.cc

-- snip --

Der Inhalt im Verzeichnis ist dann:

> ll
total 20
drwxr-xr-x 4 user user 8 May 28 10:30 .
drwxr-xr-x 7 user user 28 May 28 09:22 ..
-rw-r--r-- 1 user user 1474 May 28 10:27 Makefile
-rw-r--r-- 1 user user 33 May 28 10:21 http.cc
-rw-r--r-- 1 user user 12 May 28 10:22 http.h
-rw-r--r-- 1 user user 80 May 28 10:22 main.cc
drwxr-xr-x 2 user user 5 May 28 10:28 obj
drwxr-xr-x 2 user user 2 May 28 09:27 untydownloader
 
Nicht nur das. Auch generell mit C-Variablen C++-Code zu verwerten. Also nicht nur CC müsste CXX sein, sondern auch CFLAGS sollte CXXFLAGS sein. Und generell sollten die Variablen wie CFLAGS, CXX und Co nicht einfach hart überschrieben werden, sondern mit ?= gesetzt werden, bzw. +=.

Und dieses "rm -f *~" gefällt mir auch nicht xD Sieht für mich nach einem potentiellen:
https://github.com/MrMEEE/bumblebee-Old-and-abbandoned/issues/123
aus, wenn man unvorsichtig ist ;)
 
Zurück
Oben