2013-06-26 2 views
0

У меня есть следующие два Makefiles:Makefile: Ошибка марки

Makefile1:

SUBDIRS = src 
SDIRS=src 
TOP?=.. 
RECURSIVE_MAKE= [ -n "$(SDIRS)" ] && for i in $(SDIRS) ; do \ 
      (cd $$i && echo "making $$target in $(DIR)/$$i..." && \ 
      $(MAKE) -e TOP=$(TOP)/.. $$target INCLUDES='$(INCLUDES)') || exit 1; \ 
     done; 

subdirs: 
    @target=all; $(RECURSIVE_MAKE) 

all: subdirs 

include $(BUILD_TOP)/build_control/symstream/subdirs.mk 

Makefile2 (subdirs.mk):

# This is a stand-alone file to distribute targets to 
# sub-directories. Include this file alone. 

# Make bug: It loses track of if/endif over a $(eval) call. 
ifndef __subdirs_include 
__subdirs_include = yes 

# This only works for the standard targets defined in $(TARGETS) 
# in utils.mk. However this list can be extended with +=. 

install:: install-hdrs 

include $(BUILD_TOP)/build_control/symstream/utils.mk 
include $(BUILD_TOP)/build_control/symstream/platform.mk 

# This creates a recursion rule for each pair of target and subdirectory. 
# The target for doing T in directory D is named T+D. 
# If there is a "$(D_needs) = subdirs" then the subdirs become prerequisites 
# of D. 
define __target_subdir 
.PHONY:: $(1)+$(2) 
$(1)+$(2) :: $(3); +$(MAKE) -C $(2) $(1) 
endef 

$(foreach t,$(TARGETS),\ 
    $(foreach d,$(strip $(SUBDIRS) $(SUBDIRS_y)),\ 
    $(eval $(call __target_subdir,$(t),$(d),$(patsubst %,$(t)+%,$($(d)_needs)))))) 

$(foreach t,$(TARGETS),\ 
    $(foreach d,$(strip $(SUBDIRS) $(SUBDIRS_y)),$(eval $(t)::$(t)+$(d)))) 


endif # __subdirs_include 

Я получаю следующее сообщение об ошибке при Makefile1 Выполняется:

subdirs.mk:30: *** target file `all' has both : and :: entries. Stop. 

Может ли кто-то помочь в этом?

+0

Можете ли вы разместить сообщение 'subdirs.mk'? –

ответ

0

Вы должны отправить сообщение subdirs.mk, чтобы убедиться, что у вас есть обычные и двухстоечные правила для цели all.

От GNU make manual:

Когда цель появляется в нескольких правилах, все правила должны быть же типа: все обычные, или все с двойным двоеточием.

+0

Makefile2 является subdir.mk – Sunny