Building programs from separate makefiles


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Building programs from separate makefiles
# 1  
Old 01-22-2013
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

Code:
include fdtc.mk

or calling

Code:
$(MAKE) -f ./mk/Makefile nfdtc

Here is a listing of one makefile, the others are similar


Code:
#####
#
# Makefile for fdtc application
#
#####

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

# Source code paths

OPSYS = $(shell uname -s )
TARGET = nraypk

FDTC_INCDIR = ../include/fdtc

FDTC_PRGDIR = ../src/app
FDTC_LIBDIR = ../src/flib/fdtc
PLOTX_LIBDIR = ../src/flib/plotx11

OBJDIR = ./obj
BINDIR = ./bin

APP = $(BINDIR)/$(TARGET)

FDTC_APPDIR = ../src/app
FDTC_LIBDIR = ../src/flib/fdtc
PLOT_LIBDIR = ../src/flib/pltlib

OBJDIR = ./obj
BINDIR = ./bin

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

# Set Fortran compiler
FCOMP = gfortran

# Set Fortran compiler options
FCOMP_OPT = -O -Wall -fbacktrace -fno-align-commons -I$(FDTC_INCDIR)

# Set Fortran compiler options
FLINK_OPT = -O -Wall -fbacktrace -fno-align-commons -I$(FDTC_INCDIR)

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

# Source files

FDTC_APPSRC = $(FDTC_APPDIR)/fdtc.f

FDTC_LIBSRC = $(FDTC_LIBDIR)/model.f \
    $(FDTC_LIBDIR)/time.f \
    $(FDTC_LIBDIR)/findiff.f \
    $(FDTC_LIBDIR)/findiff2d.f \
    $(FDTC_LIBDIR)/stencils.f \
    $(FDTC_LIBDIR)/stencils2d.f \
    $(FDTC_LIBDIR)/misc.f \
    $(FDTC_LIBDIR)/plt.f \
    $(FDTC_LIBDIR)/blkdat.f

PLOTX_SRC = $(PLOTX_LIBDIR)/nopltlib.f

FDTC_LIBINC = $(FDTC_INCDIR)/fd.par \
    $(FDTC_INCDIR)/fd.com

#--------------------------------------------------------------------------------------
# Object files

FDTC_PRGOBJ = $(subst .f,.o,$(subst $(RAYPK_PRGDIR),$(OBJDIR),$(RAYPK_PRGSRC)))
FDTC_LIBOBJ = $(subst .f,.o,$(subst $(RAYPK_LIBDIR),$(OBJDIR),$(RAYPK_LIBSRC)))
PLOTX_LIBOBJ = $(subst .f,.o,$(subst $(PLOTX_LIBDIR),$(OBJDIR),$(PLOTX_LIBSRC)))

FDTC_APPOBJ = $(OBJDIR)/fdtc.o

FDTC_LIBOBJ = $(OBJDIR)/model.o \
    $(OBJDIR)/time.o \
    $(OBJDIR)/findiff.o  \
    $(OBJDIR)/findiff2d.o \
    $(OBJDIR)/stencils.o \
    $(OBJDIR)/stencils2d.o \
    $(OBJDIR)/misc.o \
    $(OBJDIR)/plt.o \
    $(OBJDIR)/blkdat.o

PLOTX_LIBOBJ = $(OBJDIR)/nopltlib.o

FDTC_ALLOBJ = $(FDTC_APPOBJ) $(FDTC_LIBOBJ) $(PLOTX_LIBOBJ)

# Name of FDTC application
FDTC_APPNAME = $(BINDIR)/nfdtc

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

default: help

help:
    @echo " "
    @echo "Operating System Detected: $(OPSYS) "
    @echo " "
    @echo "USAGE: "
    @echo " "
    @echo "  make -f nraypk.mk           To get this listing"
    @echo "  make -f nraypk.mk help      To get this listing"
    @echo "  make -f nraypk.mk list      List the details of building nraypk"
    @echo "  make -f nraypk.mk nraypk    Builds the application nraypk in BINDIR"
    @echo "  make -f nraypk.mk clean     Remove *.o and executable files"

