pseudonym_127
pseudonym_127

Reputation: 357

Outputting obj files to obj directory in Makefile

Hi I wrote this Makefile by modifying this example: https://sites.google.com/site/michaelsafyan/software-engineering/how-to-write-a-makefile

program_NAME := bin/myprogram

SRC_DIR := src

#
#srces
#
program_C_SRCS := $(wildcard $(SRC_DIR)/*.c)
program_CXX_SRCS :=  $(wildcard $(SRC_DIR)/*.cpp)

#
#obj files
#
program_C_OBJS := ${program_C_SRCS:.c=.o}
program_CXX_OBJS := ${program_CXX_SRCS:.cpp=.o}
program_OBJS := $(program_C_OBJS) $(program_CXX_OBJS)

#
# include and library dirs; also libraries
#
program_INCLUDE_DIRS := inc
program_LIBRARY_DIRS :=
program_LIBRARIES :=

# flags
CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))

#
# targets
#

.PHONY: all clean distclean

all: $(program_NAME)

$(program_NAME): $(program_OBJS)
       $(LINK.cc) $(program_OBJS) -o $(program_NAME)


clean:
   @- $(RM) $(program_NAME)
   @- $(RM) $(program_OBJS)

distclean: clean

It works in the following way. The classes below are compiled into an executable "myprogram" which is output in the bin directory. The only issue is the object files are created inside the src folder, instead of the obj folder. How can I modify this makefile such that obj files are created in the obj folder? Thank you.

 /project
        Makefile

        /src
            Class1.cpp
            Class2.cpp
            main.cpp
        /obj

        /bin
            myProgram
        /inc
            Class1.h
            Class2.h

Upvotes: 0

Views: 355

Answers (2)

Some programmer dude
Some programmer dude

Reputation: 409196

To start with, you could use e.g. the subst function to replace the source-file directory with the object-file directory:

program_OBJS  = $(subst $(SRC_DIR),$(OBJ_DIR),$(program_C_OBJS))
program_OBJS += $(subst $(SRC_DIR),$(OBJ_DIR),$(program_CXX_OBJS))

Of course you now need to add a target for object-file creation, as these will not be put in the correct place otherwise:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(CFLAGS) -c -o $@ $<

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
    $(CXX) $(CXXFLAGS) -c -o $@ $<

Upvotes: 3

Emanuele Paolini
Emanuele Paolini

Reputation: 10162

Try with something like:

OUT_DIR=obj
program_bare_OBJS := $(program_C_OBJS) $(program_CXX_OBJS)
program_OBJS=$(addprefix $(OUT_DIR)/,$(program_bare_OBJS))

Upvotes: 0

Related Questions