본문 바로가기

Library/Windows Programming

MSYS Portable Install using MinGW

MSYS는 시그윈(Cygwin)과 비슷하게, 윈도우 환경에서 최소한의 유닉스 시스템을 구성해준다. 시그윈이 유닉스 레이어를 구성하는 dll를 가지는 방식으로, 최대한의 호환성을 제공하는 것과 달리, MSYS는 최대한 유닉스 시스템과 호환성을 가지면서도 성능을 우선시한다. 즉, 생성되어 나오는 바이너리가 레이어를 거쳐 실행되는 시그윈과 달리, 직접적으로 윈도우 바이너리를 생성한다. 그러나 실행 성능은 좋다고는 할 수 없다.

MSYS의 가치는, 수많은 유닉스 기반 프로그램들을 직접 컴파일할 수 있도록 해준다는데 있다. 유닉스 프로그램들은 주로 automake, autoconf와 같은 툴을 이용하여 배포되기 때문에, ./configure 스크립트를 처리할 수 있는 환경이 아니라면 프로그램이 이식성을 염두에 두고 작성되었다고 해도 빌드가 어려워진다. 특히, 빌드에 사용되는 툴과 autoconf 자체의 특성 때문에, 윈도우 플랫폼에서 이것은 상당히 골치 아픈 문제다.

MSYS는 MinGW 프로젝트에서 함께 관리하는데, MinGW와 MSYS, 그리고 Visual Studio 조합이면 빌드하지 못하는 프로그램은 거의 없다. 문제는, 이렇게 좋은 MSYS를 설치하는게 그렇게 만만한 작업은 아니라는 것인데, 이것은 설치 그 자체의 어려움보다는 의존성을 가지는 패키지만 선별적으로 설치하기 어렵기 때문이다. 자신만의 MSYS시스템을 만들고, 유닉스 프로그램들을 직접 컴파일하고 싶다면 다음을 참고하여 MSYS를 설치하기 바란다. 여기서는 인스톨러를 사용하지 않는다. MinGW / MSYS 패키지들은 소스포지에서 호스팅하고 있다 : http://sourceforge.net/projects/mingw/


먼저, MinGW의 gcc를 사용하거나, MSYS의 gcc를 사용하는 것 중 하나를 선택한다. MinGW를 선택한다면 MSYS를 설치할 때 추가로 gcc를 설치할 필요없이, MinGW가 설치된 디렉토리를 마운트하면 된다.


1. MinGW 홈페이지에서, msysCORE(1.13, bin)를 다운 받는다. 필요하다면 1.15 버전도 다운 받는다. (bin, ext 모두)

2. 이것을 MSYS를 설치할 디렉토리에 복사하고, 압축을 해제한다. msysCORE 1.13 패키지에는 msys.bat와 같은 필수 파일들이 있고, msysCORE 1.15 버전과 같은 경우 업데이트 된 일부 파일들만 제공한다. 아직 쉘이 없기 때문에 msys.bat를 실행하면 아무것도 할 수 없을 것이다. 이제, bash를 다운받고 같은 디렉토리에 압축을 해제한다.

3. bash / libregex (dll) / libtermcap (dll)를 설치한다. 이 패키지를 설치하면 이제 bash를 사용할 수 있다. 이 패키지들을 설치하면 이제 msys.bat를 실행했을 때 bash 프롬프트가 보일 것이다.

4.  msys-coreutil(bin, ext)을 설치한다. 여기에 포함된 유틸리티들을 실행하기 위해서는 libintl 라이브러리(dll)와 libiconv 라이브러리(dll)가 필요하다. 이 패키지들을 설치하면 이제 ls과 같은 명령어들을 실행할 수 있다. 이 과정까지 완료하면 '가장 가벼운' MSYS를 구성한 것이다.

5. 이제 개발툴을 설치한다. binutil과 make, sed, tar, bzip2, gzip, grep, gawk, less, m4와 같은 것은 필수 패키지이므로 가급적 설치하기를 권한다. 이외에도, 프로그램들을 빌드하고자 한다면 automake, autoconf, perl, diffutil과 같은 패키지가 반드시 필요할 것이다.

