Eigenes makefile error 1 permission denied

Hallo Tutorials Coder!
Da ich gerade an einem halbwegs ernstem Projekt Code, will ich das auch dann in guter UNIX Manier im Sourcecode ausliefern und die User sollen es selbst über make; make install; bauen und installieren. Da ich aber Xcode zum complieren benutze, habe ich kein makefile und Export oder convertierug ist wohl auch sehr blöd, und da ich nicht sehr viele Module habe, kann ich es auch schnell selbst hinschreiben. Dachte ich.

Immer wenn ich mein makefile aus dem Projekt Verzeichnis aufrufe, fängt er an, das erste Objekt main.o zu bauen und gleich beim ersten sourcefile main.c sagt er make: ./main.c: Permission denied; make: *** [build/gcc/objects/main.o] Error 1. Ich hab's probehalber auch mit sudo make probiert ebenso mit chmod makefile 777 aber es hat alles nichts gebracht. Der Installationsbefehl make install (einfach nur ein cp in ein anderes Verzeichnis) funktioniert einwandfrei.
Mein Compiler und Linker ist gcc, ich Benutzer
GNU make mit der Bourne Again Shell von Mac OS
Mein Makefile liegt hier: http://pastie.org/1835116
Code:
#
# Macros
#
CC		= gcc
LNK		= gcc
INCLUDE	= /usr/local/inlcude
LIBPATH = /usr/local/lib

TARGET	= mol
TPATH	= ./build/gcc
OPATH	= ./build/gcc/objects
BINPATH	= /usr/bin

CFLAGS	= -O -Wall -Wno-switch -Wno-unknown-pragmas -c
CDEFS	=

OBJECTS	= \
	$(OPATH)/main.o \
	$(OPATH)/regex.o \
	$(OPATH)/analysis.o

#
# Targets
#

$(TPATH)/$(TARGET): $(OBJECTS)
	$(LNK) $(LIBPATH) -o $(TPATH)/$(TARGET) $(OBJECTS)

$(OPATH)/main.o:
	./main.c \
	./includes/includes.h \
	./analysis/analysis.h \
	./chemstrings/chemstrings.h \
	./regex/regex.h
	$(CC) $(INCLUDE) $(CFLAGS) $(CDEFS) -o $@ $<


$(OPATH)/regex.o:
	./regex/regex.c \
	./includes/includes.h \
	./analysis/analysis.h \
	./chemstrings/chemstrings.h \
	./regex/regex.h


$(OPATH)/analysis.o:
	./analysis/analysis.c \
	./includes/includes.h \
	./analysis/analysis.h \
	./chemstrings/chemstrings.h \
	./regex/regex.h
	
install:
	@cp $(TPATH)/$(TARGET) $(BINPATH)/$(TARGET) && echo "\"$(TARGET)\" successfully installed in \"$(BINPATH)\""
Mein Projektverzeichnis sieht so aus:http://pastie.org/1835163
Code:
molsketch/
    analysis/
        analysis.c
        analysis.h
    build/
        gcc/
            objects/
    chemstrings/
        chemstrings.h
    includes/
        includes.h
    regex/
        regex.c
        regex.h
    main.c
    makefile
Der genaue Error Output: http://pastie.org/1835389
Code:
noname:MolSketch Ps0ke$ make
./main.c \
	./includes/includes.h \
	./analysis/analysis.h \
	./chemstrings/chemstrings.h \
	./regex/regex.h
make: ./main.c: Permission denied
make: *** [build/gcc/objects/main.o] Error 1

Vielen Dank schonmal im Vorraus, Eingeweidemann
 
Zuletzt bearbeitet:
Das klingt jetzt bestimmt echt als hätt ich keine Ahung, aber ich hab auch einfach keine Ahnung von gcc und make, weil ich es nie benutze. Ich weiss auch nicht, was die ganzen Compiler Optionen bedeuten. Ich habe wegen des makefile Krams in meinem C Buch nachgeschlagen, und da gabs ein einfaches Beispiel makefile, da hab ich die Parameter einfach übernommen. Ich hatte es aber davor auch ohne die Parameter, das hat auch nicht funktioniert. Den genauen Output habe ich der Vollständigkeit halber mal noch oben verlinkt.
 
Was ist so schwer daran 2 Fragen zu beantworten?

Man kann die Ausgabe auch ganz einfach hier in einen Codeblock reinstellen. Das macht sich meist einfacher.

