Skip to content

Commit

Permalink
Use Qt's Resource System (2nd approach) (#1891)
Browse files Browse the repository at this point in the history
* Remove bin2res, use Qt's resource system
* Use QDir search paths and QImageReader in getIconPixmap
* Don't include "embed.cpp" in plugins
* getIconPixmap: Use QPixmapCache, use QPixmap::fromImageReader
* Require CMake 2.8.9

* Fix ReverbSC embed usage
  • Loading branch information
lukas-w committed Mar 26, 2017
1 parent abc73c0 commit 9f905bc
Show file tree
Hide file tree
Showing 88 changed files with 240 additions and 416 deletions.
13 changes: 1 addition & 12 deletions CMakeLists.txt
@@ -1,4 +1,4 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.9)

PROJECT(lmms)

Expand Down Expand Up @@ -456,17 +456,6 @@ FILE(REMOVE include/lmmsconfig.h)
FILE(GLOB LMMS_INCLUDES "${CMAKE_SOURCE_DIR}/include/*.h")
LIST(SORT LMMS_INCLUDES)

# embedded resources stuff
IF(WIN32 OR WIN64)
# compile buildtools native
SET(BIN2RES_CPP "${CMAKE_SOURCE_DIR}/buildtools/bin2res.cpp")
SET(BIN2RES "${CMAKE_BINARY_DIR}/bin2res")
ADD_CUSTOM_TARGET(bin2res COMMAND g++ "\"${BIN2RES_CPP}\"" -o "\"${BIN2RES}\"" DEPENDS "${BIN2RES_CPP}")
ELSE(WIN32 OR WIN64)
ADD_EXECUTABLE(bin2res buildtools/bin2res.cpp)
GET_TARGET_PROPERTY(BIN2RES bin2res LOCATION)
ENDIF(WIN32 OR WIN64)

# we somehow have to make LMMS-binary depend on MOC-files
ADD_FILE_DEPENDENCIES("${CMAKE_BINARY_DIR}/lmmsconfig.h")

Expand Down
212 changes: 0 additions & 212 deletions buildtools/bin2res.cpp

This file was deleted.

18 changes: 8 additions & 10 deletions cmake/modules/BuildPlugin.cmake
Expand Up @@ -3,6 +3,8 @@
# description: build LMMS-plugin
# usage: BUILD_PLUGIN(<PLUGIN_NAME> <PLUGIN_SOURCES> MOCFILES <HEADERS_FOR_MOC> EMBEDDED_RESOURCES <LIST_OF_FILES_TO_EMBED> UICFILES <UI_FILES_TO_COMPILE> LINK <SHARED|MODULE>)

INCLUDE(GenQrc)

MACRO(BUILD_PLUGIN PLUGIN_NAME)
CMAKE_PARSE_ARGUMENTS(PLUGIN "" "" "MOCFILES;EMBEDDED_RESOURCES;UICFILES;LINK" ${ARGN})
SET(PLUGIN_SOURCES ${PLUGIN_UNPARSED_ARGUMENTS})
Expand All @@ -25,11 +27,7 @@ MACRO(BUILD_PLUGIN PLUGIN_NAME)
ENDFOREACH()
SET(PLUGIN_EMBEDDED_RESOURCES ${NEW_ARGS})

SET(ER_H ${CMAKE_CURRENT_BINARY_DIR}/embedded_resources.h)
ADD_CUSTOM_COMMAND(OUTPUT ${ER_H}
COMMAND ${BIN2RES}
ARGS ${PLUGIN_EMBEDDED_RESOURCES} > ${ER_H}
DEPENDS bin2res)
ADD_GEN_QRC(RCC_OUT "${PLUGIN_NAME}.qrc" PREFIX artwork/${PLUGIN_NAME} ${PLUGIN_EMBEDDED_RESOURCES})
ENDIF(ER_LEN)

IF(QT5)
Expand All @@ -41,7 +39,7 @@ MACRO(BUILD_PLUGIN PLUGIN_NAME)
ENDIF()

FOREACH(f ${PLUGIN_SOURCES})
ADD_FILE_DEPENDENCIES(${f} ${ER_H} ${plugin_UIC_out})
ADD_FILE_DEPENDENCIES(${f} ${RCC_OUT} ${plugin_UIC_out})
ENDFOREACH(f)

IF(LMMS_BUILD_APPLE)
Expand All @@ -58,11 +56,11 @@ MACRO(BUILD_PLUGIN PLUGIN_NAME)
ENDIF()

IF ("${PLUGIN_LINK}" STREQUAL "SHARED")
ADD_LIBRARY(${PLUGIN_NAME} SHARED ${PLUGIN_SOURCES} ${plugin_MOC_out})
ADD_LIBRARY(${PLUGIN_NAME} SHARED ${PLUGIN_SOURCES} ${plugin_MOC_out} ${RCC_OUT})
ELSE ()
ADD_LIBRARY(${PLUGIN_NAME} MODULE ${PLUGIN_SOURCES} ${plugin_MOC_out})
ADD_LIBRARY(${PLUGIN_NAME} MODULE ${PLUGIN_SOURCES} ${plugin_MOC_out} ${RCC_OUT})
ENDIF ()

