Skip to content

Commit

Permalink
Merge pull request #1445 from mcallegari/cmakebuild
Browse files Browse the repository at this point in the history
Add cmake build support
  • Loading branch information
mcallegari committed Aug 1, 2023
2 parents 0647404 + d13ad6d commit 658ed4c
Show file tree
Hide file tree
Showing 169 changed files with 9,350 additions and 132 deletions.
77 changes: 36 additions & 41 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,15 +61,15 @@ jobs:
echo "CI_EVENT_TYPE=$(if [ 'schedule' == '${{ github.event_name }}' ]; then echo 'cron'; else echo '${{ github.event_name }}'; fi)" >> $GITHUB_ENV
echo "NPROC=$(nproc)" >> $GITHUB_ENV
echo "TASK=$(echo '${{matrix.task}}' | cut -d '-' -f 2)" >> $GITHUB_ENV
echo "QT=${QT:-$(echo '${{matrix.task}}' | cut -d '-' -f 2)}" >> $GITHUB_ENV
echo "QT_INSTALL_DIR=/opt" >> $GITHUB_ENV
echo "INSTALL_ROOT=`pwd`/install_root" >> $GITHUB_ENV
echo "BUILD_DATE=`date -u '+%Y%m%d'`" >> $GITHUB_ENV
echo "GIT_REV=`git rev-parse --short HEAD`" >> $GITHUB_ENV
- name: Set QT ENV variables (qt5)
if: ${{ endsWith( matrix.task, 'qt5') }}
run: |
echo "QT=${QT:-$(echo '${{matrix.task}}' | cut -d '-' -f 2)}" >> $GITHUB_ENV
echo "QT_INSTALL_DIR=/opt" >> $GITHUB_ENV
echo "QT_VERSION=5.14.2" >> $GITHUB_ENV
echo "QT_MODULES_INSTALL=$(echo ${QT_MODULES})" >> $GITHUB_ENV
echo "APPVERSION=`grep '^!qmlui' variables.pri | grep APPVERSION | sed 's/^.*= *//;s/ /_/g'`" >> $GITHUB_ENV
Expand All @@ -79,6 +79,8 @@ jobs:
- name: Set QT ENV variables (qt5qml)
if: ${{ endsWith( matrix.task, 'qt5qml') }}
run: |
echo "QT=${QT:-$(echo '${{matrix.task}}' | cut -d '-' -f 2)}" >> $GITHUB_ENV
echo "QT_INSTALL_DIR=/opt" >> $GITHUB_ENV
echo "QT_VERSION=5.14.2" >> $GITHUB_ENV
echo "QT_MODULES_INSTALL=$(echo ${QT_MODULES})" >> $GITHUB_ENV
echo "APPVERSION=`grep '^qmlui' variables.pri | grep APPVERSION | sed 's/^.*= *//;s/ /_/g'`" >> $GITHUB_ENV
Expand Down Expand Up @@ -251,7 +253,7 @@ jobs:
path: qlcplus-${{env.TASK}}-${{env.APPVERSION}}-${{env.BUILD_DATE}}-${{env.GIT_REV}}.AppImage