Laut Fehlermeldung kann make nicht auf main.c zugreifen.

\edit: Ach herrje. Du versuchst in deinem Makefile main.c als Programm auszuführen. Das ist natürlich Unsinn.

Die Zielanforderungen müssen auf der Target-Zeile sein, d.h. du darfst keinen Zeilenumbruch nach dem : machen (bzw. mußt einen Zeilenumbruch mit einem Backslash entwerten):
Code:
$(OPATH)/main.o: \
    ./main.c \
    ./includes/includes.h \
    ./analysis/analysis.h \
    ./chemstrings/chemstrings.h \
    ./regex/regex.h
    $(CC) $(INCLUDE) $(CFLAGS) $(CDEFS) -o $@ $<

\edit2: Du solltest dir evtl. mal CMake (http://www.cmake.org/) oder Premake (http://industriousone.com/premake) anschauen. Manuell Makefiles zu schreiben ist kein spaßiger Zeitvertreib... ;)

Gruß
 
Zuletzt bearbeitet:
Was ist so schwer daran 2 Fragen zu beantworten?
Das hab ich jetzt nicht so ganz verstanden
Laut Fehlermeldung kann make nicht auf main.c zugreifen.
So weit bin ich auch schon. Ich frage mich nur, woran das liegt. Meine Mac OS IDE Xcode schafft es auf main.c zu zugreifen, und meine Windows IDE Pelles C (Die benutzt so pseudo makefiles) schafft es auch auf main.c zu zugreifen. Ich hab aber beide geschlossen, und den Ordner auch schonmal aus der Dropbox rauskopiert, falls Dropbox den stream vielleicht blockiert oder so. Hat alles nichts geholfen.
 
Was? Ich hatte 2 Fragen gestellt, du hast nur 1 beantwortet..
Hab ich doch, der output ist oben im ersten beitrag, die parameter hab ich gesagt, verstehe ich selbst nicht.
Du versuchst die main.c als Programm auszführen, die Datei hat aber kein executable Bit gesetzt. Siehe die edits in meinem letzten Beitrag.
Ja, stimmt, ist natürlich mein Fehler, man sieht den Wald vor lauter Bäumen mal wieder nicht.
Jetzt hat main.o geklappt, aber dann bekomme ich
Code:
noname:MolSketch Ps0ke$ make
gcc /usr/local/lib -o ./build/gcc/mol ./build/gcc/objects/main.o ./build/gcc/objects/regex.o ./build/gcc/objects/analysis.o
i686-apple-darwin10-gcc-4.2.1: ./build/gcc/objects/regex.o: No such file or directory
i686-apple-darwin10-gcc-4.2.1: ./build/gcc/objects/analysis.o: No such file or directory
make: *** [build/gcc/mol] Error 1
muss ich die Objects irgendwie in einer bestimmten Reihnfolge aufführen?

EDIT: Es geht jetzt, ich hatte vergessen bei den anderen objects die compilerflags etc zu setzen!
 
Zuletzt bearbeitet:
Das bauen der Objects geht jetzt klar, nur wenn ich das richtig verstehe schafft er es nicht zu linken, ich glaube er hat irgend ein Problem mit meiner externen Bibliothek. Die liegt aber 100%ig da in dem Pfad, weil meine anderen IDEs schaffen es ja auch.
Code:
# MACROS #
##########

# compiler
CC		= gcc
LNK		= gcc
INCLUDE	= /usr/local/include
LIBPATH = /usr/local/lib
CFLAGS	= -O -Wall -Wno-switch -Wno-unknown-pragmas -c
CDEFS	=

# paths
TARGET	= mol
TPATH	= ./build/gcc
OPATH	= ./build/gcc/objects
BINPATH	= /usr/bin

# objects
OBJECTS	= \
	$(OPATH)/main.o \
	$(OPATH)/regex.o \
	$(OPATH)/analysis.o


# TARGETS #
###########

# mol executable
$(TPATH)/$(TARGET): $(OBJECTS)
	$(LNK) $(LIBPATH) -o $(TPATH)/$(TARGET) $(OBJECTS)

# main.o
$(OPATH)/main.o: \
	./main.c \
	./includes/includes.h \
	./analysis/analysis.h \
	./chemstrings/chemstrings.h \
	./regex/regex.h
	$(CC) $(INCLUDE) $(CFLAGS) $(CDEFS) -o $@ $<

# regex.o
$(OPATH)/regex.o: \
	./regex/regex.c \
	./includes/includes.h \
	./analysis/analysis.h \
	./chemstrings/chemstrings.h \
	./regex/regex.h
	$(CC) $(INCLUDE) $(CFLAGS) $(CDEFS) -o $@ $<

# analysis.o
$(OPATH)/analysis.o: \
	./analysis/analysis.c \
	./includes/includes.h \
	./analysis/analysis.h \
	./chemstrings/chemstrings.h \
	./regex/regex.h
	$(CC) $(INCLUDE) $(CFLAGS) $(CDEFS) -o $@ $<


# UTILITIES #
#############

install:
	@cp $(TPATH)/$(TARGET) $(BINPATH)/$(TARGET) && echo "\"$(TARGET)\" successfully installed in \"$(BINPATH)\""

clean:
	@rm -rf $(TPATH)/$(TARGET) $(OBJECTS) && echo "\"$(TARGET)\" and objects successfully deleted"
Code:
noname:molsketch Ps0ke$ make
gcc /usr/local/include -O -Wall -Wno-switch -Wno-unknown-pragmas -c  -o build/gcc/objects/main.o main.c
i686-apple-darwin10-gcc-4.2.1: /usr/local/include: linker input file unused because linking not done
gcc /usr/local/include -O -Wall -Wno-switch -Wno-unknown-pragmas -c  -o build/gcc/objects/regex.o regex/regex.c
i686-apple-darwin10-gcc-4.2.1: /usr/local/include: linker input file unused because linking not done
gcc /usr/local/include -O -Wall -Wno-switch -Wno-unknown-pragmas -c  -o build/gcc/objects/analysis.o analysis/analysis.c
i686-apple-darwin10-gcc-4.2.1: /usr/local/include: linker input file unused because linking not done
gcc /usr/local/lib -o ./build/gcc/mol ./build/gcc/objects/main.o ./build/gcc/objects/regex.o ./build/gcc/objects/analysis.o
ld: in /usr/local/lib, can't map file, errno=22
collect2: ld returned 1 exit status
make: *** [build/gcc/mol] Error 1
 
Hi.

Irgendwelche Pfade einfach als Optionen beim Compiler anzugeben ist Unfug. :rtfm: "man gcc"

Include-Pfade werden mit -I angegeben. Linker-Pfade mit -L. Üblicherweise erstellt bzw. ändert man die Variablen CFLAGS (bzw. CXXFLAGS für C++) und LDLIBS und LDFLAGS dafür, so kann man die eingebauten impliziten Make Regeln verwenden:
Code:
LDFLAGS := -L/usr/local/lib
LDLIBS := -lblub
CFLAGS := -I/usr/local/include $(CDEFS)

$(TPATH)/$(TARGET): $(OBJECTS) # <- keine Kommandos notwendig

$(OPATH)/main.o: \
    ./main.c \
    ./includes/includes.h \
    ./analysis/analysis.h \
    ./chemstrings/chemstrings.h \
    ./regex/regex.h  # <- keine Kommandos notwendig
Gruß
 
Zuletzt bearbeitet:
Danke für die Hilfe, aber es geht jetzt noch weniger als vorher.

Code:
# MACROS #
##########

# compiler
CC		= gcc
LNK		= gcc
INCLUDE	= /usr/local/include
LIBPATH = /usr/local/lib
LDFLAGS	:= -L/usr/local/lib
LDLIBS	:= -lblub
CFLAGS	:= -I/usr/local/include) $(CDEFS)
CDEFS	= LANG_DE

# paths
TARGET	= mol
TPATH	= ./build/gcc
OPATH	= ./build/gcc/objects
BINPATH	= /usr/bin

# objects
OBJECTS	= \
	$(OPATH)/main.o \
	$(OPATH)/regex.o \
	$(OPATH)/analysis.o


# TARGETS #
###########

# mol executable
$(TPATH)/$(TARGET): $(OBJECTS)

# main.o
$(OPATH)/main.o: \
	./main.c \
	./includes/includes.h \
	./analysis/analysis.h \
	./chemstrings/chemstrings.h \
	./regex/regex.h

# ...

Damit bekomme ich dann
Code:
$ make
make: Nothing to be done for `build/gcc/mol'.
 
Zuletzt bearbeitet:
Zurück