I have the following directory structure. I try to compile all files into object files.
├── Makefile
├── prime_probe.c
└── utils
├── Makefile
├── caches_info.c
├── caches_info.h
├── caches_util.c
├── caches_util.h
├── configure.h
├── list_struct.h
├── list_utils.c
└── list_utils.h
Makefile
THIS_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
OBJDIR = obj
CFLAGS = -I./$(OBJDIR) -g -fPIC -std=gnu99
UTILS_DIR := utils
OBJS_UTL = $(addprefix $(UTILS_DIR)/$(OBJDIR)/,$(notdir $(patsubst %.c,%.o,$(shell find $(UTILS_DIR)/*.c))))
SRCS_PRIME = \
prime_probe.c
OBJS_PRIME = $(addprefix $(OBJDIR)/,$(patsubst %.c,%.o,$(SRCS_PRIME)))
all: clean utils $(OBJS_PRIME)
$(OBJDIR)/%.o: %.c | objdir
$(CC) $(CFLAGS) -c $< -o $(OBJDIR)/$(notdir $@)
utils:
$(MAKE) -C $(UTILS_DIR)
objdir:
@mkdir -p $(OBJDIR)
clean:
rm -rf $(OBJDIR)
$(MAKE) clean -C $(UTILS_DIR)/
The subdirectory Makefile is
THIS_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
##################
# Build directory
##################
OBJDIR = obj
CFLAGS = -I./$(OBJDIR) -g -fPIC -std=gnu99 -static
####################
# Files and folders
####################
SRCS_PRIME = $(shell find ./*.c)
OBJS_PRIME = $(addprefix $(OBJDIR)/,$(patsubst %.c,%.o,$(SRCS_PRIME)))
##########
# Targets
##########
all: $(OBJS_PRIME)
$(OBJDIR)/%.o: %.c | objdir
$(CC) $(CFLAGS) -c $< -g -o $@
objdir:
@mkdir -p $(OBJDIR)
clean:
rm -rf $(OBJDIR)
When I execute the make command, the files in the subdirectory are not compiled.
I do make utils
alone and this shows the subdirectories are up to date. But when I enter the subdirectory and execute make
, I can see that the file will be compiled.
Why is this so? thanks!!!
root@096b64b8fd50:/usr/local/src/gem5/programs/covert_channel# make
rm -rf obj
make clean -C utils/
make[1]: Entering directory '/usr/local/src/gem5/programs/covert_channel/utils'
rm -rf obj
make[1]: Leaving directory '/usr/local/src/gem5/programs/covert_channel/utils'
cc -I./obj -g -fPIC -std=gnu99 -c prime_probe.c -o obj/prime_probe.o
root@096b64b8fd50:/usr/local/src/gem5/programs/covert_channel# make utils
make: 'utils' is up to date.
root@096b64b8fd50:/usr/local/src/gem5/programs/covert_channel# cd utils/
root@096b64b8fd50:/usr/local/src/gem5/programs/covert_channel/utils# make
cc -I./obj -g -fPIC -std=gnu99 -static -c caches_info.c -g -o obj/./caches_info.o
cc -I./obj -g -fPIC -std=gnu99 -static -c caches_util.c -g -o obj/./caches_util.o
cc -I./obj -g -fPIC -std=gnu99 -static -c list_utils.c -g -o obj/./list_utils.o
CodePudding user response:
If you want build utils as a non-file target then you need to specify it as such with:
.PHONY: utils
I suggest don't use recursive make, besides not providing make with a global state, it also makes it unnecessarily complicated (IMHO).