list:
    @echo ""
    @echo "OPSYS:  $(OPSYS)"
    @echo "APPL:   $(TARGET)"
    @echo "FCOMP:  $(FORTRAN_COMPILER)"
    @echo "CCOMP:  $(C_COMPILER)"
    @echo "CURDIR: $(CURDIR)"
    @echo ""
    @echo "---------------"
    @echo ""
    @echo "DIRECTORIES (relative to CURDIR)"
    @echo ""
    @echo "  OBJDIR = $(OBJDIR)"
    @echo "  BINDIR = $(BINDIR)"
    @echo ""
    @echo "---------------"
    @echo ""
    @echo "SOURCE FILES (relative to CURDIR)"
    @echo ""
    @echo "  RAYPK_PRGSRC = $(RAYPK_PRGSRC)"
    @echo ""
    @echo "  RAYPK_LIBSRC = $(LIBSRC_MSG1)"
    @$(foreach s, $(LIBSRC_MSG2), echo "                 $(s)";)
    @echo ""
    @echo "  PLOTX_LIBSRC = $(PLOTX_LIBSRC)"
    @echo ""
    @echo "---------------"
    @echo ""
    @echo "OBJECT FILES (relative to CURDIR)"
    @echo ""
    @echo "  RAYPK_PRGOBJ = $(RAYPK_PRGOBJ)"
    @echo ""
    @echo "  RAYPK_LIBOBJ = $(LIBOBJ_MSG1)"
    @$(foreach s, $(LIBOBJ_MSG2), echo "                 $(s)";)
    @echo ""
    @echo "  PLOTX_LIBOBJ = $(PLOTX_LIBOBJ)"

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

# Generate nfdtc application
nfdtc : $(FDTC_ALLOBJ) $(FDTC_LIBINC)
    $(FCOMP) $(FLINK_OPT) $(FDTC_ALLOBJ) -o $(FDTC_APPNAME)

# Compile main program
$(FDTC_APPOBJ) : $(FDTC_APPSRC) $(FDTC_LIBINC)
    $(FCOMP) $(FCOMP_OPT) -c $(FDTC_APPSRC)
    mv *.o $(OBJDIR)

# Compile FD Library
$(FDTC_LIBOBJ) : $(FDTC_LIBSRC) $(FDTC_LIBINC)
    $(FCOMP) $(FCOMP_OPT) -c $(FDTC_LIBSRC)
    mv *.o $(OBJDIR)

# Compile PLOT Library, with plotting mode disabled
$(FDTC_NOPLOT_LIBOBJ) : $(NOPLOT_SRC) $(FDTC_LIBINC)
    $(FCOMP) $(FCOMP_OPT) -c $(NOPLOT_SRC)
    mv *.o $(OBJDIR)

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

