Olaf Mandel
Olaf Mandel

Reputation: 827

How to add a hash character (#) to a qmake variable

I want to write a configuration file with qmake that #defines a few values. But I cannot simply create variables that contain the hash or pound character (#). Nonworking example:

lines = "/* Autogenerated: do not edit */"
if(foo): lines += "#define MYLIB_WITH_FOO 1"
else:    lines += "#define MYLIB_WITH_FOO 0"
write_file(config.h, lines)

The hash starts a comment (inside the string!), so this won't work. How to generate the proper #defines for write_file under qmake?

Upvotes: 1

Views: 498

Answers (3)

Former contributor
Former contributor

Reputation: 2576

It is usual on a C or C++ application sources to include a "config.h" header, that is generated by the buildsystem from a template (for instance "config.h.in"). This is available using autotools, and also CMake - see: configure_file(). But what about Qmake?

Here is an alternative using QMAKE_SUBSTITUTES. Another reference.

test.pro

TEMPLATE = app
QT = core
CONFIG += cmdline c++11
VERSION = 1.2.3
FOO = 1
QMAKE_SUBSTITUTES = config.h.in
SOURCES += main.cpp
DISTFILES += config.h.in

config.h.in

/* Autogenerated: do not edit */
#ifndef CONFIG_H
#define CONFIG_H

#define MYLIB_VERSION '"$$VERSION"'
#define MYLIB_BANNER '"Project version $$VERSION created with Qt $$QT_VERSION"'
#define MYLIB_WITH_FOO $$FOO

#endif // CONFIG_H

main.cpp

#include <QCoreApplication>
#include <QDebug>
#include "config.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << MYLIB_BANNER;
    if (MYLIB_WITH_FOO) {
        qDebug() << "Foo included!";
    }
    return 0;
}

Output:

Project version 1.2.3 created with Qt 5.12.5

Foo included!

Upvotes: 0

Matt
Matt

Reputation: 15081

There's a predefined variable called LITERAL_HASH specially created to deal with this problem.

If this name seems too long you can create one of your own:

H = $$LITERAL_HASH
lines = "/* Autogenerated: do not edit */"
if(foo): lines += "$${H}define MYLIB_WITH_FOO 1"
else:    lines += "$${H}define MYLIB_WITH_FOO 0"
write_file(config.h, lines)

Upvotes: 2

Olaf Mandel
Olaf Mandel

Reputation: 827

The trick is to use $$system() to create the hash character. This example works for me under Windows and Linux:

pound = $$system(printf $$system_quote(\43))
if(foo): lines += "$${pound}define MYLIB_WITH_FOO 1"
else:    lines += "$${pound}define MYLIB_WITH_FOO 0"

Upvotes: 0

Related Questions