이 포스팅은 이전 포스팅과 이어집니다.
크로스플랫폼
NodeJS
에 C++
을 도입한다면 장단점은 명확합니다. 좋든 좋지않든 C++
의 거의 모든 장단점을 통채로 가져온다는 것이죠. C++
의 모토인 원한다면 만들 수 있다
는 장점을 가져온 것과 동시에, 타겟 플랫폼에 종속된다
는 단점도 함께 가져온 것이죠.
예를 들어 Node.JS
의 기본함수만으로는 동기적으로 쓰레드를 정지
시키는 함수를 만들 수 없기 때문에, 이 기능을 사용하고 싶다면 C++
의 힘을 빌려야합니다. 하지만 문제는 각 운영체제마다 sleep을 사용하는 방법
이 다르다는 것입니다. 헤더 이름도 다르고, 함수 시그너쳐도 다르며, 함수 이름도 다릅니다.
Windows
#include <windows.h>
//
// sleep 1ms.
Sleep(1);
Linux
#include <unistd.h>
//
// sleep 1ms.
usleep(1'000);
물론 타겟 플랫폼이 명확한 경우에는 상관이 없지만 모든 운영체제에서 작동해야 하는
라이브러리를 만들고싶다면 조금 이야기가 다르죠. 다음절에서 이를 위한 방법에 대해 이야기합니다.
구현방법
결론부터 말하자면 왕도(王道)
는 없으며 각 플랫폼 마다
코드를 작성해야 합니다.
간단하게 요약하면 다음과 같습니다.
- 각 플랫폼마다 코드를 따로 만든다.
- 사용자의 플랫폼에 따라 컴파일할 파일을 동적으로 결정한다.
미리 컴파일된 라이브러리를 제공하는 방법도 있겠지만 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
'# Lang > NodeJS C++ Addon' 카테고리의 다른 글
[벤치마크] C++ 애드온을 도입하면 성능이 얼마나 향상될까? (2) | 2020.03.16 |
---|---|
[DeepDive] NodeJS C++ Addon 깊게 입문하기 (4) | 2020.03.11 |