Adds cmake build support

This commit is contained in:
Atul R 2019-09-18 21:17:48 +02:00
parent 60f3f7e9de
commit 75e8140318
11 changed files with 157 additions and 307 deletions

View File

@ -1,17 +1,19 @@
cmake_minimum_required(VERSION 3.1)
set(CMAKE_BUILD_PARALLEL_LEVEL 8)
if(${CMAKE_VERSION} VERSION_LESS 3.15)
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
else()
cmake_policy(VERSION 3.15)
endif()
if(${CMAKE_VERSION} VERSION_LESS "3.7.0")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
endif()
project(NodeGUI
VERSION 1.0
)
set(ADDON_NAME "qtnode")
set(ADDON_NAME "qtnode")
# ---------------------------------------
add_library(${ADDON_NAME} SHARED
@ -57,6 +59,7 @@ add_library(${ADDON_NAME} SHARED
"${PROJECT_SOURCE_DIR}/src/cpp/QtWidgets/QCheckBox/qcheckbox_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/QtWidgets/QProgressBar/qprogressbar_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/QtWidgets/QRadioButton/qradiobutton_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/QtWidgets/QTabWidget/qtabwidget_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/QtWidgets/QLineEdit/qlineedit_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp"
"${PROJECT_SOURCE_DIR}/src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.cpp"
@ -76,115 +79,23 @@ add_library(${ADDON_NAME} SHARED
"${PROJECT_SOURCE_DIR}/src/cpp/autogen/nscrollarea_moc.cpp"
)
# NAPI stuff
execute_process(COMMAND node -p "require('node-addon-api').include"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE NODE_ADDON_API_DIR
)
string(REPLACE "\n" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR})
string(REPLACE "\"" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR})
# common
include(./config/common.cmake)
AddCommonConfig(${ADDON_NAME})
# qt
include(./config/qt.cmake)
AddQtSupport(${ADDON_NAME})
# napi
include(./config/napi.cmake)
AddNapiSupport(${ADDON_NAME})
# qt stuff
execute_process(COMMAND node -p "require('@nodegui/qode').qtHome"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE QT_HOME_DIR
)
string(REPLACE "\n" "" QT_HOME_DIR "${QT_HOME_DIR}")
string(REPLACE "\"" "" QT_HOME_DIR "${QT_HOME_DIR}")
if (APPLE)
# function(createSymlinks)
# message("Creating qt symlinks")
# execute_process(
# COMMAND 'mkdir -p ${QT_HOME_DIR}/include'
# COMMAND 'ln -sfn ${QT_HOME_DIR}/lib/QtCore.framework/Versions/5/Headers ${QT_HOME_DIR}/include/QtCore'
# COMMAND 'ln -sfn ${QT_HOME_DIR}/lib/QtGui.framework/Versions/5/Headers ${QT_HOME_DIR}/include/QtGui'
# COMMAND 'ln -sfn ${QT_HOME_DIR}/lib/QtWidgets.framework/Versions/5/Headers ${QT_HOME_DIR}/include/QtWidgets'
# WORKING_DIRECTORY ${QT_HOME_DIR}
# )
# endfunction()
# createSymlinks()
target_include_directories(${ADDON_NAME} PRIVATE
"${QT_HOME_DIR}/include"
"${QT_HOME_DIR}/lib/QtCore.framework/Versions/5/Headers"
"${QT_HOME_DIR}/lib/QtGui.framework/Versions/5/Headers"
"${QT_HOME_DIR}/lib/QtWidgets.framework/Versions/5/Headers"
)
target_link_libraries(${ADDON_NAME} PRIVATE
"${QT_HOME_DIR}/lib/QtCore.framework/Versions/5/QtCore"
"${QT_HOME_DIR}/lib/QtGui.framework/Versions/5/QtGui"
"${QT_HOME_DIR}/lib/QtWidgets.framework/Versions/5/QtWidgets"
)
endif()
if (WIN32)
target_include_directories(${ADDON_NAME} PRIVATE
"${QT_HOME_DIR}\\include"
"${QT_HOME_DIR}\\include\\QtCore"
"${QT_HOME_DIR}\\include\\QtGui"
"${QT_HOME_DIR}\\include\\QtWidgets"
)
target_link_libraries(${ADDON_NAME} PRIVATE
"${QT_HOME_DIR}\\lib\\Qt5Core.lib"
"${QT_HOME_DIR}\\lib\\Qt5Gui.lib"
"${QT_HOME_DIR}\\lib\\Qt5Widgets.lib"
)
endif()
if(UNIX AND NOT APPLE)
set(LINUX TRUE)
endif()
if(LINUX)
target_include_directories(${ADDON_NAME} PRIVATE
"${QT_HOME_DIR}/include"
"${QT_HOME_DIR}/include/QtCore"
"${QT_HOME_DIR}/include/QtGui"
"${QT_HOME_DIR}/include/QtWidgets"
)
target_link_libraries(${ADDON_NAME} PRIVATE
"${QT_HOME_DIR}/lib/libQt5Core.so"
"${QT_HOME_DIR}/lib/libQt5Gui.so"
"${QT_HOME_DIR}/lib/libQt5Widgets.so"
)
endif()
# Continue
set_target_properties(${ADDON_NAME} PROPERTIES PREFIX "" SUFFIX ".node")
target_include_directories(${ADDON_NAME} PRIVATE
"${CMAKE_JS_INC}"
"${NODE_ADDON_API_DIR}"
"${PROJECT_SOURCE_DIR}"
"${PROJECT_SOURCE_DIR}/deps"
)
target_compile_definitions(${ADDON_NAME} PRIVATE
NAPI_CPP_EXCEPTIONS
SPDLOG_COMPILED_LIB
)
if (WIN32)
target_compile_definitions(${ADDON_NAME} PRIVATE
_HAS_EXCEPTIONS=1
ENUM_BITFIELDS_NOT_SUPPORTED
)
endif()
target_compile_features(${ADDON_NAME} PRIVATE
cxx_std_14
)
target_link_libraries(${ADDON_NAME} PRIVATE
"${CMAKE_JS_LIB}"
)
"${CMAKE_JS_LIB}"
)

