Anleitung zum kompilieren mit einem "Makefile"

Tutorials, Beispieldateien etc..

Anleitung zum kompilieren mit einem "Makefile"

Postby jb_alvarado on Thu Jun 04, 2009 11:05 am

Hallo Leute,
auf den Wunsch hin beschreibe ich hier mal Stichpunktartig wie man shader per Makefile und der VC 2008 console kompilieren kann.


Benötigt wird Visual Studio und das Microsoft SDK:

http://www.microsoft.com/express/download/

http://www.microsoft.com/downloads/deta ... laylang=en

Habt ihr beides installiert navigiert zu:
C:\Program Files\Microsoft Visual Studio 9.0\VC\include
macht eine Kopie von "io.h" im gleichen Ordner und benennt diese in "unistd.h".


Als nächstes legen wir uns einen Ordner an, den wir für unsere shader- Entwicklung benutzen, z.B.

"ShaderSources"

In diesen Ordner legen wir 5 weitere Ordner und eine Textdatei (ohne Endung) an:

bin32
bin64
inc
lib
src
->Textdatei: "makefile"

sources.jpg
sources.jpg (23.2 KiB) Viewed 2410 times


Im Ordner src werden wir später unsere Source Codes (.c bzw. .cpp) anlegen und bearbeiten.

In den Ordner lib kopieren wir unsere shader libs. In Max wären diese zu finden unter:
*\3dsMax***\mentalray\dev\lib32 bzw. 64

Um 32 bit sowie 64 bit kompilieren zu können kopieren wir gleich beide und benennen diese um in:
shader32.lib
shader64.lib


In der Ordner inc kopieren wir nun als letztes unsere Include Files. Vollständige Liste der mr Includes wären:

geoshader.h
mi_ioptions.h
mi_shader_if.h
mi_version.h
mia_material_api.h
shader.h


Meistens werden jedoch nur "geshader.h;mi_shader_if.h;shader.h" benötigt. Kompiliert ihr bestehende Sources seht ihr am Anfang des Codes eh welche Includes benötigt werden.

Als nächste öffnen wir, mit einen geeigneten Editor, nun unsere Makefile im Rootordner. An dieser Stelle kann ich nur Nodepad++ empfehlen, ist ein sehr feiner Texteditor: http://notepad-plus.sourceforge.net/de/site.htm

In das File kopiert nun folgenden Text:

Code: Select all
EXENAME=shadername

SSYSTEM=WINDOWS


CFLAGS=/TP /c /O2 /MD /nologo /W3 -DWIN_NT /EHsc

LFLAGS=/nologo /nodefaultlib:LIBC.LIB /OPT:NOREF /INCREMENTAL:NO

DEFINES=\
   /D "WIN32" \
   /D "NDEBUG" \
   /D "_CRT_SECURE_NO_WARNINGS"

INCLUDES=\
   /I "./" \
   /I "./src" \
   /I "./inc" \
   /I "./lib"
   
LIBS=\
   kernel32.lib\
   user32.lib\
   gdi32.lib\
   winspool.lib\
   comdlg32.lib\
   advapi32.lib\
   shell32.lib\
   comctl32.lib
   
LIBS32=\
   $(LIBS)\
   .\lib\shader32.lib
   
LIBS64=\
   $(LIBS)\
   .\lib\shader64.lib

OBJS=\
   src\shadername.obj

   
OBJS32=\
   $(OBJS)
   
OBJS64=\
   $(OBJS)

32: $(OBJS32)
   @link $(LFLAGS) /MACHINE:IX86  /SUBSYSTEM:$(SSYSTEM) /DLL /OUT:./bin32/$(EXENAME).dll $(OBJS32) $(LIBS32)
   mt.exe -nologo -manifest ./bin32/$(EXENAME).dll.manifest -outputresource:./bin32/$(EXENAME).dll;2
   @echo - DONE -

