라벨이 target인 게시물 표시

configure 의 --build, --host, --target 뜻

configure 의 --build, --host, --target 은 크로스 컴파일을 할 때 쓰인다. 크로스 컴파일이란 컴파일하고 있는 OS/기계와 컴파일 후 만들어진 바이너리가 실행하는 OS/기계가 다른 경우를 말한다. build, host, target 의 관계에 따라 몇 가지 용어가 있지만, 여기서는 그냥 넘어가자. 크로스 컴파일 자체에 대한 설명이 목적은 아니니까... 그래도 알고 싶은 사람은 여기를 보자. https://gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html 그럼 이제, --build, --host, --target 의 뜻을 살펴보자. --build : 컴파일하고 있는 OS/기계 --host : 컴파일해서 만들어진 바이너리가 실행되는 OS/기계 --target: 컴파일해서 만들어진 바이너리가 만들어내는 바이너리가 실행되는 OS/기계 --build 와 --host 는 금방 알 수 있을 것이라 생각한다. 하지만 --target 의 경우에는 다소 헛갈린다. 실제로도 --target 의 경우는 거의 쓰이지 않는다. 대체로 gcc 같은 툴체인을 컴파일할 때 주로 쓰인다. 몇 가지를 예를 들어보자. 윈도에서 많이 사용되는 GNU 툴체인인 mingw 의 경우, 리눅스용 크로스 컴파일러를 제공한다. 이를 이용하면 리눅스에서 윈도용 바이너리를 만들어낼 수 있다. 이 때 사용하는 configure 옵션의 예는 다음과 같다. configure --host=i686-w64-mingw32  i686-w64-mingw32 는 host triplet(CPU-VENDOR-OS) 으로 32 비트용 윈도용 프로그램(i686)을 mingw-w64(w64) 툴체인으로 만든다는 뜻이다. 만약, 윈도에서 실행되지만, ARM 용 바이너리를 만들어내는 바이너리를 인텔용 32비트 리눅스에서 만들고자 한다면, configure 옵션은 이런 모습이 될 것이다. configure --build=i...

GNU Make 와 gcc 를 이용한 멀티 타겟 Makefile 만들기

예전에 GNU Make 와 gcc 를 이용한 auto-dependency Makefile 만들기 를 썼었는데, 이것은 단지 하나의 타겟만을 만들 수 있었다. 이번에는 이 부분을 개선해서 멀티 타겟 Makefile 을 만들어보자. 멀티 타겟을 지원하기 위해서는 GNU Make 의 몇 가지 함수를 먼저 살펴볼 필요가 있다. foreach 함수 foreach 함수의 문법은 다음과 같다. $(foreach var,list,text) 기능은 list 의 내용을 빈 칸을 기준으로 구분해서 var 에 각각 대입하고, 매번 text 를 확장한다. 예를 들면, l := $(foreach d,a b c d,l $(d)) 이 경우, l 은 l a l b l c l d 가 된다. call 함수 call 함수의 문법은 다음과 같다. $(call var,param,param,...) call 함수는 var 를 일종의 함수처럼 처리한다. var 뒤의 param 들은 var 의 $(1), $(2), ... 로 대체된다. 예를 들면, merge = $(1)/$(2) path := $(call merge,a,b) 이 경우 path 는 a/b 가 된다. define 지시자 define 지시자와 endef 를 통해 멀티 라인 변수를 만들 수 있다. 다음과 같이 쓰인다. define m echo foo echo $(boo) endef 만일 call 함수와 함께 쓰인다면 보통의 함수와 같은 역할을 할 수 있다. eval 함수 eval 함수의 문법은 다음과 같다. $(eval text) eval 함수는 text 의 내용을 Make 파일의 일부로 해석하게 만든다. 예를 들면, .PHONY: all define a all:     echo hello endef $(eval $(a)) 이것은 다음처럼 처리된다. .PHONY: all all: ...