IF(QT5)
TARGET_LINK_LIBRARIES(${PLUGIN_NAME} Qt5::Widgets Qt5::Xml)
ENDIF()
Expand All @@ -81,6 +79,6 @@ MACRO(BUILD_PLUGIN PLUGIN_NAME)
ADD_CUSTOM_COMMAND(TARGET ${PLUGIN_NAME} POST_BUILD COMMAND ${STRIP} $<TARGET_FILE:${PLUGIN_NAME}>)
ENDIF(LMMS_BUILD_WIN32)

SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${ER_H} ${plugin_MOC_out}")
SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${RCC_OUT} ${plugin_MOC_out}")
ENDMACRO(BUILD_PLUGIN)

57 changes: 57 additions & 0 deletions cmake/modules/GenQrc.cmake
@@ -0,0 +1,57 @@
# GenQrc.cmake - Copyright (c) 2015 Lukas W <lukaswhl/at/gmail.com>

# Generates a simple qrc file containing the given resource files ${ARGN}:
# GEN_QRC(resources.qrc artwork.png icon.png PREFIX /icons)
# Files may also be added using a pattern with the GLOB keyword, e.g.:
# GEN_QRC(resources.qrc GLOB *.png)
FUNCTION(GEN_QRC OUT_FILE)
CMAKE_PARSE_ARGUMENTS(RC "" "PREFIX;GLOB" "" ${ARGN})

IF(DEFINED RC_GLOB)
FILE(GLOB GLOB_FILES ${RC_GLOB})
ENDIF()

# Set the standard prefix to "/" if none is given
IF(NOT DEFINED RC_PREFIX)
SET(RC_PREFIX "/")
ENDIF()

# We need to convert our list to a string in order to pass it to the script
# on the command line.
STRING(REPLACE ";" "\;" FILES "${RC_UNPARSED_ARGUMENTS};${GLOB_FILES}")

SET(GENQRC_SCRIPT "${CMAKE_SOURCE_DIR}/cmake/scripts/GenQrc.cmake")
ADD_CUSTOM_COMMAND(
OUTPUT ${OUT_FILE}
COMMAND ${CMAKE_COMMAND} -D OUT_FILE=${OUT_FILE} -D RC_PREFIX=${RC_PREFIX} -D FILES:list=${FILES} -D DIR=${CMAKE_CURRENT_SOURCE_DIR} -P "${GENQRC_SCRIPT}"
DEPENDS ${GENQRC_SCRIPT}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
VERBATIM
)
ENDFUNCTION()

# Generates a qrc file named ${QRC_OUT} from ${ARGN}, rccs it and returns Qt's
# output file.
# Must only be run once per CMakeLists.txt.
# Usage example:
# ADD_GEN_QRC(RCC_OUTPUT resources.qrc icon.png manual.pdf)
# ADD_EXECUTABLE(myexe main.cpp ${RCC_OUTPUT})
MACRO(ADD_GEN_QRC RCCOUT QRC_OUT)
IF(NOT IS_ABSOLUTE ${QRC_OUT})
SET(QRC_FILE "${CMAKE_CURRENT_BINARY_DIR}/${QRC_OUT}")
ELSE()
SET(QRC_FILE ${QRC_OUT})
ENDIF()

GEN_QRC(${QRC_FILE} "${ARGN}")
QT_ADD_RESOURCES(${RCCOUT} ${QRC_FILE})
ENDMACRO()


MACRO(QT_ADD_RESOURCES)
IF(QT5)
QT5_ADD_RESOURCES(${ARGN})
ELSE()
QT4_ADD_RESOURCES(${ARGN})
ENDIF()
ENDMACRO()
26 changes: 26 additions & 0 deletions cmake/scripts/GenQrc.cmake
@@ -0,0 +1,26 @@
# GenQrcScript.cmake - Copyright (c) 2015 Lukas W <lukaswhl/at/gmail.com>

INCLUDE(CMakeParseArguments)

FILE(REMOVE ${OUT_FILE})
MACRO(OUT STRING)
FILE(APPEND ${OUT_FILE} "${STRING}\n")
ENDMACRO()

IF(NOT DEFINED RC_PREFIX)
SET(RC_PREFIX "/")
ENDIF()

# Write qrc file
OUT("<RCC>")
OUT(" <qresource prefix=\"${RC_PREFIX}\">")
FOREACH(VAR ${FILES})
GET_FILENAME_COMPONENT(FILENAME ${VAR} NAME)
IF(IS_ABSOLUTE ${VAR})
OUT(" <file alias=\"${FILENAME}\">${VAR}</file>")
ELSE()
OUT(" <file alias=\"${FILENAME}\">${DIR}/${VAR}</file>")
ENDIF()
ENDFOREACH()
OUT(" </qresource>")
OUT("</RCC>")

0 comments on commit 9f905bc

Please sign in to comment.