[Linux/Redis] make란? 바이너리 설치 시 make와 make install의 차이

hwwwa·2023년 2월 8일
2

* 이 글은 Redis 7.0.8 기준으로 작성되었습니다.

CentOS에서 Redis를 설치하던 중에 Redis Compile 과정에서 makemake install의 두 가지의 방법이 어떻게 다른 지 궁금하였다.

* 이미지 출처 Redis 설치 공식문서

make란?

* 이미지 출처: KHU 리눅스시스템프로그래밍 강의

  • 소프트웨어 개발을 위해 유닉스, 리눅스 계열 운영체제에서 사용되는 프로그램 빌드 도구
  • 여러 파일끼리의 의존성과 각 파일에 필요한 명령을 정의함으로써 프로그램 컴파일 가능
  • 정의된 Makefile의 내용을 해석하여 프로그램 빌드를 수행하게 됨
  • make를 이용하여 효율적으로 컴파일을 관리할 수 있음
    • 소스의 일부가 변경된 경우에는 변경된 부분만 다시 컴파일하고 링크하여 컴파일 시간 단축 가능
    • 모듈별로 관리 가능

make command

  • Usage
    $ make [-f makefile] [options] [targets] [macro definitions]
    • 주로 target 정도만 사용함
  • Options
    • -d : debug mode
    • -e : enviroment variables override assignments within makefiles
    • -i : ignore error codes
    • -s : silent mode
    • -t : touch target files

Makefile

  • Makefile의 구성요소

    • dependency line
      • target: [prerequisites] [; command]
    • command line
      • tab [@] command
      • @는 화면에 command를 출력하고싶지 않을 때 사용
    • macro definition
      • name = string
    • include statement
      • include file-name
    • comment
      • #
  • Internal macros

    • $@ : 현재 target의 이름
    • $< : 현재 prerequisite의 이름
    • $^ : 현재 모든 prerequisite의 목록
    • $? : target 보다 더 최근에 갱신된 prerequisite 목록
    • $* : suffix를 제외한 현재 prerequisite의 이름
    • $% : 대응되는 .o 파일의 이름

Redis Makefile 살펴보기

이제 Redis를 컴파일할 때 사용하는 make 명령어와 Makefile에 대해 알아보자.


Redis 설치 과정에서 사용하는 make 명령어로는 아래의 3가지 경우가 있다고 볼 수 있다.

make
make install
make install PREFIX=/usr/local/redis

Redis 폴더를 살펴보면 폴더 바로 하위에 Makefile 하나와 src 폴더 하위에 존재하는 Makefile 하나로 총 2개의 Makefile을 볼 수 있다.
아래의 내용은 Redis의 Makefile 중에서도 설명에 필요한 부분만을 발췌해온 것이다.

redis/Makefile

# Top level makefile, the real shit is at src/Makefile

default: all

.DEFAULT:
        cd src && $(MAKE) $@

install:
        cd src && $(MAKE) $@

.PHONY: install

redis/src/Makefile

PREFIX?=/usr/local
INSTALL_BIN=$(PREFIX)/bin
INSTALL=install
PKG_CONFIG?=pkg-config

all: $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_RDB_NAME) $(REDIS_CHECK_AOF_NAME)
	@echo ""
	@echo "Hint: It's a good idea to run 'make test' ;)"
	@echo ""

install: all
	@mkdir -p $(INSTALL_BIN)
	$(call MAKE_INSTALL,$(REDIS_SERVER_NAME),$(INSTALL_BIN))
	$(call MAKE_INSTALL,$(REDIS_BENCHMARK_NAME),$(INSTALL_BIN))
	$(call MAKE_INSTALL,$(REDIS_CLI_NAME),$(INSTALL_BIN))
	@ln -sf $(REDIS_SERVER_NAME) $(INSTALL_BIN)/$(REDIS_CHECK_RDB_NAME)
	@ln -sf $(REDIS_SERVER_NAME) $(INSTALL_BIN)/$(REDIS_CHECK_AOF_NAME)
	@ln -sf $(REDIS_SERVER_NAME) $(INSTALL_BIN)/$(REDIS_SENTINEL_NAME)
  • Redis 컴파일 시 사용하는 make 명령어와 Makefile을 함께 살펴보면 아래의 내용을 알 수 있다.
    • make 를 사용하면 Makefile에 정의된 default인 all 부분이 실행된다.
    • make install 을 사용하면 Makefile의 install 부분이 실행된다.
    • make install PREFIX=원하는경로를 사용하면 설정한 PREFIX 값을 사용하여 Makefile의 install 부분이 실행된다.

make와 make install의 차이?

  • make는 소스 파일들을 컴파일하여 redis-server, redis-cli 등의 프로그램을 빌드한다.
  • make installmake를 통해 만들어진 설치파일(setup)을 알맞은 위치에 설치한다.
    • Makefile의 내용을 보면 알 수 있듯이, 빌드된 프로그램을 실행할 수 있게 지정한 위치에 프로그램에 대한 심볼릭 링크파일을 생성(ln -sf)한다.
  • redis-7.0.8/src/Makefile의 첫 줄을 보면 PREFIX 변수 설정에 ?=를 사용한 것을 볼 수 있다.
    • ?= 는 조건 변수 할당 연산자로 변수가 아직 정의되지 않은 경우에만 효력을 가진다.
    • PREFIX를 지정하지 않고 make install만 해준다면 /usr/local/bin의 경로에 install 된다.
    • make install PREFIX=원하는경로 명령어를 사용하여 PREFIX를 지정해주면 $(PREFIX)/bin의 경로에 install 된다.

0개의 댓글