본문 바로가기

VEDA 복습

VEDA 31일차 - Makefile

반응형

 

samba : 표준 윈도우와 상호 작동하는 리눅스, 유닉스용 프로그램 - SMB/CIFS 프로토콜을 사용하는 클라이언트들이 파일 및 인쇄 서비스를 이용할 수 있는 프로그램(서로 다른 파일 시스템을 사용하는 기기 간에 중계 역할) 

 

sudo apt-get install samba

 

아직 리눅스 환경에 익숙하지 않은 사람들을 위해서 사용

이번 주 목표!! : 리눅스 환경에 익숙해지기 - 리눅스 구조, 명령어, vi, make, cmake, gdb 정도는 알아두기!!

 

1. make - 자동화 도구 

 

helloworld:
        @echo HelloWorld!
hello:
        @echo hello
world:
        @echo world

 

결과

 

hello가 up to date라고 나오는 이유는 이미 hello 파일이 존재하기 때문이다.

 

make 명령어가 호출된 경우 다음과 같은 순서대로 make 파일을 찾는다.

1. GNUmakefile

2. makefile

3. Makefile

4. mymakefile : 이 경우 make -f mymakefile 사용(-f : 강제 지정 옵션)

 

-p : make 가 관리하는 내부 database를 보여준다.

-d : makefile 을 처리하는 과정을 보여준다.

 

 

Makefiel의 구조

<target>: <prerequisites>
	<recipe>

target을 만들기 위해서 필요한 것들이 무엇인지, 조건이 만족하면 어떤 동작을 수행하는지 정의(타겟 존재 확인 -> 조건 확인 -> 수행), 만약 파일이 수정된 경우 삭제하고 다시 만드는 작업이 필요하다. 그렇지 않으면 기존의 파일이 존재해서 작업을 생략한다.

디폴트 타겟 : 제일 상단에 있는 타겟, 별도의 지정이 없으면 디폴트 타겟에 대한 동작을 수행한다.

 

gcc 옵션 - 더 자세한 내용은 공식 document를 활용하는 것이 좋다.

옵션 의미
-E 전처리를 실행하고 컴파일을 중단하게 한다.
-c 소스 파일을 컴파일만 하고 링크를 수행하지 않으며, 오브젝트 파일을 생성한다.
-o 바이너리 형식의 출력 파일 이름을 지정하는데, 지정하지 않으면 a.out라는 기본 이름이 적용된다.
-I 헤더 파일을 검색하는 디렉토리 목록을 추가한다.
-L 라이브러리 파일을 검색하는 디렉토리 목록을 추가한다.
-l 라이브러리 파일을 컴파일 시 링크한다. 주로 configuration과 관련된 내용을 반영할 때 사용한다.
-g 바이너리 파일에 표준 디버깅 정보를 포함시킨다.
-ggdb 바이너리 파일에 GNU 디버거인 gdb만이 이해할 수 있는 많은 디버깅 정보를 포함시킨다.
-O 컴파일 코드를 최적화시킨다.
-ON 최적화 N 단계를 지정한다.
-DFOO=RAR 명령라인에서 BAR의 값을 가지는 FOO라는 선행 처리기 매크로를 정의한다.
-static 정적 라이브러리에 링크한다.
-ansi 표준과 충돌하는 GNU 확장안을 취소하며, ANSI/ISO C 표준을 지원한다. 이 옵션은 ANSI 호환 코드를 보장하지 않는다.
-traditional 과서 스타일의 함수 정의 형식과 같이 전통적인 K&R(Kernighan and Ritchie) C 언어 형식을 지원한다.
-MM make 호환의 의존성 목록을 출력한다.
-V 컴파일의 각 단계에서 사용되는 명령어를 보여준다.

출처 : https://seamless.tistory.com/2

 

gcc로 컴파일 하는 방법

1. gcc 동작 과정 gcc 란? 원래는 GNU C Compiler를 의미 했지만 1999년부터 GNU Compiler Collection을 의미한다. gcc가 실행시키는 프로그램 전처리기 : cpp 컴파일러 : cc1 어셈블러 : as 링커 : ld 단계별 처리 방

seamless.tistory.com

 

.PHONY : 일반적으로 makefile은 상위 타겟부터 하위 타겟까지 재귀적으로 실행된다. 별도로 특정 명령어만을 사용하고 싶을 때 사용할 수 있다.