64: $(OBJS64)
   @link $(LFLAGS) /MACHINE:AMD64 /SUBSYSTEM:$(SSYSTEM) /DLL /OUT:./bin64/$(EXENAME).dll $(OBJS64) $(LIBS64)
   mt.exe -nologo -manifest ./bin64/$(EXENAME).dll.manifest -outputresource:./bin64/$(EXENAME).dll;2
   @echo - DONE -

.cpp.obj:
   @cl $(CFLAGS) $(DEFINES) $(INCLUDES) /Fo$*.obj /c $<
.c.obj:
   @cl $(CFLAGS) $(DEFINES) $(INCLUDES) /Fo$*.obj /c $<

clean:
   @del .\*.idb
   @del .\bin32\*.exp
   @del .\bin32\*.lib
   @del .\bin64\*.exp
   @del .\bin64\*.lib
   @del src\*.obj
   


Und Speichert das File ab. Dieses File bleibt zum größten Teil immer so wie es ist. Zum Kompilieren müssen immer nur zwei Zeilen geädert werden.

In Zeile 1, wird der Shadername angegeben und in Zeile 40 wird das "obj" zum shader angegeben. Möchten wir z.B. den shader add_color.c kompilieren sehen die Zeilen so aus:

Code: Select all
EXENAME=add_colors
[...]

OBJS=\
   src\add_colors.obj


Für das Kompilieren stehen nun 3 Befehle für die Kommandozeile zur Verfügung:

>nmake (kompiliert 32 bit shader)
>nmake 64 (kompiliert 64 bit shader)
>nmake clean (löscht die entstandenen Tempfiles: obj usw.)


Noch kurz zu den Parametern im Makefile:

EXENAME=add_colors

SSYSTEM=WINDOWS

"Exename" sagt dem Compiler welches File er zu kompilieren hat, "System" für welches BS entwickelt wird.

Code: Select all
CFLAGS=/TP /c /O2 /MD /nologo /W3 -DWIN_NT /EHsc

LFLAGS=/nologo /nodefaultlib:LIBC.LIB /OPT:NOREF /INCREMENTAL:NO

Hier werden die Kompilierungsparameter übergeben.

Code: Select all
INCLUDES=\
   /I "./" \
   /I "./src" \
   /I "./inc" \
   /I "./lib"

Hier wird auf die Projektornder verwiesen, in welchen die Sources liegen, die Includes und Libs.

Code: Select all
LIBS=\
   kernel32.lib\
   user32.lib\
   gdi32.lib\
   winspool.lib\
   comdlg32.lib\
   advapi32.lib\
   shell32.lib\
   comctl32.lib

Hier werden die Windows- eigenen Libs eingebunden.

Code: Select all
LIBS32=\
   $(LIBS)\
   .\lib\shader32.lib
   
LIBS64=\
   $(LIBS)\
   .\lib\shader64.lib

Hier wird auf die 32 bit und 64 bit shader libs verwiesen

Code: Select all
OBJS=\
   src\add_colors.obj

   
OBJS32=\
   $(OBJS)
   
OBJS64=\
   $(OBJS)

In diesem Abschnitt wird dem Compiler gesagt welches obj er erstellen muss.

Code: Select all

32: $(OBJS32)
   @link $(LFLAGS) /MACHINE:IX86  /SUBSYSTEM:$(SSYSTEM) /DLL /OUT:./bin32/$(EXENAME).dll $(OBJS32) $(LIBS32)
   mt.exe -nologo -manifest ./bin32/$(EXENAME).dll.manifest -outputresource:./bin32/$(EXENAME).dll;2
   @echo - DONE -

64: $(OBJS64)
   @link $(LFLAGS) /MACHINE:AMD64 /SUBSYSTEM:$(SSYSTEM) /DLL /OUT:./bin64/$(EXENAME).dll $(OBJS64) $(LIBS64)
   mt.exe -nologo -manifest ./bin64/$(EXENAME).dll.manifest -outputresource:./bin64/$(EXENAME).dll;2
   @echo - DONE -