View File

@ -1,16 +0,0 @@
{
"includes": [],
"targets": [
{
"target_name": "qtnode",
'include_dirs': ['.', './deps/'],
"includes": [
"./config/application.gypi",
"./config/moc.gypi",
"./config/common.gypi",
"./config/qt.gypi",
"./config/deps.gypi",
],
},
]
}

View File

@ -1,36 +0,0 @@
{
"sources": [
"../src/cpp/main.cpp",
# non wrapped
"../src/cpp/Extras/Utils/nutils.cpp",
"../src/cpp/core/FlexLayout/flexlayout.cpp",
"../src/cpp/core/FlexLayout/flexitem.cpp",
"../src/cpp/core/YogaWidget/nodestyle.cpp",
"../src/cpp/core/Events/eventsmap.cpp",
"../src/cpp/core/Events/eventwidget.cpp",
"../src/cpp/core/YogaWidget/yogawidget.cpp",
# wrapped cpps. Move non wrapped ones to shared gypi
"../src/cpp/QtGui/QApplication/qapplication_wrap.cpp",
"../src/cpp/QtGui/QClipboard/qclipboard_wrap.cpp",
"../src/cpp/QtGui/QEvent/QKeyEvent/qkeyevent_wrap.cpp",
"../src/cpp/QtGui/QPixmap/qpixmap_wrap.cpp",
"../src/cpp/QtGui/QIcon/qicon_wrap.cpp",
"../src/cpp/QtGui/QCursor/qcursor_wrap.cpp",
'../src/cpp/core/FlexLayout/flexlayout_wrap.cpp',
"../src/cpp/QtWidgets/QWidget/qwidget_wrap.cpp",
"../src/cpp/QtWidgets/QGridLayout/qgridlayout_wrap.cpp",
"../src/cpp/QtWidgets/QDial/qdial_wrap.cpp",
"../src/cpp/QtWidgets/QLabel/qlabel_wrap.cpp",
"../src/cpp/QtWidgets/QLayout/qlayout_wrap.cpp",
"../src/cpp/QtWidgets/QMainWindow/qmainwindow_wrap.cpp",
"../src/cpp/QtWidgets/QPushButton/qpushbutton_wrap.cpp",
"../src/cpp/QtWidgets/QSpinBox/qspinbox_wrap.cpp",
"../src/cpp/QtWidgets/QCheckBox/qcheckbox_wrap.cpp",
"../src/cpp/QtWidgets/QProgressBar/qprogressbar_wrap.cpp",
"../src/cpp/QtWidgets/QRadioButton/qradiobutton_wrap.cpp",
"../src/cpp/QtWidgets/QTabWidget/qtabwidget_wrap.cpp",
"../src/cpp/QtWidgets/QLineEdit/qlineedit_wrap.cpp",
"../src/cpp/QtWidgets/QPlainTextEdit/qplaintextedit_wrap.cpp",
"../src/cpp/QtWidgets/QScrollArea/qscrollarea_wrap.cpp"
],
}

