0.5.1 • Published 8 months ago

libclangjs-cmake v0.5.1

Weekly downloads
-
License
-
Repository
github
Last release
8 months ago

Release libclangjs

CMake package to be used for integrating / extending Libclangjs. This project is meant to be used with another CMake project and Emscripten.

Quickstart

Check the test-cmake package (part of libclangjs) for a simple example on how to use this package in your project.

Create a new npm project, which will extend the functionality of libclangjs.

$ mkdir my-libclangjs-project && cd my-libclangjs-project
$ npm init -y

Now, add a CMakeLists.txt for your project.

cmake_minimum_required(VERSION 3.8)

project(my-libclangjs-project)

add_executable(my-libclangjs-project "main.cpp")

find_package(libclangjs-cmake REQUIRED)
target_include_directories(my-libclangjs-project PUBLIC ${CLANG_INCLUDE_DIRS})
target_link_libraries(my-libclangjs-project
  -Wl,--whole-archive libclangjs-cmake -Wl,--no-whole-archive
)

set_target_properties(
  my-libclangjs-project PROPERTIES
  COMPILE_FLAGS "-pthread"
  LINK_FLAGS "-pthread -lembind -sALLOW_MEMORY_GROWTH=1 -sENVIRONMENT=node,worker"
)

Please note:

  • In the target_link_libraries call, the library libclangjs-cmake is embedded using the --whole-archive flag. Using these flags forces the compiler to evaluate all global constructors in that file. Emscripten's binding system relies on that mechanism to provide bindings from JavaScript.
  • In the set_target_properties call, the COMPILE_FLAGS and LINK_FLAGS can be used to customize Emscripten to produce the desired output. Check their documentation for more info.

Add a main.cpp file to your project.

#include <clang-c/Index.h>
#include <emscripten/emscripten.h>
#include <iostream>

int main() {
  auto i = clang_createIndex(1, 1);
  clang_parseTranslationUnit(i, "nonexistingfile", nullptr, 0, nullptr, 0, 0);
  EM_ASM({
    const index = Module.createIndex(1, 1);
    const nullTu = Module.parseTranslationUnit(index, "nonexistingfile", null, null, 0);
    console.log("nullTu is a null pointer?", Module.isNullPointer(nullTu));
  });
  return 0;
}

Configure and build your project.

$ mkdir build && cd build
$ emcmake cmake -B build -Dlibclangjs-cmake_DIR=./node_modules/libclangjs-cmake
$ cmake --build build

Now, you can simply run the application.

$ node my-libclangjs-project.js
> nullTu is a null pointer? true

This example is trivial, but shows how the functionality of Libclangjs can be extended. This extension is not limited to adding a main function, but can also include the addition of bindings (using Embind) and arbitrary code.

0.5.1

8 months ago

0.5.0

9 months ago

0.4.0

10 months ago

0.3.2

1 year ago

0.3.1

1 year ago

0.3.0

1 year ago