A CMake extension supporting the glib-compile-resources tool.
Inspired from the macros for Vala that I used to build a GTK application, I came to the point where I needed resources for it. For that purpose the glib-compile-resources tool seemed to be the right choice, but the extra XML file you need to write bothered me. If I add a resource I don't want to mark it explicitly in CMake and in the XML file. So I came up with this macro that does everything for you. You just add your resource to a resource list (with eventually some attributes like compression) and invoke the resource compilation function. It generates the XML automatically for you. Quite simple, isn't it?
To clone this repository, just type
git clone https://github.com/Makman2/GCR_CMake
Just add the macro directory to your CMAKE_MODULE_PATH
, include the CMake
file and you are ready to go.
list(APPEND CMAKE_MODULE_PATH
${PATH_TO_GCR_CMAKE_PARENT_DIR}/GCR_CMake/macros)
include(GlibCompileResourcesSupport)
The resource compiling macro is quite powerful and handles as much errors as possible to make error-finding easier. The function is defined as follows:
compile_gresources(<output>
<xml_out>
[TYPE output_type]
[TARGET output_name]
[RESOURCES [resources...]]
[OPTIONS [command_line_options...]]
[PREFIX resource_prefix]
[C_PREFIX c_names_prefix]
[SOURCE_DIR resource_directory]
[COMPRESS_ALL] [NO_COMPRESS_ALL]
[STRIPBLANKS_ALL] [NO_STRIPBLANKS_ALL]
[TOPIXDATA_ALL] [NO_TOPIXDATA_ALL])
-
output
The variable name where to set the output file names. Pass this variable to a target as a dependency (i.e.
add_custom_target
). -
xml_out
The variable name where to store the output file name of the intermediately generated gresource-XML-file.
-
TYPE output_type
The resource type to generate. Valid values are
EMBED_C
,EMBED_H
,BUNDLE
orAUTO
. Anything else will default toAUTO
.-
EMBED_C
: Generate a C code file that can be compiled with your program. -
EMBED_H
: Generate a header file to include in your program. -
BUNDLE
: Generates a resource disk file to load at runtime. -
AUTO
(or anything else): Extract mode from file ending specified inTARGET
.If
TARGET
contains an invalid file or file ending not detectable, the function results in a FATAL_ERROR.Recognized file formats are: .gresource, .c, .h.
-
-
TARGET output_name
Overrides the default output file name. If not specified (and not
AUTO
-TYPE is set) the output name is resources.[type-ending]. -
RESOURCES [resources...]
The resource list to process. Each resource must be a relative path inside the source directory. Each file can be preceded with resource flags.
-
COMPRESS
flagCompress the following file. Effectively sets the attribute compressed in the XML file to true.
-
STRIPBLANKS
flagStrip whitespace characters in XML files. Sets the preprocess attribute in XML with xml-stripblanks (requires XMLLint).
-
TOPIXDATA
flagGenerates a pixdata ready to use in Gdk. Sets the preprocess attribute in XML with to-pixdata.
Note: Using
STRIPBLANKS
andTOPIXDATA
together results in a FATAL_ERROR. -
-
OPTIONS command_line_options
Extra command line arguments passed to glib_compile_resources. For example
--internal
or--manual-register
. -
PREFIX resource_prefix
Overrides the resource prefix. The resource entries get inside the XML a prefix that is prepended to each resource file and represents as a whole the resource path.
-
C_PREFIX c_names_prefix
Specifies the prefix used for the C identifiers in the code generated when EMBED_C or EMBED_H are specified for TYPE.
-
SOURCE_DIR resource_directory
The source directory where the resource files are. If not overridden, this value is set to
CMAKE_CURRENT_LIST_DIR
. -
COMPRESS_ALL, NO_COMPRESS_ALL
Overrides the
COMPRESS
flag in all resources. If COMPRESS_ALL is specified,COMPRESS
is set everywhere regardless of the specified resource flags. If NO_COMPRESS_ALL is specified, compression is deactivated in all resources.Specifying COMPRESS_ALL and NO_COMPRESS_ALL together results in a FATAL_ERROR.
-
STRIPBLANKS_ALL, NO_STRIPBLANKS_ALL
Overrides the
STRIPBLANKS
flag in all resources. If STRIPBLANKS_ALL is specified,STRIPBLANKS
is set everywhere regardless of the specified resource flags. If NO_STRIPBLANKS_ALL is specified, stripping away whitespaces is deactivated in all resources.Specifying STRIPBLANKS_ALL and NO_STRIPBLANKS_ALL together results in a FATAL_ERROR.
-
TOPIXDATA_ALL, NO_TOPIXDATA_ALL
Overrides the
TOPIXDATA
flag in all resources. If TOPIXDATA_ALL is specified,TOPIXDATA
is set everywhere regardless of the specified resource flags. If NO_TOPIXDATA_ALL is specified, converting into pixbufs is deactivated in all resources.Specifying TOPIXDATA_ALL and NO_TOPIXDATA_ALL together results in a FATAL_ERROR.
This is a quick start guide to provide you an easy start with this macro.
Starting with a simple example:
set(RESOURCE_LIST
info.txt
img/image1.jpg
img/image2.jpg
data.xml)
compile_gresources(RESOURCE_FILE
XML_OUT
TYPE BUNDLE
RESOURCES ${RESOURCE_LIST})
What does this snippet do? First it sets some resource files to pack into a
resource file. They are located in the source directory passed to CMake at
invocation (CMAKE_CURRENT_LIST_DIR
).
After that we compile the resources. Means we generate a .gresource.xml-file
(it's path is put inside the XML_OUT
variable) automatically from our
RESOURCE_LIST
and create a custom command that compiles the generated
.gresource.xml-file with the provided resources into a resource bundle. Since
no specific output file is specified via TARGET the output file is placed
into the CMAKE_CURENT_BINARY_DIR
with the name resources.gresource. The
first argument RESOURCE_FILE
is a variable that is filled with the output file
name, so with resources.gresource inside the build directory. This variable is
helpful to create makefile targets (or to process the output file differently).
So here comes a full CMakeLists.txt that creates the resources from before.
# Minimum support is guaranteed for CMake 2.8. Everything below needs to be
# tested.
cmake_minimum_required(2.8)
project(MyResourceFile)
# Include the extension module.
list(APPEND CMAKE_MODULE_PATH
${PATH_TO_GCR_CMAKE_PARENT_DIR}/GCR_CMake/macros)
include(GlibCompileResourcesSupport)
# Set the resources to bundle.
set(RESOURCE_LIST
info.txt
img/image1.jpg
img/image2.jpg
data.xml)
# Compile the resources.
compile_gresources(RESOURCE_FILE
XML_OUT
TYPE BUNDLE
RESOURCES ${RESOURCE_LIST})
# Add a custom target to the makefile. Now make builds our resource file.
# It depends on the output RESOURCE_FILE.
add_custom_target(resource ALL DEPENDS ${RESOURCE_FILE})
A nice feature of the compile_gresources
-macro is that it supports
individually setting flags on the resources. So we can extend our resource list
like that:
set(RESOURCE_LIST
info.txt
COMPRESS img/image1.jpg
COMPRESS img/image2.jpg
STRIPBLANKS data.xml)
This resource list not only simply includes the resources, it specifies also that the two images should be compressed and in data.xml the whitespaces should be removed. This resource list will include the same files but will preprocess some of them.
Very handy are the COMPRESS_ALL
, STRIPBLANKS_ALL
or TOPIXDATA_ALL
parameters (and their NO_
-equivalents). If you are too lazy to write before
every file the flag, just invoke compile_gresources
with them.
# Compile the resources. Compresses all files regardless if you specified it
# explicitly or not.
compile_gresources(RESOURCE_FILE
XML_OUT
TYPE BUNDLE
RESOURCES ${RESOURCE_LIST}
COMPRESS_ALL)
So that's a short introduction into the operating mode of the
compile-gresources
macro.