13
config/common.cmake Normal file
View File

@ -0,0 +1,13 @@
function(AddCommonConfig addonName)
target_compile_definitions(${addonName} PRIVATE
SPDLOG_COMPILED_LIB
)
target_compile_features(${addonName} PRIVATE
cxx_std_14
)
if (WIN32)
target_compile_definitions(${addonName} PRIVATE
ENUM_BITFIELDS_NOT_SUPPORTED
)
endif()
endfunction(AddCommonConfig addonName)

View File

@ -1,48 +0,0 @@
{
'cflags!': ['-fno-exceptions'],
'cflags_cc!': ['-fno-exceptions'],
'sources': [],
'includes': [],
'include_dirs': [
"<!@(node -p \"require('node-addon-api').include\")",
'..',
'../deps/',
],
'dependencies': [
"<!(node -p \"require('node-addon-api').gyp\")",
],
'defines': ['NAPI_CPP_EXCEPTIONS'],
'target_conditions': [
['OS=="mac"', {
'cflags+': ['-fvisibility=hidden'],
'xcode_settings': {
'GCC_SYMBOLS_PRIVATE_EXTERN': 'YES', # -fvisibility=hidden
'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
'CLANG_CXX_LIBRARY': 'libc++',
'MACOSX_DEPLOYMENT_TARGET': '10.7',
'OTHER_CFLAGS': ['-std=c++14'],
'OTHER_LDFLAGS': ['-Wl,-rpath,@loader_path'],
},
}],
['OS=="linux"', {
'cflags': [
'-fPIC'
],
}],
['OS=="win"', {
'msvs_settings': {
'VCCLCompilerTool': {
'ExceptionHandling': 1,
'AdditionalOptions': [
'/GR-',
'/MT',
'/EHsc'
]
},
},
"defines": [
"_HAS_EXCEPTIONS=1",
],
}],
],
}

View File

@ -1,33 +0,0 @@
{
# "targets": [
# {
# "target_name": "nodeguidep",
# 'type': 'shared_library',
"include_dirs": ['../deps/'],
"sources": [
"../deps/yoga/log.cpp",
"../deps/yoga/Utils.cpp",
"../deps/yoga/YGConfig.cpp",
"../deps/yoga/YGEnums.cpp",
"../deps/yoga/YGLayout.cpp",
"../deps/yoga/YGNode.cpp",
"../deps/yoga/YGNodePrint.cpp",
"../deps/yoga/YGStyle.cpp",
"../deps/yoga/YGValue.cpp",
"../deps/yoga/Yoga.cpp",
"../deps/yoga/event/event.cpp",
"../deps/yoga/internal/experiments.cpp",
],
'defines': [
'SPDLOG_COMPILED_LIB'
],
'conditions': [
['OS=="win"', {
'defines': [
'ENUM_BITFIELDS_NOT_SUPPORTED', # Needed for yoga to work nicely on windows
],
}]
],
# }
# ]
}

27
config/napi.cmake Normal file
View File