build-windows:
if: false
#if: false
runs-on: windows-latest
name: QLCplus Windows ${{matrix.task}}
strategy:
Expand Down Expand Up @@ -286,12 +288,11 @@ jobs:
echo "QT=${QT:-$(echo '${{matrix.task}}' | cut -d '-' -f 2)}" >> $GITHUB_ENV
echo "QT_VERSION=5.15.8" >> $GITHUB_ENV
echo "QT_MODULES_INSTALL=$(echo ${QT_MODULES})" >> $GITHUB_ENV
#echo "QT_INSTALL_DIR=/mingw32/qt5-static" >> $GITHUB_ENV
#source $GITHUB_ENV && echo "QTDIR=/mingw32/qt5-static" >> $GITHUB_ENV
source $GITHUB_ENV && echo "QMAKE=${QTDIR}/bin/qmake.exe" >> $GITHUB_ENV
echo "QMAKE_CC=${CC}" >> $GITHUB_ENV
echo "QMAKE_CXX=${CXX}" >> $GITHUB_ENV
echo "INSTALL_ROOT=/c/" >> $GITHUB_ENV
echo "OUTFILE=`grep 'OutFile' platforms/windows/qlcplus4Qt5.nsi | cut -d'"' -f 2`" >> $GITHUB_ENV
echo "APPVERSION=`grep '^!qmlui' variables.pri | grep APPVERSION | sed 's/^.*= *//' | cut -d ' ' -f 1`" >> $GITHUB_ENV
echo "BUILD_DATE=`date -u '+%Y%m%d'`" >> $GITHUB_ENV
echo "GIT_REV=`git rev-parse --short HEAD`" >> $GITHUB_ENV
- name: Print ENV vars
shell: bash
Expand All @@ -317,6 +318,7 @@ jobs:
unzip
mingw-w64-i686-gcc
mingw-w64-i686-gcc-libs
mingw-w64-i686-cmake
mingw-w64-i686-libmad
mingw-w64-i686-libsndfile
mingw-w64-i686-flac
Expand Down Expand Up @@ -347,66 +349,59 @@ jobs:
echo "CXX:"
which ${CXX} || true
${CXX} -v || true
echo "qmake:"
which qmake || true
qmake -v || true
echo "cmake:"
which cmake || true
cmake --version || true
pkg-config --modversion libusb-1.0
#ls -l /mingw*/bin/ || true
#ls -l /mingw*/usr/bin/ || true
#ls -l /msys*/bin/ || true
#ls -l /msys*/usr/bin/ || true
#ls -l /usr/bin/ || true
- name: Disable test units build
- name: Fix build
#if: false
shell: msys2 {0}
run: |
set MSYSTEM=MINGW32
# disable the test units, since we won't run them
sed -i -e 's/ SUBDIRS += test/#SUBDIRS += test/g' engine/engine.pro
sed -i -e 's/SUBDIRS += test/#SUBDIRS += test/g' ui/ui.pro
sed -i -e 's/ SUBDIRS += velleman/#SUBDIRS += velleman/g' plugins/plugins.pro
sed -i -e 's/ SUBDIRS += udmx/#SUBDIRS += udmx/g' plugins/plugins.pro
sed -i -e 's/ SUBDIRS += test/#SUBDIRS += test/g' plugins/artnet/artnet.pro
sed -i -e 's/SUBDIRS += test/#SUBDIRS += test/g' plugins/enttecwing/enttecwing.pro
sed -i -e 's/SUBDIRS += test/#SUBDIRS += test/g' plugins/midi/midi.pro
# disable Velleman plugin
sed -i -e 's/ add_subdirectory(velleman)/# add_subdirectory(velleman)/g' plugins/CMakeLists.txt
# fix MSYS2 system path
sed -i -e 's/$ENV{SystemDrive}\/msys64/D:\/a\/_temp\/msys64/g' platforms/windows/CMakeLists.txt
# fix project path in NSIS script
sed -i -e 's/c\:\\Qt/d:\\a\\qlcplus/g' platforms/windows/qlcplus4Qt5.nsi
- name: Configure build for Windows
shell: msys2 {0}
run: |
set MSYSTEM=MINGW32
qmake FORCECONFIG=release
mkdir build
cd build
cmake -G "Unix Makefiles" ..
- name: Build for Windows
shell: msys2 {0}
run: |
set MSYSTEM=MINGW32
cd build
make -j${NPROC}
- name: Test
if: false
shell: msys2 {0}
run: |
set MSYSTEM=MINGW32
make check
- name: Install on Windows
shell: msys2 {0}
run: |
set MSYSTEM=MINGW32
#echo 'Silently installing QLC+...'
echo "Available disk space:"
df
make INSTALL_ROOT=${INSTALL_ROOT} install
cp *.qm ${INSTALL_ROOT}
cd build
make install
cd ..
cp *.qm /c/qlcplus
- name: Build installation package
shell: msys2 {0}
run: |
set MSYSTEM=MINGW32
cd ${INSTALL_ROOT}
sed -i -e 's/Qt/projects/g' qlcplus4Qt5.nsi
cd /c/qlcplus
echo 'Creating package...'
makensis -X'SetCompressor /FINAL lzma' qlcplus4Qt5.nsi
#set CURRDATE=`date +%Y%m%d`
#mv QLC+_*.exe ${INSTALL_ROOT}/QLC+_$APPVEYOR_BUILD_VERSION.exe
mv /c/qlcplus/${{env.OUTFILE}} /d/a/qlcplus/qlcplus
- name: Store executable artifact
uses: actions/upload-artifact@v3
with:
name: QLC+-${{env.TASK}}-${{env.APPVERSION}}-${{env.BUILD_DATE}}-${{env.GIT_REV}}.exe
path: ${{env.OUTFILE}}
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,6 @@ coverage/

