Makefile for building multiple programs


 
Thread Tools Search this Thread
Top Forums Programming Makefile for building multiple programs
# 1  
Old 02-07-2013
Makefile for building multiple programs

I have the following part of a makefile and want to simplify it
using rules rather than having to code the same two blocks
when I need ti build another program.

An having difficulty doing it

Code:
all: 1dvel2 1dvel 2dvel


#--------------------------------------------------------------------

1dvel2 : 1dvel2.o $(MISC_MAINDIR)/ray.par
    $(FCOMPILER) -o $(BINDIR)/1dvel2 $(OBJDIR)/1dvel2.o

1dvel2.o : $(MISC_MAINDIR)/1dvel2.f
    $(FCOMPILER) -c $<
    mv *.o $(OBJDIR)

#--------------------------------------------------------------------

1dvel : 1dvel.o $(MISC_MAINDIR)/ray.par
    $(FCOMPILER) -o $(BINDIR)/1dvel $(OBJDIR)/1dvel.o

1dvel.o : $(MISC_MAINDIR)/1dvel.f
    $(FCOMPILER) -c $<
    mv *.o $(OBJDIR)

#--------------------------------------------------------------------

2dvel : 2dvel.o $(MISC_MAINDIR)/ray.par
    $(FCOMPILER) -o $(BINDIR)/2dvel $(OBJDIR)/2dvel.o

2dvel.o : $(MISC_MAINDIR)/2dvel.f
    $(FCOMPILER) -c $<
    mv *.o $(OBJDIR)

---------- Post updated at 11:42 AM ---------- Previous update was at 06:52 AM ----------

I am now doing like this. Now the problem in putting the separate executable
targets together

Code:
TARGETS = $(BINDIR)/1dvel2 $(BINDIR)/1dvel $(BINDIR)/2dvel
all: $(TARGETS)

$(BINDIR)/1dvel2 : $(OBJDIR)/1dvel2.o $(MISC_MAINDIR)/ray.par
    $(FCOMPILER) -o $@ $<

$(BINDIR)/1dvel : $(OBJDIR)/1dvel.o $(MISC_MAINDIR)/ray.par
    $(FCOMPILER) -o $@ $<

$(BINDIR)/2dvel : $(OBJDIR)/2dvel.o $(MISC_MAINDIR)/ray.par
    $(FCOMPILER) -o $@ $<

#--------------------------------------------------------------------

$(OBJDIR)/%.o : $(MISC_MAINDIR)/%.f
    $(FCOMPILER) -c $<
    mv *.o $(OBJDIR)


Last edited by kristinu; 02-23-2013 at 02:13 PM..
# 2  
Old 02-08-2013
Why do you want the following line?

TARGETS = $(BINDIR)/1dvel2 $(BINDIR)/1dvel $(BINDIR)/2dvel
all: $(TARGETS)

Do you wanna create a new executable with these three binaries?
# 3  
Old 02-14-2013
Why are you moving the object files? If you do, make will always think the object files are missing and force a rebuild.

I think you should place the makefile and source files in the same directory. Let make buidl the programs in that directory. Add a seperate clean target that removes temporary files.
# 4  
Old 02-14-2013
He has heard and ignored this advice before; as with most other problems, he insists on his own unique(tm) solutions.
# 5  
Old 02-21-2013
Make and source files can be in different folders.

I don't understand how the three targets are combined into one.
# 6  
Old 02-23-2013
The problem is that I do not want to combine the targets into one. Now I have another makefile like this. A problem I have is that the makefile
is not printing anything when building the targets.

Code:
# Fortran linker
FLINKER = gfortran

# Fortran compiler
FCOMPILER = gfortran

MAINDIR = ../../../libs/main
MISC_MAINDIR = $(MAINDIR)/misc
OBJDIR = ../release/obj
BINDIR = ../release/bin

MISC_INCLUDE = $(MISC_MAINDIR)/ray.par

LDFLAGS :=
CFLAGS_INC :=
CFLAGS := -g -Wall $(CFLAGS_INC)

