I want to compile all the cpp files in my current directory into their own executables with one call. None of these files share anything so they don't need to be compiled into a single program. I was thinking about using a script but then I remembered about make and makefiles (haven't used it in years). Can I write a makefile to do this?
Asked
Active
Viewed 477 times
2 Answers
0
This post answers your question. It is about C programs but you can adapt it to C++.

Philip Nelson
- 1,027
- 12
- 28
-
Thank you! This is what I was thinking to do, was just wondering if there was something cleaner. – Igor Pieters Feb 27 '20 at 17:40
-
Look at the answer that mentions [Pattern rules](https://www.gnu.org/software/make/manual/html_node/Static-Usage.html#Static-Usage). They let you compile multiple files which require the same compilation commands. Might be cleaner. – Philip Nelson Feb 27 '20 at 17:41
0
Thanks to @Robert, I have copied his Makefile from https://stackoverflow.com/a/13696012/1860805 And made changes to work with C++. Hope it works for you
############################################################################
# 'A Generic Makefile for Building Multiple main() Targets in $PWD'
# Author: Robert A. Nader (2012)
# Ramanan.T : Modified to work with C++ (2023)
# Email: naderra at some g
# Web: xiberix
############################################################################
#
# The purpose of this makefile is to compile to executable all C source
# files in CWD, where each .c file has a main() function, and each object
# links with a common LDFLAG.
#
# This makefile should suffice for simple projects that require building
# similar executable targets. For example, if your CWD build requires
# exclusively this pattern:
#
# cc -c $(CFLAGS) main_01.cpp
# cc main_01.o $(LDFLAGS) -o main_01
#
# cc -c $(CFLAGS) main_2..cpp
# cc main_02.o $(LDFLAGS) -o main_02
#
# etc, ... a common case when compiling the programs of some chapter,
# then you may be interested in using this makefile.
#
# What YOU do:
#
# Set PRG_SUFFIX_FLAG below to either 0 or 1 to enable or disable
# the generation of a .exe suffix on executables
#
# Set CFLAGS and LDFLAGS according to your needs.
#
# What this makefile does automagically:
#
# Sets SRC to a list of *.c files in PWD using wildcard.
# Sets PRGS BINS and OBJS using pattern substitution.
# Compiles each individual .c to .o object file.
# Links each individual .o to its corresponding executable.
#
###########################################################################
#
PRG_SUFFIX_FLAG := 0
#
CFLAGS_INC :=
CFLAGS := -g -Wall $(CFLAGS_INC)
CXXFLAGS = -m64 -O0 -g3 -Wall -DUNIX=1 -DMETA=1
LDFLAGS = -g3 -O0 -m64
#
## ==================- NOTHING TO CHANGE BELOW THIS LINE ===================
##
SRCS := $(wildcard *.cpp)
PRGS := $(patsubst %.cpp,%,$(SRCS))
PRG_SUFFIX=.exe
BINS := $(patsubst %,%$(PRG_SUFFIX),$(PRGS))
## OBJS are automagically compiled by make.
OBJS := $(patsubst %,%.o,$(PRGS))
##
all : $(BINS)
##
## For clarity sake we make use of:
.SECONDEXPANSION:
OBJ = $(patsubst %$(PRG_SUFFIX),%.o,$@)
ifeq ($(PRG_SUFFIX_FLAG),0)
BIN = $(patsubst %$(PRG_SUFFIX),%,$@)
else
BIN = $@
endif
## Compile the executables
%$(PRG_SUFFIX) : $(OBJS)
$(CXX) $(OBJ) $(CXXFLAGS) $(LDFLAGS) -o $(BIN)
##
## $(OBJS) should be automagically removed right after linking.
##
clean:
ifeq ($(PRG_SUFFIX_FLAG),0)
$(RM) $(PRGS) $(OBJS)
else
$(RM) $(BINS) $(OBJS)
endif
##
rebuild: clean all
##
## eof Generic_Multi_Main_PWD.makefile

Ramanan T
- 179
- 1
- 10