View unanswered posts | View active topics It is currently Fri Dec 15, 2017 1:03 pm



Reply to topic  [ 11 posts ]  Go to page 1, 2  Next
 How do I add .o files to my makefile? 
Author Message

Joined: Fri Sep 09, 2011 7:22 pm
Posts: 9
I'm sorry to be a bother but I tried doing this and it didn't work right.

These are the contents of my makefile.

I would have put it in a spoiler but not sure if this site has that code.
Code:
#
# Template for projects using grit.
#
# Making gfx into a library in a separate makefile and using that here.
#

# ---------------------------------------------------------------------
# SETUP
# ---------------------------------------------------------------------

# --- No implicit rules ---
.SUFFIXES:

# --- Tonc paths ---
# If not defined as environment var, assumed to be C:\devkitPro\tonc-code\code
export TONCCODE   ?= C:\devkitPro\tonc-code\code

include $(TONCCODE)/tonc_rules



# --- Main path ---
export PATH   :=   $(DEVKITARM)/bin:$(PATH)



# ---------------------------------------------------------------------
# PROJECT DETAILS
# ---------------------------------------------------------------------

# PROJ      : Base project name
# TITLE      : Title for ROM header (12 characters)
# LIBS      : Libraries to use, formatted as list for linker flags
# BUILD      : Directory for build process temporaries. Should NOT be empty!
# SRCDIRS   : List of source file directories
# DATADIRS   : List of data file directories
# INCDIRS   : List of header file directories
# LIBDIRS   : List of library directories
# General note: use . for the current dir, don't leave them empty.

export PROJ   ?= $(notdir $(CURDIR))
TITLE      := test
GFXLIBS      := libgfx.a

LIBS      := -ltonc -lgfx

BUILD      := build
SRCDIRS      := startup fonts key_demo
DATADIRS   := data
INCDIRS      := include fonts
LIBDIRS      := $(TONCCODE)/tonclib
SOUND_DIR = sound/
SOUND_FILES = $(SOUND_DIR)m4aLib.o $(SOUND_DIR)SoundDat.o $(SOUND_DIR)gun.o $(SOUND_DIR)se3.o $(SOUND_DIR)se5.o \
   $(SOUND_DIR)se8.o $(SOUND_DIR)se9b.o $(SOUND_DIR)flutec4.o $(SOUND_DIR)suboscc3.o $(SOUND_DIR)orgc3.o \
   $(SOUND_DIR)synbsc2.o $(SOUND_DIR)brassc3.o $(SOUND_DIR)mutetpc4.o $(SOUND_DIR)cutgtg3.o $(SOUND_DIR)sawg3.o \
   $(SOUND_DIR)sinec3.o $(SOUND_DIR)revcym.o $(SOUND_DIR)engin01a.o $(SOUND_DIR)housebd.o $(SOUND_DIR)housesd.o \
   $(SOUND_DIR)housechh.o $(SOUND_DIR)houseohh.o $(SOUND_DIR)tamba.o $(SOUND_DIR)vibra.o $(SOUND_DIR)timbale.o \
   $(SOUND_DIR)harpc3.o $(SOUND_DIR)harpc5.o $(SOUND_DIR)se_d01.o $(SOUND_DIR)se_dbend.o $(SOUND_DIR)se_dvib.o \
   $(SOUND_DIR)se_gbend2.o $(SOUND_DIR)se_swep2.o $(SOUND_DIR)se_noise.o $(SOUND_DIR)sound3.o $(SOUND_DIR)se_dben2.o \
   $(SOUND_DIR)se_gbend.o $(SOUND_DIR)se_sweep.o $(SOUND_DIR)se_dgmix.o $(SOUND_DIR)agb2000.o $(SOUND_DIR)wario.o \
   $(SOUND_DIR)engin.o


# --- switches ---

bMB      := 0   # Multiboot build
bTEMPS   := 0   # Save gcc temporaries (.i and .s files)
bDEBUG2   := 0   # Generate debug info (bDEBUG2? Not a full DEBUG flag. Yet)


# ---------------------------------------------------------------------
# BUILD FLAGS
# ---------------------------------------------------------------------

# This is probably where you can stop editing

# --- Architecture ---

ARCH    := -mthumb-interwork -mthumb
RARCH   := -mthumb-interwork -mthumb
IARCH   := -mthumb-interwork -marm -mlong-calls

# --- Main flags ---

CFLAGS   := -mcpu=arm7tdmi -mtune=arm7tdmi $(ARCH) -O2
CFLAGS   += -Wall
CFLAGS   += $(INCLUDE)
CFLAGS   += -ffast-math -fno-strict-aliasing

CXXFLAGS   := $(CFLAGS) -fno-rtti -fno-exceptions

ASFLAGS   := $(ARCH)
LDFLAGS := $(ARCH) -Wl,-Map,$(PROJ).map

# --- switched additions ----------------------------------------------

# --- Multiboot ? ---
ifeq ($(strip $(bMB)), 1)
   TARGET   := $(PROJ).mb
