Search code examples
javascriptc++node.jsnode-gyp

How to include tesseract library in node-gyp build process


I'm trying to create simple node-addon with tesseract library as a dependency, but I'm a c++ beginner. Whole code at: https://github.com/q-nick/node-tesseract

binding.cc:

#include <node.h>
#include <v8.h>
// #include <tesseract/baseapi.h>
// #include <leptonica/allheaders.h>

void Method(const v8::FunctionCallbackInfo<v8::Value>& args) {
  v8::Isolate* isolate = args.GetIsolate();
  args.GetReturnValue().Set(v8::String::NewFromUtf8(isolate, "world"));
}

void init(v8::Local<v8::Object> exports) {
  NODE_SET_METHOD(exports, "hello", Method);
}

NODE_MODULE(NODE_GYP_MODULE_NAME, init)

binding.gyp:

{
  "targets": [
    {
      "target_name": "binding",
      "sources": [
        "src/binding.cc"
      ],
      'defines': [ 'V8_DEPRECATION_WARNINGS=1' ],
      'include_dirs': [
      ],
      'libraries': [
        # '-lpvt.cppan.demo.google.tesseract.libtesseract',
        # '-lleptonica'
      ]
    }
  ]
}

I found a project which could help me compiling dependencies like tesseract, leptonica - it's https://cppan.org/

Unfortunately, I can't figure out - how to connect this with the node-gyp build process. CPPAN has one config file it's named cppan.yml (something like package.json in npm)

cppan.yml:

dependencies:
  pvt.cppan.demo.google.tesseract.libtesseract: master
  pvt.cppan.demo.danbloomberg.leptonica: 1

I want to build my node-addon and all dependencies (like tesseract) by one command. And don't know how to link c++ dependencies in node-gyp build

I want to use latest tesseract version so I can't use pre-compiled libraries. Currently, I'm working in Windows environment, but I want it to be a cross-platform process.

My example GitHub project (https://github.com/q-nick/node-tesseract) must compile successfully after uncommenting tesseract include.

If there is some other easy way how to accomplished this please share.


Solution

  • I will answer my question by myself.

    I found a project: https://github.com/cmake-js/cmake-js which has many explanation about why move away from gyp:

    ...First of all, Google, the creator of the gyp platform is moving towards its new build system called gn, which means gyp's days of support are counted...

    I also found: https://github.com/nodejs/nan/

    ...The goal of this project is to store all logic necessary to develop native Node.js addons without having to inspect NODE_MODULE_VERSION and get yourself into a macro-tangle...

    So i give it a try.

    binding.cc:

    #include <nan.h>
    #include <baseapi.h>
    #include <allheaders.h>
    
    NAN_MODULE_INIT(InitAll) {
      Set(target, New<String>("myMethod").ToLocalChecked(),
        GetFunction(New<FunctionTemplate>(MyMethod)).ToLocalChecked());
    }
    
    NODE_MODULE(addon, InitAll)
    
    NAN_METHOD(MyMethod) {
      info.GetReturnValue().Set(Nan::New<v8::String>("world").ToLocalChecked());
    }
    

    Next thing is to create CMakeLists.txt file with few modification. I want to use cppan as dependencies installator, so I have to add some extra lines to default CMAkeLists.txt file:

    add_subdirectory(.cppan)
    ...
    target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB}
        pvt.cppan.demo.google.tesseract.libtesseract
        pvt.cppan.demo.danbloomberg.leptonica
    )
    

    CMakeLists.txt:

    project(addon)
    
    file(GLOB SOURCE_FILES "src/**/*.cc" "src/**/*.h")
    add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})
    
    add_subdirectory(.cppan)
    
    set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")
    
    target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_JS_INC})
    
    target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB}
        pvt.cppan.demo.google.tesseract.libtesseract
        pvt.cppan.demo.danbloomberg.leptonica
    )
    

    cppan.yml

    dependencies:
      pvt.cppan.demo.google.tesseract.libtesseract: master
      pvt.cppan.demo.danbloomberg.leptonica: 1
    

    Now, everything is already set up and we can run install and build command:

    cppan
    

    and

    cmake-js build
    

    Good luck!