2

I have a project structure that looks something like this:

.
└── src
    ├── Module1
    │   ├── source1.cc
    │   ├── source2.cc
    │   └── source3.cc
    ├── Module2
    │   ├── source1.cc
    │   ├── source2.cc
    │   └── source3.cc
    └── Module3
        ├── source1.cc
        ├── source2.cc
        └── source3.cc

I have an implicit rule that will create an object file for each source file, and maintain the directory structure (e.g. src/Module1/source2.cc would compile to obj/Module1/source2.o).

However, I would now like to have an implicit rule to create archive files for each module. For example, each object file compiled from src/Module2 would be added to obj/Module2.a. My first idea looked quite similar to my implicit rule for object files:

obj/%.a: $(wildcard obj/%/*.o)
    @mkdir -p $(@D);
    ar -crs "$@" $^;

This would pass off the work of compiling the object files to the other implicit rule. However, the issue here is that the % character is not expanded.

Is there a way to access the % from the implicit rule within the wildcard function call?

John Leuenhagen
  • 576
  • 7
  • 23

1 Answers1

2

You can do it with Secondary Expansion:

.SECONDEXPANSION:
obj/%.a: $$(wildcard obj/%/*.o)
    @mkdir -p $(@D);
    ar -crs "$@" $^;
Beta
  • 96,650
  • 16
  • 149
  • 150