else
   TARGET   := $(PROJ)
endif
   
# --- Save temporary files ? ---
ifeq ($(strip $(bTEMPS)), 1)
   CFLAGS   += -save-temps
endif

# --- Debug info ? ---

ifeq ($(strip $(bDEBUG2)), 1)
   CFLAGS   += -g
   LDFLAGS   += -g
endif


# ---------------------------------------------------------------------
# BUILD PROCEDURE
# ---------------------------------------------------------------------

ifneq ($(BUILD),$(notdir $(CURDIR)))

# Still in main dir:
# * Define/export some extra variables
# * Invoke this file again from the build dir
# PONDER: what happens if BUILD == "" ?

export OUTPUT   :=   $(CURDIR)/$(TARGET)
export VPATH   :=                           \
   $(foreach dir, $(SRCDIRS) , $(CURDIR)/$(dir))   \
   $(foreach dir, $(DATADIRS), $(CURDIR)/$(dir))   
   

export DEPSDIR   :=   $(CURDIR)/$(BUILD)

# --- List source and data files ---

CFILES      :=   $(foreach dir, $(SRCDIRS) , $(notdir $(wildcard $(dir)/*.c)))
CPPFILES   :=   $(foreach dir, $(SRCDIRS) , $(notdir $(wildcard $(dir)/*.cpp)))
SFILES      :=   $(foreach dir, $(SRCDIRS) , $(notdir $(wildcard $(dir)/*.s)))
BINFILES   :=   $(foreach dir, $(DATADIRS), $(notdir $(wildcard $(dir)/*.*)))

# --- Set linker depending on C++ file existence ---
ifeq ($(strip $(CPPFILES)),)
   export LD   := $(CC)
else
   export LD   := $(CXX)
endif

# --- Define object file list ---
export OFILES   :=                           \
   $(addsuffix .o, $(BINFILES))               \
   $(CFILES:.c=.o) $(CPPFILES:.cpp=.o)            \
   $(SFILES:.s=.o)
   
# --- Create include and library search paths ---
export INCLUDE   :=                           \
   $(foreach dir,$(INCDIRS),-I$(CURDIR)/$(dir))   \
   $(foreach dir,$(LIBDIRS),-I$(dir)/include)      \
   -I$(CURDIR)/$(BUILD)

export LIBPATHS   :=   -L$(CURDIR) $(foreach dir,$(LIBDIRS),-L$(dir)/lib)


# --- More targets ----------------------------------------------------

.PHONY: $(BUILD) clean

# --- Create $(BUILD) if necessary, and run this makefile from there ---

$(BUILD):
   @[ -d [email protected] ] || mkdir -p [email protected]
   @make --no-print-directory -f $(CURDIR)/gfxmake
   @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile

all   : $(BUILD)

clean:
   @echo clean ...
   @rm -fr $(BUILD) $(TARGET).elf $(TARGET).gba


else      # If we're here, we should be in the BUILD dir

DEPENDS   :=   $(OFILES:.o=.d)

# --- Main targets ----

$(OUTPUT).gba   :   $(OUTPUT).elf

$(OUTPUT).elf   :   $(OFILES) libgfx.a


-include $(DEPENDS)


endif      # End BUILD switch

# EOF


I am using a makefile from one of the examples from tonc in my project.

Basically SOUND_FILES holds all of the .o files I need to include with my source. Where exactly should I add $(SOUND_FILES)? These files need to be .o files before I run the makefile as they are output by another program.

I will upload my source if it is needed but I don't think it is.


Sun Sep 18, 2011 12:38 am
Profile
Site Admin

Joined: Tue Aug 09, 2005 3:21 am
Posts: 1210
Location: UK
The best way to go with this is to integrate the tool which outputs these files as part of the Makefile or the build process. In most cases you should avoid any manual steps in the build process.

It's hard to provide a definitive answer without knowing what the tool is, which files it converts from and what options are passed.

_________________
Help keep devkitPro toolchains free, Donate today

devkitPro IRC support
Personal Blog


Sun Sep 18, 2011 1:15 pm
Profile ICQ WWW

Joined: Fri Sep 09, 2011 7:22 pm
Posts: 9
Problem is that I don't want to assemble the files each time and they actually shouldn't be. Some of those files come already assembled so I can't reassemble them.

The tool is mks4agb from the Nintendo SDK. I'm basically just trying to use their music player. I got the program to work with devkitARM and now I just have to add the output files to my source. That seems to be the way it is supposed to be done since the instructions say that the output files must be give to the programer.

The make files Nintendo uses are different so I am unsure of where to put the variable. I tried putting them in a couple places but I always got the error "No rule to make target."


Sun Sep 18, 2011 8:15 pm
Profile

Joined: Fri Sep 09, 2011 7:22 pm
Posts: 9
Sorry for the double post but I don't think I'm allowed to edit my post anymore 0.o

If is helps this is what instructions say to change in the makefile.

Code:
 *Add $(SOUND_FILES) to the written portion of the link.*
                                   
  $(TARGET_ELF): $(.OFILES) $(SOUND_FILES) Makefile $(DEPENDFILE)
    @echo > $(MAPFILE)
    $(CC) -g -o [email protected] $(.OFILES) $(SOUND_FILES) -Wl, $(LDFLAGS)
 


I just need to do the same in my makefile.


Sun Sep 18, 2011 11:39 pm
Profile

Joined: Wed Mar 31, 2010 6:05 pm
Posts: 212
try


Code:
$(OUTPUT).elf   :   $(OFILES) $(SOUND_FILES) libgfx.a


If this works, then it should be pretty obvious how it is the same thing as the suggestion you received.

But if you want to do it right, then you need to be a makefile master and have the .o files built automatically as wintermute suggested


Wed Sep 21, 2011 7:05 am
Profile
Site Admin

Joined: Tue Aug 09, 2005 3:21 am
Posts: 1210
Location: UK
This is a little awkward - Nintendo SDKs are proprietary and confidential which basically means we don't have legal access to them, even if the GBA is no longer a commercially exploited platform. Generally we try to avoid supporting use of tools and libraries that we shouldn't have. The question is quite valid though, even if the tool pipeline is a bit wrong.

The Makefiles are basically designed to work from source assets and feed them through other tools to get the final output so attempting to link object files generated by a tool not on the programmer's machine can get a bit problematic. The build system expects all the final object files to be in that build folder but obviously it's not really a good idea to just dump the files in there as they'll get deleted when you make clean.

Personally I think I'd tend towards putting the sound files into a library archive and linking that directly, similar to the way the graphics files are linked. You can probably rework the graphics makefile a bit

_________________
Help keep devkitPro toolchains free, Donate today

devkitPro IRC support
Personal Blog


Wed Sep 21, 2011 12:11 pm
Profile ICQ WWW

Joined: Fri Sep 09, 2011 7:22 pm
Posts: 9
WinterMute wrote:
This is a little awkward - Nintendo SDKs are proprietary and confidential which basically means we don't have legal access to them, even if the GBA is no longer a commercially exploited platform. Generally we try to avoid supporting use of tools and libraries that we shouldn't have. The question is quite valid though, even if the tool pipeline is a bit wrong.

The Makefiles are basically designed to work from source assets and feed them through other tools to get the final output so attempting to link object files generated by a tool not on the programmer's machine can get a bit problematic. The build system expects all the final object files to be in that build folder but obviously it's not really a good idea to just dump the files in there as they'll get deleted when you make clean.

Personally I think I'd tend towards putting the sound files into a library archive and linking that directly, similar to the way the graphics files are linked. You can probably rework the graphics makefile a bit


Yeah I understand that and I would assemble the files from the makefile but some come already assembled.

I was thinking that I could put them in an archive but I was unsure as to whether that was the best solution. I was also unsure as to whether the files would actually linked. I'll try putting them in an archive and seeing if it works. Thanks =)

zeromus wrote:
try


Code:
$(OUTPUT).elf   :   $(OFILES) $(SOUND_FILES) libgfx.a


If this works, then it should be pretty obvious how it is the same thing as the suggestion you received.

But if you want to do it right, then you need to be a makefile master and have the .o files built automatically as wintermute suggested


I tried that already and it didn't work. Thanks.


Thu Sep 22, 2011 4:53 am
Profile

Joined: Wed Mar 31, 2010 6:05 pm
Posts: 212
didn't work how


Thu Sep 22, 2011 7:38 pm
Profile
Site Admin

Joined: Tue Aug 09, 2005 3:21 am
Posts: 1210
Location: UK
It doesn't work because the linker can't find the object files - the working directory is the build directory and the object files have a path relative to the Makefile. For that to work you'd probably need to specify the absolute path for each object file - this should probably work

move the SOUND_FILES variable down below BINFILES and create it using a wildcard instead of naming each file individually

Code:
SOUND_DIR := sound

...

BINFILES   :=   $(foreach dir, $(DATADIRS), $(notdir $(wildcard $(dir)/*.*)))
SOUND_FILES = $(wildcard $(CURDIR)/$(SOUND_DIR)/*.o)

...

$(OUTPUT).elf   :   $(OFILES) $(SOUND_FILES) libgfx.a

_________________
Help keep devkitPro toolchains free, Donate today

devkitPro IRC support
Personal Blog


Thu Sep 22, 2011 11:02 pm
Profile ICQ WWW

Joined: Fri Sep 09, 2011 7:22 pm
Posts: 9
Sorry for the late reply but I have been busy. The method you said in your last post doesn't seem to work. It should show the file names that are in the $(SOUND_FILES) when it links the files right?

I'm going to try putting them in an archive now.


Wed Oct 12, 2011 1:40 am
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 11 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.
Get devkitPro at SourceForge.net. Fast, secure and Free Open Source software downloads