diff --git a/0807/Makefile b/0807/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..5acb5bf168c95a4098e7bfbf2fe3797be200c11f --- /dev/null +++ b/0807/Makefile @@ -0,0 +1,14 @@ +CC=gcc +OBJS=main.o func.o + +test: $(OBJS) + $(CC) -o $@ $^ + +main.o: main.c + $(CC) -c $^ + +func.o: func.c + $(CC) $(CFLAGS) -c $^ + +clean: + rm $(OBJS) test diff --git a/0807/README.md b/0807/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4249e608dbb6c2fff1d07d7af4a4f71ba33e0dff --- /dev/null +++ b/0807/README.md @@ -0,0 +1,79 @@ +# Make + +### make란? + +* 프로그램 그룹 중에서 어느 부분이 새롭게 컴파일 되어야 하는지를 자동적으로 판단해서 필 +요한 커맨드를 사용해서 그들을 재 컴파일 시킴 +* 많은 프로그램 모듈들로 구성된 대규모 프로그램을 효율적으로 유지하고, 일관성 있게 관리 +하도록 도와주는 도구 +* 소스 수정 시 유관 파일들을 재컴파일 & 링크하는 반복적인 작업을 간단하게 처리함 +* 선결조건(prerequisites)으로부터 대상(target)을 만들어 내는 다목적 프로그램 + +### make의 동작 + +* make는 여러 파일들 간의 의존성을 저장하고 수정된 파일에 연관된 소스 파일들만을 재 +컴파일 하도록 해줌 +* 수정한 소스 파일들만 자동적으로 재 컴파일하고 링크하도록 함 +* 소스 수정 시 유관 파일들을 재컴파일 & 링크하는 반복적인 작업을 간단하게 처리함 +* make 유틸리티는 이전에 make 명령을 실행했던 시점 이후에 이뤄진 프로젝트 작업들에 +대해서만 갱신 작업을 수행함 + +### make의 필요성 + +* 프로그램 개발 및 유지보수의 편리성을 지원 +* 명령어의 배치 처리 가능, 자주 쓰는 명령어를 자동화할 수 있음 +* 입력파일 변경 시 자동적으로 결과 파일이 바뀌기를 원할 때 + +# Makefile + +`대상(target) : 의존하는 파일들(prerequisites)` +`<tab> 명령어(command)` +`<tab> 명령어(command)` + +* clean +주로 make하는 과정에서 생긴 .o 파일이나 실행 파일을 삭제하는 역할 + +* dep +gccmakedep 명령어를 통해 의존 관계를 자동으로 생성한다. + +`<identifier> = <files>` +identifier를 통해 여러 개의 파일들을 간단하게 부를 수 있는 매크로 +코드 상에서 쓸 때는 `$(<identifier>)`로 써야 한다. + +* 내장매크로(Internal macro) + +| 매크로 | 의미 | +|:--:|--| +| $@ | 현재의 목표 (Target) 파일명 | +| $? | 현재의 목표파일(Target)보다 더 최근에 갱신된 의존 파일 명단 | +| $* | 현재의 목표파일(Target)보다 더 최근에 갱신된 확장자를 제외한 의존 파일 명단 | +| $< | 의존 파일(전제 조건) 중 첫번째 파일명 | +| $^ | 현재 모든 의존 파일들의 명단 | +| $+ | '$^'과 같지만, 두 번 이상 나열된 전제 조건은 makefile에 나열된 순서대로 복제됨 | +| $% | 타깃이 라이브러리 모듈일 때 멤버에 대응되는 파일명 | + +* 내장매크로(Pre-defined macro) + +| 매크로 | 의미 | +|:--:|--| +| AR | Archive-maintaining program; default ‘ar’. | +| ARFLAGS | ar 명령어의 옵션 설정 | +| AS | Program for compiling assembly files; default ‘as’. | +| ASFLAGS | as 명령어의 옵션 설정 | +| CC | Program for compiling C programs; default ‘cc’. | +| CFLAGS | cc 명령어의 옵션 설정 | +| CXX | Program for compiling C++ programs; default ‘g++’. | +| CXXFLAGS | g++ 명령어의 옵션 설정 | +| LDFLAGS | ld 명령어의 옵션 설정 | + +* 확장자 규칙 (Suffix Rules) +확장자 규칙은 미리 정의해 놓은 일반화한 기술 파일 항목을 가리킴 + +``` +.SUFFIXES : .o .c .s + +.c.o : + $(CC) $(CFLAGS) -c $< +.s.o : + $(AS) $(ASFLAGS) -o $@ $< +``` \ No newline at end of file diff --git a/0807/func.c b/0807/func.c new file mode 100644 index 0000000000000000000000000000000000000000..55298186c3488cb55781145378edcd6459c6f414 --- /dev/null +++ b/0807/func.c @@ -0,0 +1,13 @@ +#include <stdio.h> +#include "func.h" + +int func_name_or_id() +{ +#ifdef PRINT_ID + printf("201920756\n"); + return 0; +#else + printf("Jangwon Lee\n"); + return 1; +#endif +} diff --git a/0807/func.h b/0807/func.h new file mode 100644 index 0000000000000000000000000000000000000000..0bba62a2481b2c2124b34fb32735a3b3341df9f8 --- /dev/null +++ b/0807/func.h @@ -0,0 +1,3 @@ +#pragma once + +extern int func_name_or_id(); diff --git a/0807/main.c b/0807/main.c new file mode 100644 index 0000000000000000000000000000000000000000..e354f7db5134af0c5cfdb3b2b01eef578f868592 --- /dev/null +++ b/0807/main.c @@ -0,0 +1,6 @@ +#include "func.h" + +int main() +{ + func_name_or_id(); +}