.cpp.obj:
   @cl $(CFLAGS) $(DEFINES) $(INCLUDES) /Fo$*.obj /c $<
.c.obj:
   @cl $(CFLAGS) $(DEFINES) $(INCLUDES) /Fo$*.obj /c $<

Hier wird der Output definiert, also dass eine dll kompiliert werden soll, für welches System, was gelinkt werden muss und dass die manifest Datei einbezogen werden soll.
(Siehe: http://forum.mentalimages.com/showthread.php?t=4513 )

Code: Select all
clean:
   @del .\*.idb
   @del .\bin32\*.exp
   @del .\bin32\*.lib
   @del .\bin64\*.exp
   @del .\bin64\*.lib
   @del src\*.obj


Durch das Aufrufen von "nmake clean" wird über diesen Abschnitt definiert, was alles nach dem Kompilieren wieder gelöscht werden soll.

Haben wir nun alles korrekt eingerichtet und haben einen Sourcecode zur Hand, rufen wir nun die VC Console auf und Kompilieren unseren Code. Zu finden ist die Console unter:

Start/Programme/Microsoft Visual Studio 2008/Visual Studio Tools/Visual Studio 2008 x64 Cross Tools-Eingabeaufforderung öffnen

Bzw. für 32 bit: Visual Studio 2008-Eingabeaufforderung öffnen

Für dieses Beispiel möchte ich einen 64 bit shader kompilieren, daher nehme ich die 64 bit Console.
Hier navigieren wir nun zu unserem Projektordner, in diesem Fall "ShaderSources", und tippe den Befehl nmake 64 ein und anschließend nmake clean:
console.jpg


Haben wir alles richtig gemacht, dürften keine Fehler auftauchen :) und wir haben unseren ersten shader kompiliert.


Ich hoffe ihr könnt was damit anfangen, wenn ihr fragen oder Kritik habt, könnt ihr diese hier gerne schildern. Natürlich übernehme ich keine Verantwortung für eventuelle Schäden, noch die Vollständigkeit des Textes.

Grüße

jb_
User avatar
jb_alvarado
Moderator
 
Posts: 2022
Joined: Sun Nov 12, 2006 20:16 pm
Location: Dornbirn

Re: Anleitung zum kompilieren mit einem "Makefile"

Postby haggi on Fri Jun 05, 2009 0:20 am

Super!

ich würde nur ein paar Kleinigkeiten ändern.
Und zwar würde ich es vermeiden die shader libs sowie die include files in ein eigenes directory zu kopieren. Das führt bei neueren Versionen nur zu Verwirrungen und ist eine Quelle für Fehler.

Gibt es einen Grund nicht auf den Originalpfad zu verweisen?
haggi
Admin
 
Posts: 752
Joined: Wed Jan 10, 2007 0:56 am

Re: Anleitung zum kompilieren mit einem "Makefile"

Postby jb_alvarado on Fri Jun 05, 2009 12:01 pm

Hallo Haggi,
ja das stimmt eigentlich!
Mir wurde das mal so beigebracht und ich habs übernommen... Glaub Sinn macht es nur, wenn mehrere Leute an so einem Projekt arbeiten, bzw. man auf verschiedenen Rechnern ist, oder mit Verschiedenen Programmen gearbeitete wird, und die Pfade somit immer anders sin.
User avatar
jb_alvarado
Moderator
 
Posts: 2022
Joined: Sun Nov 12, 2006 20:16 pm
Location: Dornbirn

Re: Anleitung zum kompilieren mit einem "Makefile"

Postby Seeda on Fri Jun 05, 2009 12:13 pm

Vielen Dank für diese sehr ausführliche Anleitung !

Habe noch einen Clon im Tutorialbereich angelegt.
User avatar
Seeda
Admin
 
Posts: 3784
Joined: Sun Nov 12, 2006 20:25 pm

Return to Tutorials | Examplefiles

Who is online

Users browsing this forum: No registered users and 1 guest

cron