처음 소프트웨어 개발을 시작했을 때는 항상 Windows 소프트웨어를 작성하는 것이 목표였습니다. 대학 서점에서 Borland C++를 구입하고 Windows API에 익숙해지려고 노력했던 기억이 납니다. 그러던 중 제 친구가 Linux라는 새로운 OS에 대해 알려주었습니다. 바로 다음 주말, 저는 몇 시간 동안 26개 정도의 플로피에 모두 리눅스를 다운로드하여 제 Packard Bell에 설치했습니다. 간단히 말해서 저는 지난 17년 동안 Linux 세계에 푹 빠져 살았습니다.
최근 노스케일에서는 Windows에서 멤캐시드, 특히 노스케일 멤캐시드 서버에 대한 지원을 추가하고 싶었습니다. 그래서 저는 Windows뿐만 아니라 Mingw 컴파일러와 Msys *NIX와 유사한 환경에 대해서도 잘 알게 되었습니다.
Windows는 제가 마지막으로 사용한 이후로 많이 바뀌었습니다. 특히 메모리 관리를 조정하려면 windows.ini, config.sys, autoexec.bat와 같은 구성 파일을 편집하는 데 능숙해야 했던 시절이 기억납니다. UNIX를 사용했던 사람으로서 Windows는 정말 많은 발전을 이루었습니다. 특히 최신 버전의 Windows는 더욱 그렇습니다. 오랫동안 사용하지 않던 것을 다시 사용하는 것은 마치 타임머신에서 나오는 것과 같은 흥미로운 경험입니다.
멤캐시드 빌드에는 Mingw 크로스 컴파일러를 사용합니다. Mingw란 무엇인가요? Mingw는 Windows 실행 파일을 빌드하는 데 필요한 거의 모든 것을 포함하는 GNU 컴파일러 제품군인 "Minimalist GNU for Windows"의 축약어입니다. 뿐만 아니라 Mingw를 사용하면 Linux나 다른 *NIX에서 Windows 바이너리를 Mingw로 교차 컴파일할 수 있습니다. 저희는 Windows 전용인 부분이 있기 때문에 Windows에서 빌드를 수행합니다.
왜 Microsoft 컴파일러를 사용하지 않느냐고 질문할 수도 있습니다. 멤캐시드 소스 프로젝트의 요구 사항과 목표가 C99를 준수하는 것이기 때문입니다. 이 점에 대해 일부 사람들이 강한 감정을 가지고 있다는 것을 알았습니다. 일부 사람들은 C99가 중요하지 않다고 주장하기도 합니다. 멤캐시드에서는 중요하기 때문에 저희의 필요에 맞는 것을 사용합니다. 저희가 달성하고자 하는 또 다른 요구 사항 또는 목표는 Windows 지원을 용이하게 하기 위해 멤캐시드 소스에 대한 변경 횟수를 최소화하는 것입니다. 다른 프로젝트에서도 종종 볼 수 있는 일이지만, 컴파일러 전 ifdef로 인해 소스 코드가 복잡해지는 경우가 많습니다. 이것이 바로 우리가 피하고 싶은 것입니다.
이 파이의 다른 한 조각은 Msys입니다. Msys는 "Minimal System"의 줄임말로, *NIX 명령줄 환경에서 사용할 수 있는 최소한의 도구 세트입니다. 소스 코드 관리 도구로 Git을 사용하기 때문에 Msysgit 프로젝트에는 최신 버전의 Msys뿐만 아니라 git이 패키지로 포함되어 있습니다. 또한 32비트 Windows의 경우 Msysgit에는 이미 Mingw가 포함되어 있습니다.
Mingw 및 Msys 설정
Mingw 및 Msys를 설정하려면 Windows 64비트 또는 32비트를 사용하는지 여부에 따라 다릅니다. 32비트의 경우 Msysgit을 설치하면 필요한 모든 것을 갖출 수 있습니다. 64비트 Windows의 경우 Msysgit을 설치한 다음 Mingw의 64비트 포트인 Mingw-w64를 설치합니다.
Msysgit 설치
Msysgit은 http://code.google.com/p/msysgit/ 에서 찾을 수 있습니다. 저희는 "전체 설치" 실행 파일 인스톨러를 선택했습니다. 다운로드가 완료되면 다운로드한 실행 파일을 실행하기만 하면 됩니다. 인스톨러는 c:msysgitmsysgit에서 Msys를 컴파일합니다. 설치가 완료되면 bash에서 이 디렉터리 구조는 /와 동일한 경로인 /c/msysgit/msysgit이 됩니다. Msysgit을 설치하면 Git이 동시에 컴파일되고 마지막으로 bash 셸 터미널 창이 표시됩니다. 가장 먼저 할 수 있는 일은 bash 터미널 창에서 tcl 스크립트를 실행하여 바탕화면 및/또는 메뉴에 바로 가기를 추가하는 것입니다:
/share/msysGit/add-shortcut.tcl
이 유용한 스크립트에 사용할 수 있는 옵션이 표시됩니다.
Mingw-w64 설치
64비트 Windows의 경우 mingw-w64를 설치해야 합니다. Mingw-w64용 압축 아카이브는 http://sourceforge.net/mingw-w64 mingw-w64-1.0-bin_i686-mingw_YYYYMMDD.zip에서 찾을 수 있습니다. 이 파일을 C:(/c/)에 압축을 풉니다.
시스템에 경로 추가하기
mingw 및 msysgit 바이너리와 라이브러리의 경로를 모두 포함하도록 PATH 환경 변수를 추가해야 합니다. Windows에서 환경 변수는 %NAME%를 사용합니다(예: %PATH%). 또한 Windows의 경로 구분 문자는 콜론이 아닌 세미콜론입니다. PATH를 수정하려면 다음과 같이 하세요:
제어판 ->
시스템 ->
고급 ->
환경 변수 ->
경로(편집하려면 클릭)
기존 경로에 다음을 추가합니다:
c:mingwbin;c:msysgitmsysgitbin;c:msysgitmsysgitlocalbin;c:msysgitmsysgitmingwbin;
Windows에서 알아야 할 또 다른 사항은 라이브러리 로드 경로가 단순히 %PATH%($PATH)라는 점입니다.
Mingw로 코드 컴파일하기
이 시점에서는 코드를 컴파일하고 Windows 실행 파일을 생성할 수 있을 정도로 기능적인 시스템을 갖추고 있어야 합니다. 또한 익숙한 *NIX 도구를 사용하여 Windows 시스템에서 작업할 수 있게 됩니다!
win32에서 코드를 컴파일할 때는 Linux에서와 같은 방식으로 컴파일을 실행하기만 하면 바로 작동합니다. 네트워크 라이브러리인 Libevent를 예로 들어보겠습니다. win32(Msysgit)에서 컴파일하려면 다음과 같이 하면 됩니다:
./configure
make
설치하기
그러나 win64의 경우 mingw-w64가 설치되어 있으므로 config를 실행할 때 몇 가지 플래그를 지정해야 합니다:
./configure -host=x86_64-w64-mingw32 -build=i686-pc-mingw32 -prefix=/usr
make
이 플래그는 64비트 라이브러리와 실행 파일을 얻을 수 있도록 처리합니다. make를 실행하면 다음과 같은 줄이 컴파일됩니다:
/bin/sh ./libtool -tag=CC -mode=compile x86_64-w64-mingw32-gcc -DHAVE_CONFIG_H -I. -I./compat -I
./include -IWIN32-Code -g -O2 -Wall -fno-strict-aliasing -MT select.lo -MD -MP -MF .deps/select.T
po -c -o select.lo select.c
Mingw-w64 실행 디렉터리인 /c/mingw/bin을 보면 플래그 지정이 필요한 이유를 알 수 있습니다. 모든 바이너리 앞에 "compile x86_64-w64-mingw32"라는 접두사가 붙습니다. host 및 -build 옵션을 지정하면 올바른 컴파일러 실행 파일이 사용되어 적절한 아키텍처를 보장합니다.
구성 스크립트의 편의성이 없는 일부 다른 프로그램의 경우 제공된 CROSS를 사용하여 만들 수 있습니다:
CROSS=x86_64-w64-mingw32-
이렇게 하면 적절한 컴파일러와 링커 바이너리를 사용할 수 있습니다.