# Development IDEs
.vscode/

# CMake build
build/
203 changes: 203 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
cmake_minimum_required(VERSION 3.21)
project(qlcplus VERSION 4.12.8 LANGUAGES C CXX)

# Set Release build type by default
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif()

# Prevent CMake make install strips off non-standard build paths
# Refer to https://stackoverflow.com/questions/7970544/cmake-make-install-output-cant-find-shared-qt-libraries-under-redhat
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

SET(INSTALL_ROOT "/" CACHE STRING "Installation root directory")

if(UNIX)
if (APPLE)
set(iokit ON)
else()
set(udev ON)
endif()
endif()

set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Set up AUTOMOC and some sensible defaults for runtime execution
# When using Qt 6.3, you can replace the code block below with
# qt_standard_project_setup()
set(CMAKE_AUTOMOC ON)
include(GNUInstallDirs)

find_package(QT NAMES Qt5 Qt6 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS 3DCore 3DInput 3DQuick 3DQuickExtras 3DRender Gui Multimedia MultimediaWidgets Network PrintSupport Qml Quick Svg Test Widgets LinguistTools)

message("Found Qt version ${QT_VERSION_MAJOR}: ${QT_DIR}")

if(QT_VERSION_MAJOR EQUAL 5)
find_package(Qt${QT_VERSION_MAJOR} OPTIONAL_COMPONENTS Script)
endif()

find_package(PkgConfig REQUIRED)

include(./variables.cmake)
include(./coverage.cmake)

if((((QT_VERSION_MAJOR LESS 5)) AND (APPLE)))
pkg_check_modules(PORTAUDIO_2 IMPORTED_TARGET portaudio-2.0)
endif()

if(WIN32)
# Prefix all shared libraries with ''.
set(CMAKE_SHARED_LIBRARY_PREFIX "")
endif()

add_subdirectory(hotplugmonitor)
add_subdirectory(engine)
add_subdirectory(resources)
add_subdirectory(plugins)
if(qmlui)
message("Building QLC+ 5 QML UI")
add_subdirectory(qmlui)
else()
message("Building QLC+ 4 QtWidget UI")
add_subdirectory(ui)
add_subdirectory(webaccess)
add_subdirectory(main)
add_subdirectory(fixtureeditor)
endif()
if(APPLE AND NOT qmlui)
add_subdirectory(launcher)
endif()

