빌드: 고급 언어 프로그램을 배포 가능한 실행 파일로 변환하는 작업
우리는 C컴파일러에 어떤 옵션이 넘겨지는지 모른다거나, 오브젝트 파일에 어떤 수준의 설비가 남겨지는지 모른다며느 당신은 그 빌드 시스템에 대해 진정한 통제권을 가지고 있다고 할 수 없다!
언어 장벽
세 개의 주요한 메커니즘
인터프리트 언어, 컴파일 언어, 바이트 컴파일 언어
인터프리트 언어
특정한 빌드 국면을 거칠 필요가 없다
Perl, Python, JavaScript
장점은 개발 속도
프리컴파일: 소스파일을 실행하기 전에 빌드
JIT(Just-in-Time)컴파일: 함수 각각을 실행에 임박했을 때 컴파일하는 방법
스크립트 언어도 포함
컴파일 언어
개별적인 소스 파일 가각이 중간 오브젝트 파일로 컴파일되고, 그 다음에 오브젝트 파일들이 링크되어서 최종 실행 파일이 된다
C, C++
개별적인 재료들(소스 파일들)을 섞어서(컴파일해서) 최종적으로 함께 굽습니다(링크합니다)
애플리케이션의 실행을 원하는 타깃 플랫폼 각각에 대해서 컴파일을 다시 해야만 한다
바이트 컴파일 언어
인터프리트 언어와 컴파일 언의 중간에 위치
Java, C#
가상 기계가 이식되는 모든 플랫폼에서 실행될 수 있기 때문에 이식성을 얻을 수 있다
두꺼비집으로 산 만들기
고전적인 해결책은 make라는 재치 있는 이름의 명령행 프로그램
많은 툴들이 make 문벅의 간소화를 목표로 삼고 있다
컴파일 vs 빌드
컴파일: 구축 단계 중 하나
빌드: 전체 구축 공정을 묘사하는 언어
오브젝트 파일: 소스 코드 파일의 컴파일된 버전
오브젝트 파일이 실행 파일이 되기 위해서는 다른 오브젝트 파일과 링크가 되어야 한다
정적 라이브러리 vs 동적 라이브 러리
정적 라이브러리: 오브젝트 파일 처림 링크되는…
동적 라이브러리: 실행 중인 애플리케이션에 의해 동적으로 로드되는…
링커: 하나 이상의 오브젝트 파일을(그리고 때로는 라이브러리를) 결합해서 최종 실행 파일이나 부분적으로 라이브러리를 만들어 낸다
질문!!!! 컴파일 단계에서 링크가 포함되는 것이 아닌가? 뭔가 나눠져 있는 느낌!?
빌드를 빌드하기
소프트웨어는 기초적인 상태에서 시작되지는 않았겠지만, 빌드의 발판은 단순하게 시작해서 코드와 함께 자라나는 경향이 있다
큰 프로젝트에 있는 빌드 프로세스는 혼란스럽고 이해하기 어려운 경우가 종종 있어서 적절한 문서가 필요하다
엔진 소스도 비슷하다. 기본적인 빌드 방법으로 빌드 시에 잘 안되는 경우가 있어 소스만 가지고 있다고 다 빌드 할 수 없는 부분이 상당히 존재하는거 같다
빌드 시스템을 소스 트리의 일부로 간주하고, 소스 파일과 함께 관리하자. 서로 밀접하게 얽혀져 있다
좋은 빌드 시스템을 만드는 요소는?
간편성
모든 개발자가 반드시 빌드를 수행시킬 수 있어야 한다
너무 복잡하면 아무 실용성도 없다
균일성
프로젝트에 속하는 모든 프로그래머들은 반드시 똑같은 빌드 환경을 사용해야 한다
반복 가능성과 신뢰성
바람직한 빌드 시스템은 물리적으로 동일한 이진 파일을 반복 생성할 수 있다
3년 전의 소스 트리를 끄집어내서 올바르게 재빌드할 수 있어야만 한다
하나의 단위
훌륭한 빌드는 한 스텝으로 표현된다
에러에 대한 대처
빌드 시스템은 에러가 발생한 다음에도 계속되면 안 된다
빌드 시스템은 어느 한 빌드 단계가 실패하면, 불완전한 것을 모드 제거해야 한다
빌드는 소란스럽게 실행되면 안 된다
컴파일러 경고를 사용 가능으로 설정해 놓고 빌드 하자!
작동 메커니즘
타깃의 선택
Makefile에서는 타깃의 빌드 방법을 기술하는 룰을 정의 할 수 있다
하우스키핑
빌드의 모든 작업을 원상복구시키는 clean룰이 있어야 한다
의존성
이런 모든 의존성 정보에 대해 알고있는 것은 컴파일러이다
자동화된 빌드
지속적인 통합!
빌드 구성
PROJECT_ROOT 변수는 빌드 트리의 루트를 가리키기 위해서 정의하면 편하다
재귀적인 MAKE
한 디렉터리에 있는 makefile은 또 다른 make 명령을 내려서 하위 디렉터리에 있는 makefile을 호출할 수 있다
올바른 툴을 가지고 있으면 소프트웨어의 빌드가 쉬워지는 것은 분명하다
툴의 사용법을 제대로 아는 것도 중요하다
'프로그래밍 > Code Craft' 카테고리의 다른 글
[2부 코드의 비밀스러운 일생] Chapter12 불안전 콤플렉스 (0) | 2017.11.15 |
---|---|
[2부 코드의 비밀스러운 일생] Chapter11 속도의 필요성 (0) | 2017.11.14 |
[2부 코드의 비밀스러운 일생] Chapter9 결함 찾기 (0) | 2017.11.10 |
[2부 코드의 비밀스러운 일생] Chapter8 시험 보는 시간 (0) | 2017.10.29 |
[2부 코드의 비밀스러운 일생] Chapter7 프로그래머의 도구 상자 (0) | 2017.10.28 |
댓글