267 lines
8.5 KiB
Markdown
267 lines
8.5 KiB
Markdown
|
# GCR_CMake
|
||
|
A CMake extension supporting the **glib-compile-resources** tool.
|
||
|
|
||
|
About
|
||
|
-----
|
||
|
|
||
|
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?
|
||
|
|
||
|
Clone
|
||
|
-----
|
||
|
|
||
|
To clone this repository, just type
|
||
|
|
||
|
```shell
|
||
|
git clone https://github.com/Makman2/GCR_CMake
|
||
|
```
|
||
|
|
||
|
Usage
|
||
|
-----
|
||
|
|
||
|
Just add the macro directory to your `CMAKE_MODULE_PATH`, include the CMake
|
||
|
file and you are ready to go.
|
||
|
|
||
|
```cmake
|
||
|
list(APPEND CMAKE_MODULE_PATH
|
||
|
${PATH_TO_GCR_CMAKE_PARENT_DIR}/GCR_CMake/macros)
|
||
|
|
||
|
include(GlibCompileResourcesSupport)
|
||
|
```
|
||
|
|
||
|
Reference
|
||
|
---------
|
||
|
|
||
|
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`
|
||
|
or `AUTO`. Anything else will default to `AUTO`.
|
||
|
|
||
|
- `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 in
|
||
|
`TARGET`.
|
||
|
|
||
|
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` flag
|
||
|
|
||
|
Compress the following file. Effectively sets the attribute *compressed* in
|
||
|
the XML file to true.
|
||
|
|
||
|
- `STRIPBLANKS` flag
|
||
|
|
||
|
Strip whitespace characters in XML files. Sets the *preprocess* attribute in
|
||
|
XML with *xml-stripblanks* (requires XMLLint).
|
||
|
|
||
|
- `TOPIXDATA` flag
|
||
|
|
||
|
Generates a pixdata ready to use in Gdk. Sets the *preprocess* attribute in
|
||
|
XML with *to-pixdata*.
|
||
|
|
||
|
Note: Using `STRIPBLANKS` and `TOPIXDATA` 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_SOURCE_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**.
|
||
|
|
||
|
Kickstart
|
||
|
---------
|
||
|
|
||
|
This is a quick start guide to provide you an easy start with this macro.
|
||
|
|
||
|
Starting with a simple example:
|
||
|
|
||
|
```cmake
|
||
|
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_CURENT_SOURCE_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.
|
||
|
|
||
|
```cmake
|
||
|
# 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:
|
||
|
|
||
|
```cmake
|
||
|
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.
|
||
|
|
||
|
```cmake
|
||
|
# 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.
|