blob: 3f796fabfca11dcec853d3bb9a2b9e94991ef82e [file] [log] [blame]
cmake_minimum_required(VERSION 3.1)
find_package(Nodejs REQUIRED)
find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})
include_directories(
${NODEJS_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/..
${CMAKE_SOURCE_DIR}/src
)
set(V8_VERSION_HEX 0x0${V8_VERSION_MAJOR}${V8_VERSION_MINOR}${V8_VERSION_PATCH})
string(LENGTH "${V8_VERSION_HEX}" V8_VERSION_HEX_length)
while(V8_VERSION_HEX_length LESS 8)
set(V8_VERSION_HEX "${V8_VERSION_HEX}0")
message(DEBUG " - Padded V8 version to match SWIG format")
string(LENGTH "${V8_VERSION_HEX}" V8_VERSION_HEX_length)
endwhile()
set_property(SOURCE ${CMAKE_SOURCE_DIR}/swig/javascript/libyang_javascript.i PROPERTY SWIG_FLAGS "-node" "-I${CMAKE_BINARY_DIR}/src" "-DV8_VERSION=${V8_VERSION_HEX}")
set_source_files_properties(${CMAKE_SOURCE_DIR}/swig/javascript/libyang_javascript.i PROPERTIES CPLUSPLUS ON)
swig_add_module(libyang_javascript javascript ${CMAKE_SOURCE_DIR}/swig/javascript/libyang_javascript.i ${libsrc} ${PCRE_INCLUDE_DIRS} )
# link math
swig_link_libraries(libyang_javascript m)
# find pthreads
swig_link_libraries(libyang_javascript ${CMAKE_THREAD_LIBS_INIT})
# find PCRE library
swig_link_libraries(libyang_javascript ${PCRE_LIBRARIES})
set_target_properties(libyang_javascript PROPERTIES
COMPILE_FLAGS " -DJAVASCRIPT_BINDING=ON"
PREFIX ""
OUTPUT_NAME libyang_javascript
SUFFIX ".node"
)
function(PREPEND var prefix)
set(listVar "")
foreach(f ${ARGN})
list(APPEND listVar "${prefix}/${f}")
endforeach(f)
set(${var} "${listVar}" PARENT_SCOPE)
endfunction(PREPEND)
message(INFO " - swig Version ${SWIG_VERSION}")
message(INFO " - CXX compiler Version ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
if(${V8_VERSION_MAJOR} GREATER 3)
message(INFO " - Using V8 version > 3 so requiring C++11 compiler")
if(CMAKE_VERSION VERSION_LESS "3.1")
message(INFO " - **WARNING** Need to use CMAKE version 3.1+, but it is ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
message(INFO " - So a workaround will be used.")
if(CMAKE_COMPILER_IS_GNUCXX)
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7")
message(FATAL_ERROR " FATAL ERROR: GNU gcc compiler is also too old (need 4.7+, but ${CMAKE_CXX_COMPILER_VERSION}) and does not support C++11 standard.")
endif()
set(LIBYANG_CXX11_WORKAROUND_OPTION "-std=gnu++11")
else()
set(LIBYANG_CXX11_WORKAROUND_OPTION "-std=c++11")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LIBYANG_CXX11_WORKAROUND_OPTION} ")
endif()
endif()
macro (libyang_CREATE_INSTALL_PACKAGE_JSON generated_file install_location)
configure_file(${CMAKE_SOURCE_DIR}/swig/javascript/${generated_file}.cmake ${CMAKE_CURRENT_BINARY_DIR}/${generated_file} @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${generated_file} DESTINATION ${install_location})
endmacro (libyang_CREATE_INSTALL_PACKAGE_JSON)
libyang_create_install_package_json(package.json lib/node_modules/libyang)
macro (libyang_CREATE_BINDING_GYP generated_file)
set(libyang_LIB_SRCS_GYP "")
#set(libyang_NPM_SRCS ${libsrc})
PREPEND(libyang_NPM_SRCS ${PROJECT_SOURCE_DIR} ${libsrc})
foreach(srcfile ${libyang_NPM_SRCS})
file(RELATIVE_PATH rel ${CMAKE_CURRENT_SOURCE_DIR} ${srcfile})
set(libyang_LIB_SRCS_GYP "'${rel}',\n${libyang_LIB_SRCS_GYP}")
endforeach(srcfile)
PREPEND(libyang_NPM_LIBS ${PROJECT_SOURCE_DIR} "${PCRE_LIBRARIES}")
foreach(srcfile ${libyang_NPM_LIBS})
file(RELATIVE_PATH rel ${CMAKE_CURRENT_SOURCE_DIR} ${srcfile})
set(libyang_LIB_THIRD_PARTY_GYP "'-L/${rel}',\n${libyang_LIB_THIRD_PARTY_GYP}")
endforeach(srcfile)
PREPEND(libyang_LIB_INCLUDE_DIRS ${PROJECT_SOURCE_DIR} ${PCRE_LIBRARIES})
PREPEND(${libyang_LIB_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR} ${PCRE_INCLUDE_DIRS})
foreach(includedir ${libyang_LIB_INCLUDE_DIRS})
file(RELATIVE_PATH rel ${CMAKE_SOURCE_DIR} ${includedir})
set(libyang_LIB_INCLUDE_DIRS_GYP "'${rel}',\n${libyang_LIB_INCLUDE_DIRS_GYP}")
endforeach(includedir)
configure_file(${CMAKE_SOURCE_DIR}/swig/javascript/${generated_file}.cmake ${CMAKE_CURRENT_BINARY_DIR}/${generated_file} @ONLY)
endmacro (libyang_CREATE_BINDING_GYP)
libyang_create_binding_gyp(binding.gyp)
set(SWIG_DEST "javascript")
file(COPY "${CMAKE_SOURCE_DIR}/src" DESTINATION ${SWIG_DEST})
file(COPY "${CMAKE_SOURCE_DIR}/models" DESTINATION ${SWIG_DEST})
file(COPY "${CMAKE_SOURCE_DIR}/swig/javascript/test/files" DESTINATION "${SWIG_DEST}/test")
configure_file("${CMAKE_SOURCE_DIR}/swig/javascript/test/yang.js" "${SWIG_DEST}/test/yang.js" ESCAPE_QUOTES @ONLY)
add_custom_target(npmpkg ALL
COMMENT "start building node package"
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/libyang_javascriptJAVASCRIPT_wrap.cxx "${SWIG_DEST}/src/"
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/package.json ${SWIG_DEST}
COMMAND sed -i "'s/libyang.node/build\\/Release\\/libyang.node/'" ${SWIG_DEST}/package.json
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/binding.gyp ${SWIG_DEST}
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/libyang_javascript.node ${SWIG_DEST})
add_dependencies (npmpkg libyang_javascript)