6. MSYS가 설치된 디렉토리에서, /etc/fstab을 설정한다. 만약 MSYS의 gcc를 설치하고자 한다면 fstab을 고칠 필요는 없지만, MinGW의 gcc를 사용하고자 한다면 fstab를 수정해야 한다. 만약, MinGW가 설치된 디렉토리가 C:\MinGW라면,

C:/MinGW /mingw

fstab에 위의 내용을 추가한다. 그리고, MSYS를 실행하고 gcc -v를 입력하여 정상적으로 gcc가 호출되는지 확인한다. 그리고, 필요하지 않다면 MSYS 루트 디렉토리의 postinstall 디렉토리를 삭제한다.

7. gcc가 정상적으로 호출된다면, 이제 원하는 프로그램을 빌드하면 된다. bash 프롬프트에서 ./configure 스크립트를 실행하면 제대로 동작할 것이다. 물론, 각각의 프로그램마다 빌드에 필요한 패키지가 있다면, 그것을 추가로 설치해 주어야 한다. 그런데, 어느 gcc를 사용했냐에 따라 필요한 패키지가 다르다. 예를 들어, MinGW를 사용하고 있는 상황에서 프로그램이 zlib을 요구한다면, 빌드 과정에서 gcc는 MinGW의 인클루드 디렉토리를 먼저 찾는다. 이 경우 MinGW으로 포팅된 zlib을 설치해야 하며, MSYS의 gcc를 설치했다면 MSYS의 gcc의 인클루드 디렉토리에 해당 zlib를 설치해야 한다. (MinGw 홈페이지에서 zlib 라이브러리가 MinGW, MSYS 두가지로 배포되는 이유다)


다음은, MSYS를 이용하여 SuperHirn을 컴파일한 결과다. 참고로, SuperHirn은 윈도우 포트를 제공하지 않는다. 저자들(개발자가 아니다)은 윈도우 포트가 간단할거라고 이야기하지만, 코드가 너무 지저분하기 때문에 포트하기 만만치 않으며, 이 코드는 하지 말아야 할 거의 모든 일을 하고 있다. 예를 들면, 변수명에 컴파일러가 자체 정의하는 이름을 사용하여 컴파일러에 따라 알 수 없는 에러를 내는 일은 다반사다. 이런 짓을 코드 전체에 걸쳐 하고 있다. 여튼, 직접 코드를 고치고, MSYS를 이용하여 윈도우용 바이너리를 만들었다. (정말 미친 짓이다)




컴파일된 SuperHirn의 윈도우용 바이너리는 다음과 같다. 다시 말하지만, 이 코드는 컴파일러 특성을 꽤나 타는 좋지 않은 코드이며, 직접 포팅하고자 한다면 그야말로 아수라장을 거쳐야 할 것이다.




그리고, 유명한 프로젝트인 FFMpeg 역시 MSYS로 컴파일하여 윈도우용 바이너리를 만들 수 있다. 현재(2010.8.7) 잘 컴파일되는 0.6 버전이나 적당한 FFMpeg 스냅샷을 가져온 다음, ./configure 스크립트를 실행한다. 윈도우 플랫폼에 맞는 바이너리를 생성해야 하기 때문에, 다음과 같은 인자를 추가한다. FFMpeg의 configure 스크립트 실행 시간은 좀 시간이 걸린다.


./configure --enable-memalign-hack --extra-cflags="-fno-common"




FFMpeg에 맞는 버전 헤더 파일을 생성한 뒤, 바이너리를 생성한다.


make version.h; make






진실로, 돈 없는 대부분의 프로그래머에게 GNU는 신의 선물이다. 비록 스톨만이 오픈 소스의 개념 오용에 대해 불평을 토해내는게 귀찮기는 하지만, 그가 해낸 일에 비하면 그 정도는 충분히 참아줄 수 있다. ;)


Enjoy MSYS!