# Unit testing thru "make check"
if(qmlui)
if(WIN32)
add_custom_target(unittests
COMMAND unittest_cmake.bat "qmlui" ${CMAKE_CURRENT_BINARY_DIR}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
else()
add_custom_target(unittests
COMMAND ./unittest_cmake.sh "qmlui" ${CMAKE_CURRENT_BINARY_DIR}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
endif()
else()
if(WIN32)
add_custom_target(unittests
COMMAND unittest_cmake.bat "ui" ${CMAKE_CURRENT_BINARY_DIR}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
else()
add_custom_target(unittests
COMMAND ./unittest_cmake.sh "ui" ${CMAKE_CURRENT_BINARY_DIR}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
endif()
endif()

add_custom_target(check
DEPENDS unittests
)

# Unit test coverage measurement
if(WIN32)
add_custom_target(coverage
COMMAND @echo Get a better OS.
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
else()
if(qmlui)
add_custom_target(coverage
COMMAND ./coverage_cmake.sh "qmlui"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
else()
add_custom_target(coverage
COMMAND ./coverage_cmake.sh "ui"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
endif()
endif()

add_custom_target(lcov
DEPENDS coverage
)

# Translations
if (qmlui)
add_custom_target(translations ALL
COMMAND ./translate.sh "qmlui"
COMMENT "Translating qmlui translations..."
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
else ()
add_custom_target(translations ALL
COMMAND ./translate.sh "ui"
COMMENT "Translating ui translations..."
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
endif()

## Add the generated qm files to the list
file(GLOB translations_qm_files "${CMAKE_CURRENT_SOURCE_DIR}/*.qm")

## Install the qm files
if (appimage)
set(translations_install_path "${TARGET_DIR}/${INSTALLROOT}/${TRANSLATIONDIR}")
else ()
set(translations_install_path "${INSTALLROOT}/${TRANSLATIONDIR}")
endif()

install(FILES ${translations_qm_files} DESTINATION ${translations_install_path})

## Clean the generated files
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_CURRENT_BINARY_DIR}/*.qm")

# run
if(UNIX)
if(qmlui)
add_custom_target(run
COMMAND ${CMAKE_COMMAND} -E env LD_LIBRARY_PATH=engine/src:$ENV{LD_LIBRARY_PATH} qmlui/qlcplus-qml
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
else()
add_custom_target(run
COMMAND ${CMAKE_COMMAND} -E env LD_LIBRARY_PATH=engine/src:ui/src:webaccess/src:$ENV{LD_LIBRARY_PATH} main/qlcplus
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
endif()
endif()

# run-fxe
if(UNIX AND NOT qmlui)
add_custom_target(run-fxe
COMMAND ${CMAKE_COMMAND} -E env LD_LIBRARY_PATH=engine/src:ui/src:webaccess/src:$ENV{LD_LIBRARY_PATH} ./fixtureeditor/qlcplus-fixtureeditor
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
endif()

# doxygen
if(UNIX)
add_custom_target(doxygen
COMMAND cd resources/doxygen && rm -rf html/ && doxygen qlcplus.dox
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
endif()

# uninstall target
if(NOT TARGET uninstall)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)

add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()

SET(CPACK_GENERATOR "DEB")
set(CPACK_PACKAGE_NAME "qlcplus")
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "Massimo Callegari") #required
INCLUDE(CPack)

# Leave this on the last row of this file
add_subdirectory(platforms)
21 changes: 21 additions & 0 deletions cmake_uninstall.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
if(NOT EXISTS "@CMAKE_BINARY_DIR@/install_manifest.txt")
message(FATAL_ERROR "Cannot find install manifest: @CMAKE_BINARY_DIR@/install_manifest.txt")
endif()

file(READ "@CMAKE_BINARY_DIR@/install_manifest.txt" files)
string(REGEX REPLACE "\n" ";" files "${files}")
foreach(file ${files})
message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
exec_program(
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
OUTPUT_VARIABLE rm_out
RETURN_VALUE rm_retval
)
if(NOT "${rm_retval}" STREQUAL 0)
message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
endif()
else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
endif()
endforeach()
6 changes: 6 additions & 0 deletions coverage.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
if(coverage)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov")
file(GLOB_RECURSE gcov_files "${CMAKE_BINARY_DIR}/*.gcno" "${CMAKE_BINARY_DIR}/*.gcda")
set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${gcov_files})
endif()

0 comments on commit 658ed4c

Please sign in to comment.