비 재귀 Makefile을 사용하여 간단한 프로젝트를 수행하기 위해 몇 가지 예제를 검색하여 시도해 보았습니다. 과거에는, 나는 간단한 단일 디렉토리 코드베이스를 사용했지만 지금은 라이브러리 코드와별도의 디렉토리에 객체 파일이있는 단순한 비 재귀 Makefile
+--app
| +-- obj/
| +-- Makefile
| +-- first.c
| +-- second.c
|
+--lib1
| +-- obj/
| +-- Makefile
| +-- foo.c
| +-- bar.c
|
+--lib2
| +-- obj/
| +-- Makefile
| +-- sample.c
아무것도 (세 번째 나중에 아마) fancy- 두 디렉토리 :-) 이상의 엔지니어를 위해 함께 환경을 걸었습니다 모든 응용 프로그램은 "app"디렉토리에 있습니다. .o 및 .d 파일을 별도의 obj/디렉토리에 보관하여 청결을 유지하려고합니다.
- 라이브러리를 확인하기 위해 lib1 및 lib2와 같은 각 하위 디렉토리에서 "make"를 수행하고 싶습니다. libabc.a와 libxyz.a가 각각 생성됩니다.
- 간단한 Makefile을 작성했지만 규칙이 작동하지 않아 GNU make 매뉴얼을 이해하려고했지만 길을 잃어 가고 있습니다.
LIB1/메이크 :
lib_src = foo.c bar.c
lib_obj = $(patsubst %.c,obj/%.o,$(lib_src))
libabc.a: $(lib_obj)
@echo [Archive... $(@F)]
@$(AR) -cr libabc.a $^
obj/%.c : %.c
$(CC) $(CFLAGS) -c -o [email protected] $<
응용 프로그램/메이크 :
ALL_APP = first second
% : %.c libabc.a libxyz.a
$(CC) $(CLFAGS) $^ -o [email protected]
include ../lib1/Makefile
include ../lib2/Makefile
지금, 나는이 문제가 각 메이크 (명백하게)에서 동일한 대상을 정의 할 수 있습니다. 마찬가지로 lib1이 포함되어 있기 때문에 나는 lib1/Makefile과 app/Makefile을 깨끗하게 정의 할 수 없다. 혼자서 lib1을 깨끗하게 만들 수 있기를 바랬지 만 의미가 있습니다.
이제 "app"에서 make를 할 때 obj/foo.o를 만들 규칙이 없습니다. 경로가 모두 가짜이기 때문에 나는 추측한다. "obj /"는 lib1/obj /를 가리 킵니다.하지만 Makefile이 포함되면 그 모든 것이 손실됩니다.
내가 뭘 잘못하고 위의 것처럼 정말 간단한 Makefile을 사용하여 프로젝트를 만들 수 있습니까? 온라인을 사용하는 대부분의 예는 더 많은 것을 성취하려고 시도하기 때문에 상당히 복잡합니다 (저는 믿습니다).
미리 감사드립니다. (여러 번 토론 된 주제에 대해 사과드립니다.) 나는 그것을 피할 수 있다면 오히려 automake와 cmake를 지금 배우지 않을 것입니다. 내 프로젝트가 이러한 강력한 도구의 사용을 보증 할만큼 간단하지 않기를 바라고 있습니다.
안부,
당신의 app 메이크 파일에 라이브러리 메이크 파일을 포함시키는 것이 올바른 해결책이라고 생각하지 않습니다. 여기에 내가 할 일은 다음과 같다. 각 디렉토리에 대해 완전히 작동하는 독립형 makefile을 작성한다. 그런 다음 앱에 대해 각 라이브러리에 대해 make를 호출하고 마지막으로 앱에 make를 호출하는 간단한 빌드 스크립트를 작성합니다. 빌드 스크립트에서 빌드 된 라이브러리를 앱 디렉토리에 복사하도록 할 수도 있습니다. –
@BrandonYates 더 재귀 적으로 만들지 만 다시 한 번 제거하면 재귀 적 건물을 만들지 않기 때문에 제거됩니다. –
Brandon에게 감사드립니다. 나는 make를 만드는 것이 좋은 생각이 아니므로 Makefile을 include하는 것이 더 나은 방법이라고 생각한다. Peter Miller는 이유를 설명하는 논문을 썼습니다. 의존성은 각 Makefile을 독립적으로 호출하는 것이 관리하기가 더 어렵습니다. – guraaf