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, instea
I think this can be done with wild cards in GNU make (and IIRC you can run it on windows). Aside from that, I'm sorry but I don't known nmake
.
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.
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.
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.
.cpp.obj:
$(CC) $(CFLAGS) $*.cpp
is a default rule that will automatically resolve .obj dependencies from .cpp files...
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.
Where $**
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. This is the most elegant approach, otherwise you can call cmd
to print all *.c
filenames to a text and load from it.