# SOURCE FILES
SRCS := $(wildcard $(MISC_MAINDIR)/*.f)
SRCNAMES :=  $(notdir $(SRCS))

# OBJECT FILES
OBJS = $(subst .f,.o,$(subst $(MISC_MAINDIR),$(OBJDIR),$(SRCS)))
OBJNAMES :=  $(patsubst %.f,%,$(notdir $(OBJS)))

# LIST OF MISC EXECUTABLES
TARGETS = $(patsubst %.f,%,$(subst $(MISC_MAINDIR),$(BINDIR),$(SRCS)))
TARGETNAMES :=  $(patsubst %.f,%,$(notdir $(TARGETS)))

all : $(OBJS) $(TARGETS)

$(TARGETS) : 
    for T in $(TARGETNAMES) ; do \
      $(FCOMPILER) -o $(BINDIR)/$$T $(OBJDIR)/$$T.o ; \
    done

$(OBJDIR)/%.o : $(MISC_MAINDIR)/%.f $(MISC_MAINDIR)/ray.par
    $(FCOMPILER) -c $<
    mv *.o $(OBJDIR)

# 7  
Old 02-23-2013
Quote:
Originally Posted by Corona688
He has heard and ignored this advice before; as with most other problems, he insists on his own unique(tm) solutions.
Ok Ok. So what am I supposed to do as I do not like all object files, makefiles and executables in the same directory. Or is it that that things are done this way?

---------- Post updated at 01:32 PM ---------- Previous update was at 01:26 PM ----------

I think there is a way how to make the compiler to know where the .o files are.

---------- Post updated at 03:12 PM ---------- Previous update was at 01:32 PM ----------

This is the new make file.

I noticed that when I do
Code:
make all

the object files are removed. Cannot figure out how make issues a remove at the end


Code:
# Fortran linker
FLINKER = gfortran

# Fortran compiler
FCOMPILER = gfortran

RM_OPT = --preserve-root --verbose

MAINDIR = ../../../libs/main
MISC_MAINDIR = $(MAINDIR)/misc
OBJDIR = ../release/obj
BINDIR = ../release/bin

MISC_INCLUDE = $(MISC_MAINDIR)/ray.par

LDFLAGS :=
CFLAGS_INC :=
CFLAGS := -g -Wall $(CFLAGS_INC)

# SOURCE FILES
SRCS := $(wildcard $(MISC_MAINDIR)/*.f)
SRCNAMES :=  $(notdir $(SRCS))

# OBJECT FILES
OBJS = $(subst .f,.o,$(subst $(MISC_MAINDIR),$(OBJDIR),$(SRCS)))
OBJNAMES :=  $(patsubst %.f,%,$(notdir $(OBJS)))

# LIST OF MISC EXECUTABLES
TARGETS = $(patsubst %.f,%,$(subst $(MISC_MAINDIR),$(BINDIR),$(SRCS)))
TARGETNAMES :=  $(patsubst %.f,%,$(notdir $(TARGETS)))

.PHONY : default
default : help

all : $(TARGETS)

$(BINDIR)/% : $(OBJDIR)/%.o
    $(FCOMPILER) -o $@ $^

# COMPILE MISC MAIN PROGRAMS
$(OBJDIR)/%.o : $(MISC_MAINDIR)/%.f $(MISC_MAINDIR)/ray.par
    $(FCOMPILER) -c $<
    mv *.o $(OBJDIR)

# DELETE OBJECT AND EXECUTABLE FILES

.PHONY: clean cleanall clean_objects clean_targets

clean : cleanall
cleanall : clean_objects clean_targets

clean_objects :
    -$(RM) $(RM_OPT) $(OBJS)

clean_targets :
    -$(RM) $(RM_OPT) $(TARGETS)

.PHONY : help
help :
    @echo ""
    @echo "Operating System Detected: $(OPSYS) "
    @echo " "
    @echo "USAGE: "
    @echo ""
    @echo "  make -f misc.mk        To get this listing"
    @echo "  make -f misc.mk help   To get this listing"
    @echo "  make -f misc.mk all    Builds the application xzslice"
    @echo "  make -f misc.mk list   List the details of building nraypk"
    @echo "  make -f misc.mk clean  Remove object and executable files"
    @echo ""
    @echo "OBJDIR = $(OBJDIR)"
    @echo ""
    @echo "OBJS = $(OBJS)"
    @echo ""
    @echo "TARGETNAMES = $(TARGETNAMES)"
    @echo ""

MSG1_SRCNAMES = $(firstword $(SRCNAMES))
MSG2_SRCNAMES = $(wordlist 2, $(words $(SRCNAMES)), $(SRCNAMES))

MSG1_OBJNAMES = $(firstword $(OBJNAMES))
MSG2_OBJNAMES = $(wordlist 2, $(words $(OBJNAMES)), $(OBJNAMES))

.PHONY : list
list :
    @echo ""
    @echo "SETUP"
    @echo "====="
    @echo ""
    @echo "  OPSYS:      $(OPSYS)"
    @echo "  EXEC:       $(EXEC_NRAYPK) $(EXEC_XRAYPK)"
    @echo "  TARGET:     $(TARGET_NRAYPK) $(TARGET_XRAYPK)"
    @echo "  FCOMPILER:  $(FCOMPILER)"
    @echo "  FLINKER:    $(FLINKER)"
    @echo "  CCOMPILER:  $(CCOMPILER)"
    @echo "  OPMZ:       $(OPMZ_OPTN)"
    @echo "  CURDIR:     $(CURDIR)"
    @echo ""
    @echo ""
    @echo "DIRECTORIES"
    @echo "==========="
    @echo ""
    @echo "  OBJDIR = $(OBJDIR)"
    @echo "  BINDIR = $(BINDIR)"
    @echo ""
    @echo "TARGETS"
    @echo "======="
    @echo ""
    @echo "  TARGETS = $(TARGETS)"
    @echo ""
    @echo "  TARGETNAMES = $(TARGETNAMES)"
    @echo ""
    @echo "INCLUDE FILES"
    @echo "============="
    @echo ""
    @echo "  MISC_INCLUDE = $(MISC_INCLUDE)"
    @echo ""
    @echo "SOURCE FILES"
    @echo "============"
    @echo ""
    @echo "  SRCNAMES = $(MSG1_SRCNAMES)"
    @$(foreach s, $(MSG2_SRCNAMES), echo "            $(s)";)
    @echo ""
    @echo "OBJECT FILES"
    @echo "============"
    @echo ""
    @echo "  OBJS = $(OBJS)"
    @echo ""
    @echo "  OBJNAMES = $(MSG1_OBJNAMES)"
    @$(foreach s, $(MSG2_OBJNAMES), echo "            $(s)";)
    @echo ""

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Makefile with multiple executables

CROSS_COMPILE?= LIBDIR_APP_LOADER?=../../../../app_loader/lib INCDIR_APP_LOADER?=../../../../app_loader/include BINDIR?=../../bin CFLAGS+= -Wall -I$(INCDIR_APP_LOADER) -D__DEBUG -O2 -mtune=cortex-a8 -march=armv7-a -std=gnu99 LDFLAGS+=-L$(LIBDIR_APP_LOADER) -lprussdrv -lpthread OBJDIR=obj... (1 Reply)
Discussion started by: bpetersen
1 Replies

2. Shell Programming and Scripting

Help: Makefile with multiple executables

I am trying to create executables for the following files Currently, I am making 9 different directories for for each. I would like to make 1 directory but everytime I try it does not work. CROSS_COMPILE?= # CROSS_COMPILE used to = arm-arago-linux-gnueabi... (1 Reply)
Discussion started by: bpetersen
1 Replies

3. Shell Programming and Scripting

Building programs from separate makefiles

I have several makefiles to build various programs in a software suite (currently 4 programs). I want to create a main Makefile so that I can build everything I need. Unsure on the way I should proceed, for example using include fdtc.mk or calling $(MAKE) -f ./mk/Makefile nfdtc Here... (15 Replies)
Discussion started by: kristinu
15 Replies

4. Shell Programming and Scripting

Run multiple python programs sequentially.

I HAVE WRITTEN NINE PYTHON CODES TO PERFORM A TASK ........ I WISH TO RUN THEM SEQUENTIALLY. eg. code1__code2 >>>>>>>>code9.py TO GET DESIRED OUTPUT. PLS HELP ME WRITTING SHELL SCRIPT .. I HAVE TO DISTRIBUTE THESE CODE FOR BEING USED BY OTHERS. (2 Replies)
Discussion started by: upvan111
2 Replies

5. UNIX for Advanced & Expert Users

makefile head-scratcher: multiple targets in one go

Hi! I've got a build process where scripts create multiple targets from their sources. But here I'm running into a conceptual problem of GNU make: If one has multiple targets in a dependency, make applies the rules once for every target that is out of sync - which is correct for normal... (3 Replies)
Discussion started by: treczoks
3 Replies

6. Shell Programming and Scripting

Multiple script lines into a Makefile

Hi All I am creating a makefile and I want to do a clean section. In the clean section I would like to check if the file exists and then delete it. I always have an error 'unexpected end of file' What's wrong in it? Thanks msntn firstCpp: first.cpp g++ -o first first.cpp clean: ... (1 Reply)
Discussion started by: manustone
1 Replies

7. UNIX for Dummies Questions & Answers

epstopdf for multiple files using makefile

Greetings! I'm fairly new to the unix world and I hope someone here can help me with my question. I'm using a Makefile to run a few programs and the final output is several .eps files. However I need them to be .pdf files, so I want to use epstopdf to convert the files. Since I'm already... (6 Replies)
Discussion started by: wwoord
6 Replies

8. Shell Programming and Scripting

How to change a Makefile from building static library to shared library?

Hi: I have a library that it only offers Makefile for building static library. It built libxxx.a file. How do I in any way build a shared library? (either changin the Makefile or direct script or command to build shared library) Thanks. (1 Reply)
Discussion started by: cpthk
1 Replies

9. Shell Programming and Scripting

building output file from multiple input files

Hi there, I am trying to figure out a way to combine multiple sources with different data on a single file, and I am trying to find the best way to do it. I have multiple files, let's say A, B, C and D. A has a field in common with B, B has a field in common with C, and C has a field in... (2 Replies)
Discussion started by: ppucci
2 Replies

10. Programming

makefile for programs using libraries loaded at runtime

Hi everybody! I would like to set in the makefile a path that should be the path where the program searches for the libraries loaded at run time. Is there such a variable to be set in makefile? Thanks in advance! (1 Reply)
Discussion started by: nadiamihu
1 Replies
Login or Register to Ask a Question