this 종이 인 경우 재귀 메이크 파일 질문이있을 때마다 내 검색 결과가 모두 엉망으로 보이는 경우 전체 프로젝트를 명령 행에서 단일 Makefile로 변환하려고합니다. 그러나, 나는 어떻게 근본적인 문제에 부딪쳐서 내가 어떻게 대처할 지 확신 할 수 없다. 모든 Makefile 모듈에 공통적이지만 동일하지 않은 변수를 정의하고 싶습니다. 이렇게하려면 내가 먼저 Makefile.var
파일을 만든 :범위가 지정된 변수를 사용하는 글로벌 Makefile
# ============================================================================
# Common aliases for local dirs
# ============================================================================
# Every make module must define WORKING_DIR :=
BIN = $(WORKING_DIR)/bin
OBJ = $(WORKING_DIR)/obj
SRC = $(WORKING_DIR)/src
DEP = $(WORKING_DIR)/obj
INC = $(WORKING_DIR)/include
INCLUDES = -I$(INC)
ALL_SRCS = $(wildcard $(SRC)/*.C)
ALL_INCS = $(wildcard $(INC)/*.h)
ALL_OBJS = $(subst $(SRC),$(OBJ),$(ALL_SRCS:%.C=%.o))
ALL_DEPS = $(subst $(SRC),$(DEP),$(ALL_SRCS:%.C=%.d))
이 먼저 마스터 파일에 포함 된 Makefile.var
파일에 있습니다. 그 후에, 후속 메이크 파일 모듈이 포함됩니다. 여기 내 주인은 Makefile
:
include MakeModules/Makefile.var
include MakeModules/Makefile.tools
clean: $(CLEAN_LIST)
all: $(MAKE_LIST)
마지막으로 다음은 모듈의 모습입니다. 쉽게 동일한 모듈을 두 번 복사하여 붙여 넣을 것이고 두 번째 인스턴스의 이름을 조정할 것입니다. 이 Makefile.tools
입니다 :
# ============================================================================
# queuing (QUE)
# ============================================================================
WORKING_DIR := $(TOP)/tools/queuing
QUE_TARGET := libqueue.so
-include $(DEP)/*.d
$(QUE_TARGET): $(ALL_OBJS)
$(CPP) $(CFLAGS) -shared -o [email protected] $(ALL_OBJS)
que-clean:
-rm -f $(OBJ)/*.o $(DEP)/*.d
CLEAN_LIST += que-clean
MAKE_LIST += $(QUE_TARGET)
# ============================================================================
# queuing2 (QUE2)
# ============================================================================
WORKING_DIR := $(TOP)/tools/queuing2
QUE2_TARGET := libqueue2.so
-include $(DEP)/*.d
$(QUE2_TARGET): $(ALL_OBJS)
$(CPP) $(CFLAGS) -shared -o [email protected] $(ALL_OBJS)
que2-clean:
-rm -f $(OBJ)/*.o $(DEP)/*.d
CLEAN_LIST += que2-clean
MAKE_LIST += $(QUE2_TARGET)
당신이 볼 수 있듯이이 Makefile.tools
이 WORKING_DIR
의 값에 따라 Makefile.var
에서 파생 변수를 사용합니다. 음, make
이하는 2 단계 읽기 때문에 실제로 작동하지 않습니다. WORKING_DIR
변수는 마지막으로 알려진 할당에만 적용되며 ALL_OBJS
은 위치에 관계없이 모든 규칙에 대해 동일한 값을 갖습니다. 이는 마지막으로 정의 된 모듈에만 실제로 올바른 규칙이 있음을 의미합니다.
새로운 접두어로 C/Ping을 반복하지 않고도 각 모듈에 공통된 BIN, OBJ, SRC, ...
변수에 대한 액세스 권한을 부여 할 수 있습니까? 즉, 변수 정의를 Makefile 섹션에 적용한 다음 이전 규칙을 유지하면서 나중에 변경할 수 있습니까? 이것이 가능하지 않다는 느낌이 들지만, 이것을 멋지게 마무리 할 멋진 트릭을 놓치면 정말 좋을 것입니다. 그렇지 않으면,이 전역 Makefile 일은 실제로 가능하지 않습니다 (이전에 재귀 적 make에 의해 범위가 지정된 WORKING_DIR
에서 파생 된 공통 변수 톤이 있습니다).
규칙 본문에서'$ ALL_OBJS'의 사용을 반복하지 마십시오. 대신에 "all prerequisites"'$ ^'에 대한 자동 변수를 사용하면 이러한 규칙이 예상대로 작동하기 시작할 것입니다. (이것은 또한 일반적인 "좋은 makefile"규칙입니다.)'OBJ' /'DEP'/etc에 대해 이것을 수정합니다. 규칙 본문에 사용되는 내용은 더 복잡합니다 (그러나 조금만). –
그건 좋은 지적이고, 지금은 그렇게하도록 변경했습니다. 문제를 약간 줄이지 만, 각 모듈 전에 모든 추가 사항을 정의 할 필요성을 여전히 변경하지 않습니다. 무엇이 어떤 객체에 의존 하는지를 알기 위해서는 소스를 찾아야한다. src 디렉토리라는 것을 발견해야한다. 이것은 작업 디렉토리가 필요함을 의미한다. 이들 각각은 서로 다른 접두사를 가진 각 모듈에 대한 새로운 변수입니다. – Suedocode