.PHONY: clean
clean:
	rm -f $(OBJS) main

 

패턴 사용하기

  • $@ : 타겟 이름
  • $< : 의존 파일 목록에 첫 번째 파일
  • $^ : 의존 파일 목록 전체
  • $? : 타겟 보다 최신인 의존 파일들
  • $+ : $^ 와 비슷하지만, 중복된 파일 이름들 까지 모두 포함

자동으로 prerequisite 만들기

-MD : 목적 파일 외에도 컴파일 한 소스 파일을 타겟으로 하는 의존 파일 목록을 담은 파일을 생성

Makefile에서 include 옵션을 사용하여 의존 파일 목록을 추가할 수 있다.

일일이 추가하는 것이 불가능하므로 다음과 같이 한다.

CC = g++
CXXFLAGS = -Wall -O2
OBJS = foo.o bar.o main.o

%.o: %.cc
	$(CC) $(CXXFLAGS) -c $<

main : $(OBJS)
	$(CC) $(CXXFLAGS) $(OBJS) -o main

.PHONY: clean
clean:
	rm -f $(OBJS) main

-include $(OBJS:.o=.d) #OBJS에서 .o로 끝나는 부분을 .d로 대체해라

https://modoocode.com/311

 

씹어먹는 C++ - <19 - 1. Make 사용 가이드 (Makefile 만들기)>

모두의 코드 씹어먹는 C++ - <19 - 1. Make 사용 가이드 (Makefile 만들기)> 작성일 : 2020-06-10 이 글은 94471 번 읽혔습니다. 에 대해서 다루어 보겠습니다. 안녕하세요. 이번 강좌 부터는 씹어먹는 C++ 시리

modoocode.com

출처 - **make에 대한 간단한 사용법을 익히기 좋다!

 

$(MAKE) -C subdir : 자식 makefile을 호출하는 방법

export .EXPORT_ALL_VARIABLES : 자식 makefile에게 변수를 물려 줄 수 있다.

shell variable : ?=(overiding x), =(overiding o), :=(overiding o), handover x

env variable : ?=(overiding x), =(overiding x), :=(overiding x), handover o, .EXPORT_ALL_VARIABLES

cmd variable : ?=(overiding x), =(overiding x), :=(overiding x), handover x(내용 자체는 괜찮으나 추가되는 것은 안됨)

 

1. file target : 실행의 결과가 파일인 것

2. dummy target : 실행의 결과가 파일이 아닌 것

3. phony target : 타겟이 있어도 실행된다.(더미 타겟처럼), all, clean etc(의미를 부여한 것, 우연히 명령어가 실행되지 않는 상황을 방지)

4. secondary target : 이차적 고려 대상의 중간 타겟, 빌드 중 중간 파일로 취급되어 삭제되거나 삭제 되지 않아도 빌드에 영향을 주지 않는다. 자식 프로세스로의 전달이 이루어지지 않는다.

 

suffix rule : 미리 특정 형태의 파일을 어떻게 처리할지 레시피를 정해놓음

 hello: hello.c
 
 .c: #생략 가능
 	@echo compile $< to $@
 hello: hello.o
 .c.o:
 	@echo compile $< to $@

 

 

wildcard와 substitution

항목 Wildcard Substitution
목적 파일 목록 수집 파일 이름 변환 및 조작
주요 키워드 $(wildcard 패턴) $(VAR:old=new), $(patsubst ...), $(subst ...)
특징 디렉터리 내 파일 자동 탐색 기존 파일 목록에서 이름을 대체 및 변형
주의사항 파일 시스템 상태에 의존 패턴 설계 주의 필요

 

explicit rule : makefile 안에 명시

implicit rule : makefile에서 명시되지 않은 rule -> 알아서 함

 

pattern rule : 최신버전

필요성 비슷한 형태의 규칙을 효율적으로 적용하기 위해 사용
문법 %를 사용하여 임의 문자열 매칭
장점 Makefile의 간결성, 유지보수성, 확장성 향상
자동 변수 $@, $<, $^ 등 활용 가능
주의 사항 올바른 디렉터리 경로와 파일 이름 관리 필요

 

예시

build/%.o : src/%.c
    gcc -c $< -o $@
반응형