clean:
    rm -f -I $(OBJDIR)/*.o $(BINDIR)/xzslice

allclean:
    rm -f -I $(OBJDIR)/*.o $(BINDIR)/*

#######################################################################################
# END

# 2  
Old 01-22-2013
One of the simpler ways to do this is recursive make:

Code:
outputfolder/outputfile:outputfolder/Makefile
        make -C outputfolder

which is equivalent to cd outputfolder ; make

This lets you call a makefile in another folder without having to incorporate it into your own lock, stock, and barrel.

make supports recursion directly, and will tell you how deep into recursion it is.
# 3  
Old 01-22-2013
A problem I have is how to pass the option from the main makefile to the subdirectory makefile. I do not like using recursive make build systems (example a make in every directory). However, since I have put all the make files in one place together with a main Makefile, I do not see a problem.
# 4  
Old 01-22-2013
I agree in principle. When writing new makefiles, one should write it as one system so it can run efficiently.

When you have to use someone else's makefiles however, you have very little control.

If you're not rewriting them, cramming them all together in one folder is hardly better than keeping them separate. When they were in folders, they were at least organized. Now it's one awful pile.

What option are you trying to pass, to what? If you're not calling make again, there's not a lot to pass options to.
# 5  
Old 01-22-2013
What I did was to have only one makefile for each application and store them in a single folder. Then the main Makefile will execute the appropriate Makefile

I think I have a solution. Let me try it and will report back.

---------- Post updated at 11:32 AM ---------- Previous update was at 11:26 AM ----------

I am rewriting them.
# 6  
Old 01-24-2013
Quote:
Originally Posted by Corona688
One of the simpler ways to do this is recursive make:

Code:
outputfolder/outputfile:outputfolder/Makefile
        make -C outputfolder

which is equivalent to cd outputfolder ; make

This lets you call a makefile in another folder without having to incorporate it into your own lock, stock, and barrel.

make supports recursion directly, and will tell you how deep into recursion it is.
I cannot quite understand how to use the above code

My directory structure is as below. The user uses Makefile. The makefile calls
the makefile for the specific program.

Code:
.
├── Makefile
└── mk
    ├── fdtc.mk
    ├── raypk.mk
    └── zslice.mk

Here is the code for Makefile

Code:
default: help

help : help-nfdtc help-nraypk help-xraypk help-xzslice 

help-nfdtc : 
    $(MAKE) -f fdtc.mk help

help-nraypk : 
    $(MAKE) -f raypk.mk help

help-xraypk : 
    $(MAKE) -f raypk.mk help

help-xzslice : 
    $(MAKE) -f zslice.mk help

list : list-nfdtc list-nraypk list-xraypk list-xzslice

list-nfdtc :
    $(MAKE) -f fdtc.mk list
    
list-nraypk :
    $(MAKE) -f raypk.mk list

list-xraypk :
    $(MAKE) -f raypk.mk list
    
list-xzslice :
    $(MAKE) -f zslice.mk list
    
#---------------------------------------------------------------------------------------------------

nfdtc :
    $(MAKE) -f fdtc.mk nfdtc

nraypk :
    $(MAKE) -f raypk.mk nraypk

xraypk :
    $(MAKE) -f raypk.mk xraypk

xzslice :
    $(MAKE) -f zslice.mk xzslice

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

clean : clean-fdtc clean-raypk clean-zslice

clean-fdtc :
    make -f fdtc.mk clean

clean-raypk :
    make -f raypk.mk clean

clean-zslice :
    make -f zslice.mk clean

# 7  
Old 01-24-2013
I have no idea why you have done what you have, now. Why bother rewriting it if you're going to do exactly what you said you were trying to avoid? You've got exactly what you had before, except instead of nicely organized into folders, it's one enormous mess.

You might as well have just let them live in their own folders and used their old makefiles. Then you could do this:

Code:
all:projectfolder1/projectoutputfile projectfolder2/projectoutputfile ...

projectfolder1/projectoutputfile:projectfolder1/Makefile
        make -C projectfolder1

projectfolder2/projectoutputfile:projectfolder2/Makefile
        make -C projectfolder2

Then you could do 'make all' and it would run make in each of the folders.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Makefiles

Hi All, I was going through some makefiles where I saw occurrences of explib_subdirs and expinc_subdirs, which I could not understand. Exporting libs to subdirs ? Exporting include files to specified subdirs ? When do we need to do that ? What I could understand is, for a build, I would... (4 Replies)
Discussion started by: alltaken
4 Replies

2. UNIX for Dummies Questions & Answers

Difference between inbuilt suid programs and user defined root suid programs under bash shell?

Hey guys, Suppose i run passwd via bash shell. It is a suid program, which temporarily runs as root(owner) and modifies the user entries. However, when i write a C file and give 4755 permission and root ownership to the 'a.out' file , it doesn't run as root in bash shell. I verified this by... (2 Replies)
Discussion started by: syncmaster
2 Replies

3. Programming

First time programmer needs Help with Makefiles

I am trying to practice to create Makefiles. The goal is to create a makefile such that if a change is made to any of the source code files, the project can be rebuilt by typing make at the command line. I have the following files: ac.cc: has include ac.h and pg.h fr.cc: has main... (8 Replies)
Discussion started by: pintu1228
8 Replies

4. Programming

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 all: 1dvel2 1dvel 2dvel ... (8 Replies)
Discussion started by: kristinu
8 Replies

5. Programming

Makefiles for different programs

I have several programs in several directories and want to use make to build the executables. What I have done is to put the main programs in their own directory together with a makefile to build the program. Then I am thinking of having another makefile residing in the directory above so I can run... (1 Reply)
Discussion started by: kristinu
1 Replies

6. UNIX for Dummies Questions & Answers

Are programs like sys_open( ) ,sys_read( ) et al examples of system level programs ?

Are the programs written on schedulers ,thread library , process management, memory management, et al called systems programs ? How are they different from the programs that implement functions like open() , printf() , scanf() , read() .. they have a prefix sys_open, sys_close, sys_read etc , right... (1 Reply)
Discussion started by: vishwamitra
1 Replies

7. UNIX for Advanced & Expert Users

makefiles

Solved........ (0 Replies)
Discussion started by: klam
0 Replies

8. Shell Programming and Scripting

How can I print variables im using in makefiles?

for example in my make file im building path from env variables and string but need to see what is did what is the best way to print the result? say I have in my Makefile : exec_prefix = $(RUN_ENV_LOCAL)/apache and I will like to print the exec_prefix value , how can it be done ? (1 Reply)
Discussion started by: umen
1 Replies

9. UNIX for Dummies Questions & Answers

makefiles in a directory and subdirectories

I need to develop a makefile that spans across directories. For example, let's say i have an upper level directory (main) and about 2 subdirectories. I want my .cpp files and .o files to be in one subdirectory. I want my .a files to be in the other subdirectory. The .a files are made up of the... (0 Replies)
Discussion started by: benjie_asu
0 Replies

10. UNIX for Advanced & Expert Users

Combining makefiles

I have concatenated 2 makefiles, to produce 1 however it is not running all of the code, producing a fatal error: symbol referencing errors. No output written. Can anybody please help? (4 Replies)
Discussion started by: Dan Rooney
4 Replies
Login or Register to Ask a Question