Basic Makefile

From PSP Developer wiki
Revision as of 13:11, 27 June 2017 by GregoryRasputin (talk | contribs) (Created page with "==Introduction== *Make is a powerful Unix tool allowing devs to automate the compiling/building process. What it does, is reading a file called Makefile, that contains all nec...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Introduction[edit | edit source]

  • Make is a powerful Unix tool allowing devs to automate the compiling/building process. What it does, is reading a file called Makefile, that contains all necessary instructions and rules to compile your project, and execute them.
  • Basically, imagine two file in the same folder; main.c, containing the source code of our homebrew and a file called Makefile. Assuming the Makefile does his job, what we want to be able to do is to call make (not makefile), that will compile our program according to the rules contained in the file Makefile.

Write your first Makefile[edit | edit source]

Let's start with a small project example (I assume you are already familiar with the code in main.c):

  • main.c :
#include <pspkernel.h>
#include <pspdebug.h>

PSP_MODULE_INFO("Hello World", 0, 1, 0);

int exit_callback(int arg1, int arg2, void *common)
{
  sceKernelExitGame();	
  return 0;
}

int CallbackThread(SceSize args, void *argp)
{
  int cbid;
  cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
  sceKernelRegisterExitCallback(cbid);
  sceKernelSleepThreadCB();
  return 0;
}

int SetupCallbacks(void)
{
  int thid = 0;
  thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
  if(thid >= 0) {	
    sceKernelStartThread(thid, 0, 0);
  }
  return thid;	
}

int main()
{
  pspDebugScreenInit();
  SetupCallbacks();
  pspDebugScreenPrintf("Hello World");
  sceKernelSleepThread();
  return 0;
}
  • Makefile : (the simplest possible)
OBJS = main.o

CFLAGS = -Wall -Wextra
CXXFLAGS = $(CFLAGS)

LIBS =

EXTRA_TARGETS = EBOOT.PBP
PSPSDK = $(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Now let's explain a little more about this strange file !

OBJS = main.o

This line tells psp-gcc (our compiler) which file needs to be compiled, in our case main.c.

  • Note : don't forget to replace *.c (or *.cpp) by *.o ! I know it's weird, but not relevant for now.

Example: if your project is composed of, say main.c, gfx.c and sound.c, your OBJS line will look like that:

OBJS = main.o gfx.o sound.o

Now let's give our compiler more information:

CFLAGS = -Wall -Wextra
CXXFLAGS = $(CFLAGS)

These define flags. They modify the behavior of your compiler. -Wall (for "all warnings") for example, is a very common flag, that enables standard warnings. Warnings are sent by the compiler when your C code may contain errors. -Wextra enables more warnings. You can code without them, but I strongly advise their use, because they can be of a great help ! There are many useful flags, feel free to look into existing code and inspect Makefiles !

CXXFLAGS are also flags, except they are used in C++ only !

  • Note : $(CFLAGS) is replaced by the contents of CFLAGS, $(...) can be a very useful syntax !
LIBS =

This line defines what libraries will be used by our program. It's empty because we don't need them for this project, but you will later !


EXTRA_TARGETS = EBOOT.PBP
PSPSDK = $(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

These lines are mandatory, but you don't need to understand what they do for now. Basically they define the name of you Eboot file, and retrieve build infos from another file called build.mak

You can now save those two files and call make !

my_directory $ ls
main.c Makefile
my_directory $ make
...

Wait for the compiler to finish, and a EBOOT.PBP file should appear ! Now turn on and connect your PSP, and transfer it ! The path should look like that: psp_root/PSP/GAME/MY_MAGICAL_HB/EBOOT.PBP

Deconnect USB and your HB should appear in your game list !

Go further[edit | edit source]

Makefiles are very useful and can save a lot of time for the programmer. This small tutorial showed a very basic use of them, don't hesitate to look for more advanced features !