@ -0,0 +1,27 @@
# NAPI stuff
function(AddNapiSupport addonName)
execute_process(COMMAND node -p "require('node-addon-api').include"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE NODE_ADDON_API_DIR
)
string(REPLACE "\n" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR})
string(REPLACE "\"" "" NODE_ADDON_API_DIR ${NODE_ADDON_API_DIR})
set_target_properties(${addonName} PROPERTIES PREFIX "" SUFFIX ".node")
target_include_directories(${addonName} PRIVATE
"${NODE_ADDON_API_DIR}"
)
target_compile_definitions(${addonName} PRIVATE
NAPI_CPP_EXCEPTIONS
)
if (WIN32)
target_compile_definitions(${addonName} PRIVATE
_HAS_EXCEPTIONS=1
)
endif()
endfunction(AddNapiSupport addonName)

70
config/qt.cmake Normal file
View File

@ -0,0 +1,70 @@
# Adds Qt support
function(AddQtSupport addonName)
execute_process(COMMAND node -p "require('@nodegui/qode').qtHome"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE QT_HOME_DIR
)
string(REPLACE "\n" "" QT_HOME_DIR "${QT_HOME_DIR}")
string(REPLACE "\"" "" QT_HOME_DIR "${QT_HOME_DIR}")
if (APPLE)
# createQtMacSymlinks()
target_include_directories(${addonName} PRIVATE
"${QT_HOME_DIR}/include"
"${QT_HOME_DIR}/lib/QtCore.framework/Versions/5/Headers"
"${QT_HOME_DIR}/lib/QtGui.framework/Versions/5/Headers"
"${QT_HOME_DIR}/lib/QtWidgets.framework/Versions/5/Headers"
)
target_link_libraries(${addonName} PRIVATE
"${QT_HOME_DIR}/lib/QtCore.framework/Versions/5/QtCore"
"${QT_HOME_DIR}/lib/QtGui.framework/Versions/5/QtGui"
"${QT_HOME_DIR}/lib/QtWidgets.framework/Versions/5/QtWidgets"
)
endif()
if (WIN32)
target_include_directories(${addonName} PRIVATE
"${QT_HOME_DIR}\\include"
"${QT_HOME_DIR}\\include\\QtCore"
"${QT_HOME_DIR}\\include\\QtGui"
"${QT_HOME_DIR}\\include\\QtWidgets"
)
target_link_libraries(${addonName} PRIVATE
"${QT_HOME_DIR}\\lib\\Qt5Core.lib"
"${QT_HOME_DIR}\\lib\\Qt5Gui.lib"
"${QT_HOME_DIR}\\lib\\Qt5Widgets.lib"
)
endif()
if(UNIX AND NOT APPLE)
set(LINUX TRUE)
endif()
if(LINUX)
target_include_directories(${addonName} PRIVATE
"${QT_HOME_DIR}/include"
"${QT_HOME_DIR}/include/QtCore"
"${QT_HOME_DIR}/include/QtGui"
"${QT_HOME_DIR}/include/QtWidgets"
)
target_link_libraries(${addonName} PRIVATE
"${QT_HOME_DIR}/lib/libQt5Core.so"
"${QT_HOME_DIR}/lib/libQt5Gui.so"
"${QT_HOME_DIR}/lib/libQt5Widgets.so"
)
endif()
endfunction(AddQtSupport addonName)
# function(createQtMacSymlinks)
# message("Creating qt symlinks")
# execute_process(
# COMMAND 'mkdir -p ${QT_HOME_DIR}/include'
# COMMAND 'ln -sfn ${QT_HOME_DIR}/lib/QtCore.framework/Versions/5/Headers ${QT_HOME_DIR}/include/QtCore'
# COMMAND 'ln -sfn ${QT_HOME_DIR}/lib/QtGui.framework/Versions/5/Headers ${QT_HOME_DIR}/include/QtGui'
# COMMAND 'ln -sfn ${QT_HOME_DIR}/lib/QtWidgets.framework/Versions/5/Headers ${QT_HOME_DIR}/include/QtWidgets'
# WORKING_DIRECTORY ${QT_HOME_DIR}
# )
# endfunction()

View File

