책 소개
요약
소프트웨어 빌드의 기본 개념부터 숙련된 전문가급 조언을 제공한다. 가장 널리 사용되는 GNU Make와 Ant, SCons, CMake를 활용하여 예제를 다루고 있어 실무에 바로 적용할 수 있다. 이뿐만 아니라 빌드 변형과 버전 관리, 확장 등의 고급 주제까지 다루어 고급 개발자에 필요한 좋은 내용을 제공한다.
추천의 글
이 책은 소프트웨어 빌드 시스템의 선택과 각 빌드 시스템의 장점, 그리고 잘 디자인된 빌드 시스템을 구성하기 위해 해결해야 할 문제에 대해 완전하고 포괄적인 방법을 보여준다. 효율적 소프트웨어 개발 과정에서 잘 디자인된 빌드 시스템은 중요한 역할을 한다. 소프트웨어 빌드 엔지니어뿐만 아니라 모든 소프트웨어 개발자에게 이 책을 추천하고 싶다. - 캐빈 보디(Kevin Bodie) / 피트니 보우스(Pitney Bowes) 소프트웨어 개발 이사
이 책은 소프트웨어 개발 프로젝트에서 중요하지만, 종종 소홀해지기 쉬운 빌드 시스템을 훌륭하고 상세하게 설명한다. 빌드 시스템의 생산성에 관한 논의만으로도 이 책을 읽을 만한 충분한 가치가 있다. - 존 팬톤(John M. Pantone) / 오브젝테크 사(Objectech Corporation) IT 교육자 겸 코스 개발자
피터 스미스(Peter Smith)는 여러 종류의 소프트웨어 빌드 도구에 관한 수년간의 경험을 바탕으로 소프트웨어 빌드 시스템을 흥미롭고 이해하기 쉽게 설명한다. 이 책은 훌륭히 구성되고 잘 쓰였을 뿐만 아니라 포괄적인 내용을 담고 있다. 빌드 시스템 담당자 모두에게 이 책을 추천하고 싶다. - 제프 오버비(Jeff Overbey) / 포트란(Photran) 프로젝트 공동 리더
이 책은 소프트웨어 빌드에 관해 어떻게 생각해야 하는지를 가르쳐 준다. 저자 피터 스미스는 소프트웨어를 빌드하기 위한 도구와 기술을 조사했으며, 무엇이 잘못된 방법인지를 조사했다. 빌드 시스템 초보자는 물론 숙련된 빌드 엔지니어에게도 도움이 될 책이다. - 몬테 다비도프(Monte Davidoff) / 얼루비얼 소프트웨어(Alluvial Software) 소프트웨어 개발 컨설턴트
이 책에서 다루는 내용
■ 소스 트리, 빌드 도구, 컴파일 도구와 같은 빌드 시스템의 기본 개념
■ 가장 많이 사용되는 GNU Make, Ant, SCons, CMake, 이클립스 IDE, 5가지 빌드 도구의 특징 비교
■ 정확한 종속성 확인 방법과 효율적인 증분 빌드 방법
■ 메타 데이터를 활용한 디버깅, 프로파일링, 문서화 작업
■ 복잡한 버전 관리 시스템, 빌드 머신, 컴파일 도구와 관련된 모범 사례
이 책의 대상 독자
이 책은 소프트웨어 개발자를 위해 중점적으로 기술했지만, 소프트웨어 개발자가 아닌 사람에게도 유용할 수 있다.
■ 개발자: 여러분이 수년간 소프트웨어를 개발해 왔지만 빌드 시스템에 대해 잘 모른다면, 빌드 시스템을 어떻게 만들고 유지 보수해야 하는지를 배운다. 또한 빌드 프로세스와 관련된 여러 도구에 대해서도 배운다.
■ 관리자: 이 책을 통해 상위 수준에서의 개념과, 개발자와 대화하는 방법을 배운다. 이를 통해 여러분의 팀이 하는 일을 평가할 수 있으며, 팀이 나아갈 방향을 설정할 수 있을 것이다.
■ 빌드 전문가: 빌드 시스템에 대한 많은 경험이 있다면 무엇인가 새로운 점을 기대할 것이다. 이 책은 사용해보지 않았던 최신 빌드 도구들과 규모가 큰 빌드 시스템에서 확장성과 성능에 관한 내용을 제공할 것이며, 새로운 빌드 프레임워크를 만들 때 여러분의 빌드 시스템을 다시 한 번 생각할 기회를 제공한다.
이 책의 구성
1부, ‘빌드 시스템의 기초’
에서는 빌드 시스템에 익숙하지 않은 개발자를 위해, 빌드 시스템에 대한 기본적인 사항을 소개한다. 1부를 생략해도 되는 경험이 많은 개발자이더라도 빌드 시스템의 기본적인 큰 그림을 확인할 수 있다. 예를 들어 C/C++ 개발자라면 C#에 대한 새로운 점을 배울 수 있다.1장, ‘빌드 시스템 개요’에서는 소스 트리와 오브젝트 트리, 빌드 도구, 컴파일 도구 등과 같은 빌드 시스템에 대한 상위 개념을 소개한다.
2장, ‘Make 기반 빌드 시스템’에서는 ’makefile을 한 번도 작성해 보지 않은 개발자를 위해 가벼운 튜토리얼을 제공한다.
3장, ‘프로그램의 런타임 뷰’에서는 빌드 시스템을 구축하는 데 필요한 것들을 설명할 목적으로, 컴퓨터에서 실행하는 프로그램 구조를 설명한다.
4장, ‘파일 타입과 컴파일 도구’에서는 C/C++와 자바, C# 예제를 통해 각 빌드 프로세스에서 사용되는 여러 입/출력 파일에 대한 상세한 내용을 다룬다.
5장, ‘하위타겟과 빌드 변형’에서는 후반부에서 더욱 자세히 다룰 빌드 변형에 대한 기본 개념을 설명한다.
1부를 읽고 나면 빌드 시스템 디자인에 대한 기본적인 개념을 얻게 될 것이다.
2부, ‘빌드 도구’
에서는 다섯 개의 빌드 도구를 비교한다. 이 빌드 도구들은 대중성과 소프트웨어 빌드 방법을 고려해 선택했다. 각 장에서는 먼저 빌드 도구에서 사용되는 구문을 소개한 후 빌드 도구의 주요한 사용 시나리오를 설명한다. 의미 있는 비교를 위해 모든 장에서 같은 예제를 사용했다.6장, ‘Make’에서는 C/C++ 개발에서 가장 널리 사용되는 GNU Make 도구에 대해 설명한다.
7장, ‘Ant’에서는 자바에서 사실상 표준으로 사용되는 Ant 빌드 도구에 대해 설명한다.
8장, ‘SCons’에서는 비교적 최신 빌드 도구인 SCons를 다룬다. SCons는 빌드 프로세스를 서술할 때 파이썬(Python) 언어를 사용한다.
9장, ‘CMake’에서는 이 단원의 핵심주제인 CMake를 살펴본다. CMake는 빌드 프로세스에 관한 상위 수준 서술을 토대로 Make와 같은 네이티브 빌드 시스템을 생성한다.
10장, ‘이클립스’에서는 이클립스 IDE에서의 빌드 관련 기능에 대해 설명한다.
2부를 읽고 나면 최신 빌드 도구의 종류와 각 빌드 도구의 장단점을 이해할 수 있다.
3부, ‘고급 주제’
에서는 종속성 분석, 소프트웨어 패키지, 설치, 버전 관리, 빌드 머신 관리, 컴파일 도구 등과 같은 빌드 시스템에 관한 고급 주제를 다룬다. 각 장에서는 여러분이 까다로운 소프트웨어 프로젝트를 접한 경험이 있다는 전제하에 이와 관련된 내용을 살펴본다.11장, ‘종속성’에서는 컴파일돼야 하는 파일을 알아내는 다양한 종속성 검사 방법에 관해 자세히 다룬다.
12장, ‘메타데이터로 빌드’에서는 빌드 시스템이 디버깅과 프로파일링, 소스코드 문서화를 지원하기 위한 메타 파일 생성 방법을 살펴본다.
13장, ‘소프트웨어 패키징과 설치’에서는 간단한 예제를 통해 소프트웨어 패키징과 타겟 머신에서의 설치 준비에 필요한 내용을 설명한다.
14장, ‘버전 관리’에서는 빌드 시스템과 소프트웨어 버전 관리에 관련된 고려 사항을 알아본다.
15장, ‘빌드머신’에서는 소프트웨어를 컴파일하기 위해 사용되는 빌드 머신 관리에 관한 모범사례를 제공한다.
16장, ‘도구 관리’에서는 컴파일 도구에 대해 다룬다.
3부를 통해 많은 모범 사례와 빌드 시스템 구성에 필요한 고급 개념을 익히게 된다.
4부, ‘확장’
에서는 대규모 소프트웨어를 위한 빌드 시스템의 설계 방법을 살펴본다. 소프트웨어의 규모가 커지면, 복잡성 증가와 물리적 디스크 사용량 증가, 빌드 시간 지연 등과 같은 문제를 수반한다. 이런 문제는 소프트웨어 개발 생산성을 저하시킨다.17장, ‘최종 사용자를 위한 복잡성 감소’는 빌드 시스템 사용자가 느끼는 복잡성을 줄이는 방법을 살펴본다.
18장, ‘빌드 크기 관리’는 더욱 효율적인 개발을 위해 규모가 큰 소프트웨어 제품을 여러 개의 컴포넌트로 나누는 방법을 설명한다.
19장, ‘더 빠른 빌드’는 소프트웨어 빌드 시간을 측정하고 줄이는 방법을 살펴본다.
4부를 읽고 나면 앞으로 규모가 커질 소프트웨어를 규모가 작은 초기 단계에서 어떻게 빌드 시스템을 설계해야 할지 알게 될 것이다.
목차
목차
- 1부 빌드 시스템의 기초
- 1장 빌드시스템 개요
- 빌드 시스템이란?
- 컴파일형 언어
- 인터프리트형 언어
- 웹 기반 애플리케이션
- 단위 테스트
- 정적 분석
- 문서 생성
- 빌드 시스템의 구성 요소
- 버전 관리 도구
- 소스와 오브젝트 트리
- 컴파일 도구와 빌드 도구
- 빌드 머신
- 릴리스 패키징과 타겟 머신
- 빌드 프로세스와 빌드 기술
- 빌드 시스템을 어떻게 사용하는가?
- 빌드 관리 도구
- 빌드 시스템 품질
- 정리
- 2장 Make 기반 빌드 시스템
- 계산기 프로그램 예제
- 간단한 Makefile 작성
- Makefile의 간결화
- 빌드 타겟 추가
- 프레임워크 사용
- 정리
- 3장 프로그램의 런타임 뷰
- 실행 프로그램
- 네이티브 기계어 코드
- 모놀리식 시스템 이미지
- 전체가 인터프리트되는 프로그램
- 인터프리트된 바이트 코드
- 라이브러리
- 정적 링크
- 동적 링크
- 설정 파일과 데이터 파일
- 분산형 프로그램
- 정리
- 4장 파일 타입과 컴파일 도구
- C/C++
- 컴파일 도구
- 소스 파일
- 어셈블리 언어 파일
- 오브젝트 파일
- 실행 프로그램
- 정적 라이브러리
- 동적 라이브러리
- C++ 컴파일
- 자바
- 컴파일 도구
- 소스 파일
- 오브젝트 파일
- 실행 프로그램
- 라이브러리
- C#
- 컴파일 도구
- 소스 파일
- 실행 프로그램
- 라이브러리
- 기타 파일 타입
- UML 기반 코드 생성
- 그래픽 이미지
- XML 구성 파일
- 국제화와 리소스 번들
- 빌드 변형 구체화
- 코드의 다양화
- 다중 컴파일러
- 플랫폼에 특성화된 파일이나 함수
- 다중 오브젝트 트리
- 종속성 그래프를 만드는 Makefile 규칙
- Makefile 규칙 유형
- Makefile 변수
- 기본 제공 변수와 규칙
- 데이터 구조체와 함수
- 프로그램 흐름 이해
- 추가 참고 도서
- 시나리오 1: 단일 디렉터리의 소스코드
- 시나리오 2(a): 여러 디렉터리의 소스코드
- 시나리오 2(b): 여러 디렉터리를 지원하는 재귀 Make
- 시나리오 2(c): 여러 디렉터리를 지원하는 포함 Make
- 시나리오 3: 새로운 컴파일 도구 정의
- 시나리오 4: 여러 변형으로 빌드
- 시나리오 5: 빌드 트리 클리닝
- 시나리오 6: 잘못된 빌드 디버깅
- 찬사
- 비판
- 평가
- 버클리 Make
- NMake
- ElectricAccelerator와 SparkBuild
- ‘Hello World’에서 한 걸음 더 나아가기
- 시나리오 1: 단일 디렉터리의 소스코드
- 시나리오 2(a): 여러 디렉터리의 소스코드
- 시나리오 2(b): 여러 디렉터리의 여러 build.xml 파일
- 시나리오 3: 새로운 컴파일 도구 정의
- 시나리오 4: 여러 변형으로 빌드
- 시나리오 5: 빌드 트리 클리닝
- 시나리오 6: 잘못된 빌드 디버깅
- 찬사
- 비판
- 평가
- NAnt
- MS 빌드
- 파이썬 프로그래밍 언어
- 간단 컴파일
- 빌드 환경 관리
- 프로그램 흐름과 종속성 분석
- 리빌드할 시기 결정
- 언어 확장
- 기타 흥미로운 기능
- 추가 참고 문헌
- 시나리오 1: 단일 디렉터리의 소스코드
- 시나리오 2(a): 여러 디렉터리의 소스코드
- 시나리오 2(b): 여러 SConstruct 파일
- 시나리오 3: 새로운 컴파일 도구 정의
- 시나리오 4: 여러 변형으로 빌드
- 시나리오 5: 빌드 트리 클리닝
- 시나리오 6: 잘못된 빌드 디버깅
- 찬사
- 비판
- 평가
- Cons
- Rake
- CMake 언어 기초
- 실행 프로그램과 라이브러리 빌드
- 흐름 제어
- 크로스플랫폼 지원
- 네이티브 빌드 시스템 생성
- 기타 흥미로운 기능과 추가 참고 문헌
- 시나리오 1: 단일 디렉터리의 소스코드
- 시나리오 2: 여러 디렉터리의 소스코드
- 시나리오 3: 새로운 컴파일 도구 정의
- 시나리오 4: 여러 변형으로 빌드
- 시나리오 5: 빌드 트리 클리닝
- 시나리오 6: 잘못된 빌드 디버깅
- 찬사
- 비판
- 평가
- Automake
- Qmake
- 프로젝트 생성
- 프로젝트 빌드
- 프로젝트 실행
- 내부 프로젝트 모델 사용
- 기타 빌드 기능
- 추가 참고 문헌
- 시나리오 1: 단일 디렉터리의 소스코드
- 시나리오 2: 여러 디렉터리의 소스코드
- 시나리오 3: 새로운 컴파일 도구 정의
- 시나리오 4: 여러 변형으로 빌드
- 시나리오 5: 빌드 트리 클리닝
- 시나리오 6: 잘못된 빌드 디버깅
- 찬사
- 비판
- 평가
- C/C++ 개발 도구인 이클립스 CDT
- 증분 컴파일
- 전체, 증분, 하위 타겟 빌드
- 누락된 종속성이 런타임 에러를 유발시키는 문제
- 누락된 종속성이 컴파일 에러를 유발시키는 문제
- 원치 않는 종속성이 과도한 재빌드를 유발시키는 문제
- 원치 않는 종속성이 종속성 분석을 실패하게 하는 문제
- 순환 종속성 문제
- 종속성 대용으로 암묵적 시퀀싱에 관한 문제
- Clean 타겟이 제대로 클리닝하지 못하는 문제
- 정확한 종속성 정보 수집
- 종속성 그래프 캐싱
- 캐싱된 종속성 그래프 갱신
- 타임스탬프 기반 메소드
- 체크섬 기반 메소드
- 플래그 비교
- 기타 고급 메소드
- 패키징 스크립트
- 기타 아카이브 포맷
- 개선 방법
- RPM 패키지 관리 포맷
- rpmbuild 프로세스
- RPM 명세 파일의 예
- 명세 파일로부터 RPM 파일 작성
- RPM 예제 설치
- 널소프트 스크립터블 인스톨 시스템(NSIS)
- 설치 스크립트
- 페이지 정의
- 라이선스 페이지
- 디렉터리 선택
- 주 컴포넌트
- 옵션 컴포넌트
- 사용자 정의 페이지 정의
- 설치 페이지와 설치 제거 프로그램
- 빌드 기술 파일
- 도구 참조
- 큰 바이너리 파일
- 소스 트리 구성
- 소스 트리에 생성된 파일
- 버전 관리하에서 생성된 파일
- 빌드 관리 스크립트
- 버전 번호 붙이기 시스템
- 버전 번호 편성과 업데이트
- 버전 번호 저장과 검색
- 네이티브 컴파일
- 크로스컴파일
- 혼합 환경
- 빌드 머신이 다른 이유
- 여러 다른 빌드 머신 관리
- 상위 레벨 작업 흐름
- Autoconf 예제
- authheader와 autoconf 실행
- 빌드 머신상의 configure 스크립트 실행
- 구성 정보 사용
- 도구 규칙 #1: 노트를 작성하라
- 도구 규칙 #2: 소스코드는 반드시 버전 관리하에 두라
- 도구 규칙 #3: 주기적으로 도구를 업데이트하라
- 도구 규칙 #4: 도구 바이너리의 버전 관리
- 규칙 깨기
- 빌드 기술에서 개발자 해당 부분
- 빌드 기술에서 프레임워크 부분
- 구성상의 규약
- Maven: 예제 빌드 도구
- 테스트해야 할 다른 변형들을 갖게 됨
- 소스코드가 난해해짐
- 빌드 시간이 증가할 수 있음
- 더 많은 디스크 공간이 요구됨
- 최신 빌드 도구를 사용
- 자동으로 종속성을 검출
- 생성된 파일을 소스 트리 외부에 보관
- 빌드 트리 클리닝이 올바르게 동작하는지 확인
- 첫 번째 에러 후 빌드를 중단
- 의미 있는 에러 메시지를 제공
- 입력 매개변수의 유효성을 확인
- 빌드 스크립트를 필요 이상으로 복잡하게 만들지 마라
- 애매한 언어 기능 사용을 피하라
- 빌드 프로세스를 제어하기 위해 환경 변수 사용을 자제하라
- 릴리스와 디버그 빌드가 유사한지 확인하라
- 실행될 정확한 명령을 표시하라
- 도구에 대한 버전 관리 참조
- 빌드 명령의 버전 관리
- 컴파일 플래그 변경 자동 검출
- 빌드 시스템에서 버전 관리 도구 호출을 자제하라
- 가능한 한 자주 지속적인 통합을 하라
- 단일 형식의 빌드 머신에 대한 표준화를 하라
- 단일 컴파일러에 대한 표준화를 하라
- #ifdef로 코드가 난잡해지는 것을 피하라
- 의미 있는 심볼 이름을 사용하라
- 오래된 코드를 제거하라
- 소스 파일을 이중화하지 말라
- 일관성 있는 빌드 시스템을 사용하라
- 컴포넌트 사용의 장점
- 컴포넌트란?
- 컴포넌트를 단일 프로젝트로 통합
- 개발 팀 구조
- 컴포넌트 라인업 관리
- 컴포넌트 캐시 관리
- 새로운 소프트웨어 기능 조정
- 시동 단계에서 성능 측정
- 컴파일 단계에서의 성능 측정
- 성능 측정 도구
- 문제 해결: 성능 개선
- 오브젝트 파일 캐싱
- 스마트 종속성
- 기타 빌드 회피 기술
- 빌드 클러스터/클라우드
- 병렬 빌드 도구
- 확장성의 한계
도서 오류 신고
정오표
정오표
[p.72 : 주석 3]
유닉스에서 파일이나 디렉터리 삭제 명령으로, DOS의 rm과 유사하다.
->
유닉스에서 파일이나 디렉터리 삭제 명령으로, DOS의 DEL과 유사하다.