2014-01-24 44 views
1

我已經測試項目文件夾結構視圖:功能在Makefile中定義

TOPDIR 
├── a 
│   └── a.c 
├── b 
│   └── b.c 
├── c 
│   └── c.c 
└── makefile 

我寫了一個測試生成文件:在make期間

CC  := gcc 
LD  := ld 

MAKE_DIR = $(PWD) 
MODULES := a b c 
SRC_DIR := $(addprefix ${MAKE_DIR}/,$(MODULES)) 

SRC := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.c)) 
OBJ := $(patsubst %.c,%.o,$(SRC)) 

INCLUDES := $(addprefix -I,$(SRC_DIR)) 

vpath %.c $(SRC_DIR) 

define make-goal 
$1/%.o: %.c 
    $(CC) $(INCLUDES) -c $$< -o [email protected] 
endef 

all: 
    $(foreach sdir,$(SRC_DIR),$(eval $(call make-goal,$(sdir)))) 

,它只是停止,並顯示:

makefile:37: *** prerequisites cannot be defined in command scripts. Stop. 

37行是:

$(foreach sdir,$(SRC_DIR),$(eval $(call make-goal,$(sdir)))) 

我的makefile有什麼問題?

回答

1

您正在擴充make-goal內部命令。只是向外移動的這樣一個現實:定義一個配方,然後使用foreach-eval-call是矯枉過正在這種情況下

all: $(OBJ) 

$(foreach sdir,$(SRC_DIR),$(eval $(call make-goal,$(sdir)))) 

注意。圖案規則將做:

all: $(OBJ) 

%.o: %.c 
    $(CC) $(INCLUDES) -c $< -o [email protected] 

編輯:

你甚至可以擺脫無圖案的規則,使用make的隱含規則編譯C文件:

CFLAGS += $(INCLUDES) 

all: $(OBJ) 
+0

非常感謝你幫助,我忘了把'$(OBJ)'放在'target'後面,你能幫我解決另一個問題嗎? http://stackoverflow.com/questions/21305590/patsubst-did-not-translate-c-to-o –