본문 바로가기

# Lang/NodeJS C++ Addon

[튜토리얼] C++ 크로스플랫폼 애드온 제작하기

이 포스팅은 이전 포스팅과 이어집니다.

크로스플랫폼

NodeJSC++을 도입한다면 장단점은 명확합니다. 좋든 좋지않든 C++의 거의 모든 장단점을 통채로 가져온다는 것이죠. C++의 모토인 원한다면 만들 수 있다는 장점을 가져온 것과 동시에, 타겟 플랫폼에 종속된다는 단점도 함께 가져온 것이죠.


예를 들어 Node.JS의 기본함수만으로는 동기적으로 쓰레드를 정지시키는 함수를 만들 수 없기 때문에, 이 기능을 사용하고 싶다면 C++의 힘을 빌려야합니다. 하지만 문제는 각 운영체제마다 sleep을 사용하는 방법이 다르다는 것입니다. 헤더 이름도 다르고, 함수 시그너쳐도 다르며, 함수 이름도 다릅니다.

Windows

#include <windows.h>

//
// sleep 1ms.
Sleep(1);

Linux

#include <unistd.h>

//
// sleep 1ms.
usleep(1'000);

물론 타겟 플랫폼이 명확한 경우에는 상관이 없지만 모든 운영체제에서 작동해야 하는 라이브러리를 만들고싶다면 조금 이야기가 다르죠. 다음절에서 이를 위한 방법에 대해 이야기합니다.


구현방법

결론부터 말하자면 왕도(王道)는 없으며 각 플랫폼 마다 코드를 작성해야 합니다.
간단하게 요약하면 다음과 같습니다.

  1. 각 플랫폼마다 코드를 따로 만든다.
  2. 사용자의 플랫폼에 따라 컴파일할 파일을 동적으로 결정한다.

미리 컴파일된 라이브러리를 제공하는 방법도 있겠지만 CPU의 명령어가 다른 경우에는 호환되지 않으므로 좋은 방법은 아닙니다.


위의 방법에서의 핵심은 사용자의 플랫폼을 감지하는 것인데, 이전 포스팅에서 설명했듯이 cmake또는 node-pre-gyp에서 이러한 기능을 지원합니다. 여기서는 cmake를 사용하여 크로스 플랫폼을 구현해보겠습니다.


아래와 같은 형태가 되어야합니다.

root
├─ CMakeLists.txt
├─ sleep_unix.cpp
├─ sleep_windows.cpp
└─ index.js

1. 네이티브 코드 작성

먼저 지원할 플랫폼에 맞게 cpp 파일을 작성합니다.


2. CMake 작성

핵심 문법은 다음과 같습니다.

# check if windows
if (WIN32)
    file(GLOB SOURCE_FILES "./sleep_windows.cpp")
endif (WIN32)

# check if unix
if (UNIX)
    file(GLOB SOURCE_FILES "./sleep_unix.cpp")
endif (UNIX)

# check if mac
if (APPLE)

endif (APPLE)

3. cmake-js로 컴파일

$ cmake-js compile

cmake-js를 이용한 컴파일이 처음이라면 이전 포스팅을 먼저 참고해주세요.

4. install스크립트 등록

package.json에 다음과 같은 스크립트를 등록합니다. npm을 통해 설치되면 사용자의 컴퓨터에서 자동적으로 아래의 스크립트가 호출되어 컴파일됩니다.

{
    "scripts" : {
        "install" : "cmake-js compile" 
    }
}

예제

유닉스와 윈도우를 지원하는 cross-flatform sleep sync 예제입니다.

  • 코드를 다운로드하려면 아래의 레포지토리를 복사하세요.
$ git clone https://github.com/MyAeroCode/waait-sync

  • 코드를 테스트하려면 아래의 패키지를 설치하세요.
$ npm install waait-sync