@ -1,64 +0,0 @@
{
'variables': {
'qt_home_dir%': "<!(node -p \"require('@nodegui/qode').qtHome\")",
},
'target_conditions': [
['OS=="mac"', {
'actions': [
{
'action_name': 'symlink_qt_headers',
'inputs': [],
'outputs': [
'<(qt_home_dir)/include/QtCore',
'<(qt_home_dir)/include/QtGui',
'<(qt_home_dir)/include/QtWidgets',
],
'action': [
'sh', '-c',
'mkdir -p <(qt_home_dir)/include && \
ln -sfn <(qt_home_dir)/lib/QtCore.framework/Versions/5/Headers <(qt_home_dir)/include/QtCore && \
ln -sfn <(qt_home_dir)/lib/QtGui.framework/Versions/5/Headers <(qt_home_dir)/include/QtGui && \
ln -sfn <(qt_home_dir)/lib/QtWidgets.framework/Versions/5/Headers <(qt_home_dir)/include/QtWidgets'
],
}
],
'include_dirs': [
'<(qt_home_dir)/include',
'<(qt_home_dir)/lib/QtCore.framework/Versions/5/Headers',
'<(qt_home_dir)/lib/QtGui.framework/Versions/5/Headers',
'<(qt_home_dir)/lib/QtWidgets.framework/Versions/5/Headers',
],
'libraries': [
'<(qt_home_dir)/lib/QtCore.framework/Versions/5/QtCore',
'<(qt_home_dir)/lib/QtGui.framework/Versions/5/QtGui',
'<(qt_home_dir)/lib/QtWidgets.framework/Versions/5/QtWidgets',
],
}],
['OS=="linux"', {
'include_dirs': [
'<(qt_home_dir)/include',
'<(qt_home_dir)/include/QtCore',
'<(qt_home_dir)/include/QtGui',
'<(qt_home_dir)/include/QtWidgets',
],
'libraries': [
'<(qt_home_dir)/lib/libQt5Core.so',
'<(qt_home_dir)/lib/libQt5Gui.so',
'<(qt_home_dir)/lib/libQt5Widgets.so',
],
}],
['OS=="win"', {
'include_dirs': [
'<(qt_home_dir)\\include',
'<(qt_home_dir)\\include\\QtCore',
'<(qt_home_dir)\\include\\QtGui',
'<(qt_home_dir)\\include\\QtWidgets',
],
'libraries': [
'<(qt_home_dir)\\lib\\Qt5Core.lib',
'<(qt_home_dir)\\lib\\Qt5Gui.lib',
'<(qt_home_dir)\\lib\\Qt5Widgets.lib',
]
}],
],
}

28
package-lock.json generated
View File

@ -607,6 +607,34 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"cross-env": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.0.tgz",
"integrity": "sha512-G/B6gtkjgthT8AP/xN1wdj5Xe18fVyk58JepK8GxpUbqcz3hyWxegocMbvnZK+KoTslwd0ACZ3woi/DVUdVjyQ==",
"dev": true,
"requires": {
"cross-spawn": "^7.0.0"
},
"dependencies": {
"cross-spawn": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.0.tgz",
"integrity": "sha512-6U/8SMK2FBNnB21oQ4+6Nsodxanw1gTkntYA2zBdkFYFu3ZDx65P2ONEXGSvob/QS6REjVHQ9zxzdOafwFdstw==",
"dev": true,
"requires": {
"path-key": "^3.1.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
}
},
"path-key": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
"integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==",
"dev": true
}
}
},
"cross-spawn": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",

View File

@ -20,12 +20,9 @@
"install": "npm -v",
"postinstall": "npm run build:addon",
"build": "tsc && npm run build:addon",
"build:addon": "node-gyp -j 8 configure build",
"rebuild:addon": "node-gyp -j 8 rebuild",
"build:addon": "cross-env CMAKE_BUILD_PARALLEL_LEVEL=8 cmake-js compile",
"automoc": "node ./scripts/automoc.js",
"docs": "serve docs",
"build:cmake": "cmake-js compile",
"dev:cmake": "tsc && qode dist/demo.js"
"docs": "serve docs"
},
"dependencies": {
"@nodegui/qode": "^1.0.5",
@ -38,6 +35,7 @@
"devDependencies": {
"@types/bindings": "^1.3.0",
"@types/node": "^12.0.2",
"cross-env": "^6.0.0",
"prettier": "^1.17.1",
"serve": "^11.1.0",
"typescript": "^3.4.5"