Reputation:
Using nmake, is it possible to have the makefile build all the .cpp files in the current directory automatically, without having to specify them individually?
So, instead of something like:
O = $(OBJ_DIR)/main.obj
{$(SOURCE_DIR)}.cpp{$(OBJ_DIR)}.obj:
---COMPILE $< HERE---
I'd like to avoid having to specify each obj to make. Can this be done?
Upvotes: 4
Views: 7254
Reputation: 1087
Just
main.exe: *.c resource.RES
@$(MAKE) $(**:.c=.obj)
link $(**:.c=.obj) /OUT:$@
and you don't need to add anything else! Every time you nmake
, all *.c
will be checked if it is compiled or not.
Details:
$**
for the dependencies$@
for the target$(**:.c=.obj)
is a string substitute, replacing the .c
suffix with .obj
. And when it comes to resource.RES
, it will not replace anything.Note that there is a recursive call, and this is the most elegant approach. Otherwise it is necessary to get all *.c
filenames with manners like a script.
Upvotes: 3
Reputation: 15493
You can run a shell command during nmakefile preprocessing, and then !include
the output. Naturally the output needs to be in nmake format. Something like:
!if [bash -c "echo O = *.cpp" >sources.mak]
!error Failed to generate source list
!endif
!include sources.mak
all: $(O:.cpp=.obj)
.cpp.obj:
---COMPILE $< HERE---
I suspect that most people would not use bash to create sources.mak
, but you get the idea.
Upvotes: 0
Reputation: 7939
One possibility is to wrap the make in a script.
Either use a for loop, calling make on each .cpp file or construct a list of cpp files and use it as a parameter to the makefile.
Upvotes: 0
Reputation: 40789
.cpp.obj:
$(CC) $(CFLAGS) $*.cpp
is a default rule that will automatically resolve .obj dependencies from .cpp files...
Upvotes: 1
Reputation: 9982
You can use a rule like this:
{src\mystuff}.c{tmp\src\mystuff}.obj::
$(CC) /nologo $(CFLAGS) /c /Fotmp\src\mystuff\ $<
which will find and compile all the .c
files in src\mystuff
and put the object files in tmp\src\mystuff
. Substitute .cpp
for .c
in your case.
Note that the first character on the second line should be a tab, not spaces.
Also, $(CC)
is predefined by nmake to be cl
, and you can add any compiler flags you need to $(CFLAGS)
, hard-code them in the rule or add a different variable there, as you prefer.
Upvotes: 2