Make 및 MakeFiles. 저게 뭐야?
메이크파일.
makefile은 프로그램을 빌드하기 위한 레시피가 포함된 텍스트 파일(선언적 구성 파일 그룹)입니다. 일반적으로 소스와 동일한 디렉토리에 있으며 일반적으로 Makefile 이라고 합니다. 이러한 각 명령은 makefile에서 별도의 규칙이어야 합니다.
많은 사람들이 인기 있는 저장소에서 이 파일을 보았지만 기억하지 못할 수도 있습니다.
리눅스
make 명령 자체를 실행하면 현재 디렉토리에서 Makefile 또는 makefile이라는 makefile 스크립트가 실행됩니다.
mkdir newDirectory
touch/ vi Makefile
target: dependencies
commands
예시:
say_something:
echo "Software Portability and Optimization is cool"
복잡한 종속성( 소스 )
보다 복잡한 빌드에는 많은 대상과 종속성이 포함됩니다. 예를 들어 C 프로그램은 개체 파일(.o 확장자)이라는 중간 파일로 컴파일할 수 있으며, 그런 다음 이를 결합하여 실행 파일을 생성할 수 있습니다.
이 시나리오를 상상해보십시오.
다음 세 가지 개체 파일이 있습니다.
double.c, number.h 및 sauce.h를 컴파일하여 다음을 만듭니다. double.o
half.c, number.h 및 sauce.h를 컴파일하여 다음을 만듭니다. half.o
sauce.c는 다음을 만들기 위해 컴파일됩니다.
다음과 같은 두 가지 바이너리 대상이 있습니다.
double.o 및 sauce.o는 생성에 연결될 수 있습니다.
half.o 및 sauce.o는 생성에 연결될 수 있습니다.
이러한 관계에 대한 Makefile은 다음과 같이 작성할 수 있습니다.
CC=cc
CFLAGS=-O3
all: half double
half: half.o sauce.o
${CC} ${CFLAGS} -o half half.o sauce.o
double: double.o sauce.o
${CC} ${CFLAGS} -o double double.o sauce.o
half.o: half.c number.h
${CC} ${CFLAGS} -c half.c
double.o: double.c number.h
${CC} ${CFLAGS} -c double.c
sauce.o: sauce.c
${CC} ${CFLAGS} -c sauce.c
이 Makefile에 대해 주목할 가치가 있는 몇 가지 사항이 있습니다.
Variables are used for the name of the compiler and the compiler flags. This makes it very easy to change these values -- to use the gcc compiler, for example, the CC variable could simply be changed to gcc. If variables were not used, you would have to change every line that invoked the compiler.
all is a dummy target. Since it appears as the first target in the file, it is executed by default if no target is specified as an argument to the make command. It depends on the half and double files, which will be built in order to satisfy the dependency. However, the all target does not specify any commands, and the file all will never be built.
make가 처음 실행될 때 5개의 컴파일이 수행됩니다.
$ make
cc -O3 -c half.c
cc -O3 -c sauce.c
cc -O3 -o half half.o sauce.o
cc -O3 -c double.c
cc -O3 -o double double.o sauce.
명령은 파일에 나타나는 순서대로 실행되는 것이 아니라 종속성에 따라 순서가 지정됩니다.
두 번째로 실행하면 컴파일이 수행되지 않습니다.
$ make
make: Nothing to be done for 'all'.
파일 half.c가 편집되었거나 마지막으로 수정된 타임스탬프(mtime)가 업데이트된 경우 make를 실행하면 두 개의 컴파일이 실행됩니다.
$ touch half.c
$ make
cc -O3 -c half.c
cc -O3 -o half half.o sauce.o
이것은 make의 힘을 보여줍니다. 지정된 대상을 빌드하기 위해 절대적인 최소 작업을 수행합니다.
대규모 프로그래밍 프로젝트에서 바이너리는 수백 또는 수천 개의 소스 파일로 구성될 수 있으며 이러한 모든 파일을 컴파일하는 데 몇 시간이 걸릴 수 있습니다. 소프트웨어 개발자가 하나의 파일만 편집하는 경우 모든 것을 다시 빌드하는 것은 시간 낭비이므로 make는 많은 시간을 절약할 수 있습니다. 특히 소프트웨어를 수천 번 다시 빌드할 때 그렇습니다.
가짜 표적
Makefile에 "가짜"대상을 포함하는 것은 드문 일이 아닙니다. 빌드되지는 않지만 유용한 작업을 수행하는 대상입니다. 예를 들어 "all"의 대상은 "all"이라는 실제 파일을 생성하지 않습니다. 일반적인 가짜 대상은 다음과 같습니다.
all: build all binaries
docs: builts all documentation (e.g., generates PDFs, HTML, manpages, etc)
install: install all files, building binaries, documentation, etc if required
clean: erases all built intermediate and binary files
dist-clean (or distclean): erases all files not included in the original distribution of the source
check (or test): tests the software
make 명령은 명령 파이프라인이 실패하는 즉시 종료되므로 치명적이지 않은 가짜 대상은 일반적으로 성공 코드를 반환해야 합니다. 예를 들어 "깨끗한"대상의 일부로 존재할 수도 있고 존재하지 않을 수도 있는 파일을 삭제하려면 다음과 같은 코드를 사용할 수 있습니다.
rm *.o || true
결론
⚠️ 컴퓨터 아키텍처 블로그 게시물: 링크
연결
🖇 팔로우GitHub
🖇 팔로우
_p.s 이 게시물은 내 소프트웨어 이식성 및 최적화 수업을 위해 작성되었습니다.
Reference
이 문제에 관하여(Make 및 MakeFiles. 저게 뭐야?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/serputov/make-and-makefiles-whats-that-2np5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)