* 이 글은 Redis 7.0.8 기준으로 작성되었습니다.
CentOS에서 Redis를 설치하던 중에 Redis Compile 과정에서 make
와 make install
의 두 가지의 방법이 어떻게 다른 지 궁금하였다.
* 이미지 출처 Redis 설치 공식문서
* 이미지 출처: KHU 리눅스시스템프로그래밍 강의
make
를 이용하여 효율적으로 컴파일을 관리할 수 있음$ make [-f makefile] [options] [targets] [macro definitions]
-d
: debug mode-e
: enviroment variables override assignments within makefiles-i
: ignore error codes-s
: silent mode-t
: touch target filesMakefile의 구성요소
target: [prerequisites] [; command]
tab [@] command
name = string
include file-name
#
Internal macros
$@
: 현재 target의 이름$<
: 현재 prerequisite의 이름$^
: 현재 모든 prerequisite의 목록$?
: target 보다 더 최근에 갱신된 prerequisite 목록$*
: suffix를 제외한 현재 prerequisite의 이름$%
: 대응되는 .o
파일의 이름이제 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)
make
를 사용하면 Makefile에 정의된 default인 all 부분이 실행된다.make install
을 사용하면 Makefile의 install 부분이 실행된다.make install PREFIX=원하는경로
를 사용하면 설정한 PREFIX 값을 사용하여 Makefile의 install 부분이 실행된다.make
는 소스 파일들을 컴파일하여 redis-server, redis-cli 등의 프로그램을 빌드한다.make install
은 make
를 통해 만들어진 설치파일(setup)을 알맞은 위치에 설치한다.ln -sf
)한다.redis-7.0.8/src/Makefile
의 첫 줄을 보면 PREFIX 변수 설정에 ?=
를 사용한 것을 볼 수 있다.?=
는 조건 변수 할당 연산자로 변수가 아직 정의되지 않은 경우에만 효력을 가진다.make install
만 해준다면 /usr/local/bin
의 경로에 install 된다.make install PREFIX=원하는경로
명령어를 사용하여 PREFIX를 지정해주면 $(PREFIX)/bin
의 경로에 install 된다.