C语言 Makefiles没有递归构建子目录



我有以下目录结构。我尝试将所有文件编译成目标文件。

├── 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)/

子目录Makefile是

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)

当我执行make命令时,子目录下的文件不被编译。我只做make utils,这表明子目录是最新的。但是当我进入子目录并执行make时,我可以看到文件将被编译。

为什么会这样?谢谢! !

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

如果您想将utils构建为非文件目标,那么您需要这样指定它:

.PHONY: utils

我建议不要使用递归make,除了没有为make提供全局状态之外,它还使它不必要地复杂(IMHO)。

最新更新