Discussion:
[CMake] configure_file - false vs "0"
James C. Sutherland
2009-08-09 16:06:28 UTC
Permalink
In my configure.h.in file I have:

#cmakedefine TEST_VAR_VALUE

In my CMakeLists.txt file I have:

configure_file( ${PROJECT_SOURCE_DIR}/src/config.h.in $
{PROJECT_SOURCE_DIR}/src/configure.h )
set( TEST_VAR_VALUE "0" )

This results in a configure.h file containing:
/* #undef TEST_VAR_VALUE */

But what I would like is:
#define TEST_VAR_VALUE 0


So basically cmake is seeing the value of TEST_VAR_VALUE as 0 and
treating it as "false" rather than a value.

Any ideas how to accomplish this?

James
Michael Wild
2009-08-09 16:20:30 UTC
Permalink
Post by James C. Sutherland
#cmakedefine TEST_VAR_VALUE
configure_file( ${PROJECT_SOURCE_DIR}/src/config.h.in $
{PROJECT_SOURCE_DIR}/src/configure.h )
set( TEST_VAR_VALUE "0" )
/* #undef TEST_VAR_VALUE */
#define TEST_VAR_VALUE 0
So basically cmake is seeing the value of TEST_VAR_VALUE as 0 and
treating it as "false" rather than a value.
Any ideas how to accomplish this?
James
Use the (undocumented) #cmakedefine01.

I already submitted a patch, and the documentation has been fixed in
CVS.

Michael
James C. Sutherland
2009-08-09 16:33:09 UTC
Permalink
Post by Michael Wild
Post by James C. Sutherland
#cmakedefine TEST_VAR_VALUE
configure_file( ${PROJECT_SOURCE_DIR}/src/config.h.in $
{PROJECT_SOURCE_DIR}/src/configure.h )
set( TEST_VAR_VALUE "0" )
/* #undef TEST_VAR_VALUE */
#define TEST_VAR_VALUE 0
So basically cmake is seeing the value of TEST_VAR_VALUE as 0 and
treating it as "false" rather than a value.
Any ideas how to accomplish this?
James
Use the (undocumented) #cmakedefine01.
I already submitted a patch, and the documentation has been fixed in
CVS.
Michael
Thanks! That did it.
James C. Sutherland
2009-08-09 16:39:58 UTC
Permalink
Post by James C. Sutherland
Post by Michael Wild
Post by James C. Sutherland
#cmakedefine TEST_VAR_VALUE
configure_file( ${PROJECT_SOURCE_DIR}/src/config.h.in $
{PROJECT_SOURCE_DIR}/src/configure.h )
set( TEST_VAR_VALUE "0" )
/* #undef TEST_VAR_VALUE */
#define TEST_VAR_VALUE 0
So basically cmake is seeing the value of TEST_VAR_VALUE as 0 and
treating it as "false" rather than a value.
Any ideas how to accomplish this?
James
Use the (undocumented) #cmakedefine01.
I already submitted a patch, and the documentation has been fixed
in CVS.
Michael
Thanks! That did it.
Okay - I spoke too soon. It gave me a partial solution.

What if I want to have something like
#define TEST_VAR_VALUE 5

In the .in file:
#cmakedefine TEST_VAR_VALUE ${TEST_VAR_VALUE}
doesn't work (for reasons mentioned above)

However,
#cmakedefine01 TEST_VAR_VALUE ${TEST_VAR_VALUE}
results in
#define TEST_VAR_VALUE 5 1
if I have
set( TEST_VAR_VALUE 5 )
in my CMakeLists.txt file.

Can I get rid of the trailing value?
Michael Wild
2009-08-09 18:21:42 UTC
Permalink
Post by James C. Sutherland
Post by James C. Sutherland
Post by Michael Wild
Post by James C. Sutherland
#cmakedefine TEST_VAR_VALUE
configure_file( ${PROJECT_SOURCE_DIR}/src/config.h.in $
{PROJECT_SOURCE_DIR}/src/configure.h )
set( TEST_VAR_VALUE "0" )
/* #undef TEST_VAR_VALUE */
#define TEST_VAR_VALUE 0
So basically cmake is seeing the value of TEST_VAR_VALUE as 0 and
treating it as "false" rather than a value.
Any ideas how to accomplish this?
James
Use the (undocumented) #cmakedefine01.
I already submitted a patch, and the documentation has been fixed
in CVS.
Michael
Thanks! That did it.
Okay - I spoke too soon. It gave me a partial solution.
What if I want to have something like
#define TEST_VAR_VALUE 5
#cmakedefine TEST_VAR_VALUE ${TEST_VAR_VALUE}
doesn't work (for reasons mentioned above)
However,
#cmakedefine01 TEST_VAR_VALUE ${TEST_VAR_VALUE}
results in
#define TEST_VAR_VALUE 5 1
if I have
set( TEST_VAR_VALUE 5 )
in my CMakeLists.txt file.
Can I get rid of the trailing value?
Aah, now I see what you want...

#define TEST_VAR_VALUE ${TEST_VAR_VALUE}

is what you want.
James C. Sutherland
2009-08-09 20:49:49 UTC
Permalink
Post by Michael Wild
Post by James C. Sutherland
Post by James C. Sutherland
Post by Michael Wild
Post by James C. Sutherland
#cmakedefine TEST_VAR_VALUE
configure_file( ${PROJECT_SOURCE_DIR}/src/config.h.in $
{PROJECT_SOURCE_DIR}/src/configure.h )
set( TEST_VAR_VALUE "0" )
/* #undef TEST_VAR_VALUE */
#define TEST_VAR_VALUE 0
So basically cmake is seeing the value of TEST_VAR_VALUE as 0
and treating it as "false" rather than a value.
Any ideas how to accomplish this?
James
Use the (undocumented) #cmakedefine01.
I already submitted a patch, and the documentation has been fixed
in CVS.
Michael
Thanks! That did it.
Okay - I spoke too soon. It gave me a partial solution.
What if I want to have something like
#define TEST_VAR_VALUE 5
#cmakedefine TEST_VAR_VALUE ${TEST_VAR_VALUE}
doesn't work (for reasons mentioned above)
However,
#cmakedefine01 TEST_VAR_VALUE ${TEST_VAR_VALUE}
results in
#define TEST_VAR_VALUE 5 1
if I have
set( TEST_VAR_VALUE 5 )
in my CMakeLists.txt file.
Can I get rid of the trailing value?
Aah, now I see what you want...
#define TEST_VAR_VALUE ${TEST_VAR_VALUE}
is what you want.
But if I do
set( TEST_VAR_VALUE 0 )
then this results in TEST_VAR_VALUE being undefined rather than having
the value of 0 as I want. If the value is anything other than zero it
works. This is what I tried to explain in my original (probably
unclear) post...
Bill Hoffman
2009-08-09 21:07:18 UTC
Permalink
Post by James C. Sutherland
Post by Michael Wild
#define TEST_VAR_VALUE ${TEST_VAR_VALUE}
is what you want.
But if I do
set( TEST_VAR_VALUE 0 )
then this results in TEST_VAR_VALUE being undefined rather than having
the value of 0 as I want. If the value is anything other than zero it
works. This is what I tried to explain in my original (probably
unclear) post...
No it won't. That is a #define not a #cmakedfine. It will always be
there.

-Bill
Mike Jackson
2009-08-09 21:13:53 UTC
Permalink
Post by James C. Sutherland
Post by Michael Wild
#define TEST_VAR_VALUE ${TEST_VAR_VALUE}
is what you want.
But if I do
 set( TEST_VAR_VALUE 0 )
then this results in TEST_VAR_VALUE being undefined rather than having the
value of 0 as I want.  If the value is anything other than zero it works.
 This is what I tried to explain in my original (probably unclear) post...
No it won't.   That is a #define not a #cmakedfine.  It will always be
there.
-Bill
You also need to set the value in the cmake file BEFORE calling the
configure_file() command. So what you really want is the following:

*.cmake file
set( TEST_VAR_VALUE 0 )
configure_file( ${PROJECT_SOURCE_DIR}/src/config.h.in
${PROJECT_SOURCE_DIR}/src/configure.h @ONLY)


and in your config.h.in you will have:
#define TEST_VAR_VALUE @TEST_VAR_VALUE@

This results in TEST_VAR_VALUE _always_ being defined in your
program. It will be defined to what ever you set it to in the *.cmake
file.
--
Mike Jackson ***@bluequartz.net
BlueQuartz Software www.bluequartz.net
Michael Wild
2009-08-09 21:10:58 UTC
Permalink
Post by James C. Sutherland
Post by Michael Wild
Post by James C. Sutherland
Post by James C. Sutherland
Post by Michael Wild
Post by James C. Sutherland
#cmakedefine TEST_VAR_VALUE
configure_file( ${PROJECT_SOURCE_DIR}/src/config.h.in $
{PROJECT_SOURCE_DIR}/src/configure.h )
set( TEST_VAR_VALUE "0" )
/* #undef TEST_VAR_VALUE */
#define TEST_VAR_VALUE 0
So basically cmake is seeing the value of TEST_VAR_VALUE as 0
and treating it as "false" rather than a value.
Any ideas how to accomplish this?
James
Use the (undocumented) #cmakedefine01.
I already submitted a patch, and the documentation has been
fixed in CVS.
Michael
Thanks! That did it.
Okay - I spoke too soon. It gave me a partial solution.
What if I want to have something like
#define TEST_VAR_VALUE 5
#cmakedefine TEST_VAR_VALUE ${TEST_VAR_VALUE}
doesn't work (for reasons mentioned above)
However,
#cmakedefine01 TEST_VAR_VALUE ${TEST_VAR_VALUE}
results in
#define TEST_VAR_VALUE 5 1
if I have
set( TEST_VAR_VALUE 5 )
in my CMakeLists.txt file.
Can I get rid of the trailing value?
Aah, now I see what you want...
#define TEST_VAR_VALUE ${TEST_VAR_VALUE}
is what you want.
But if I do
set( TEST_VAR_VALUE 0 )
then this results in TEST_VAR_VALUE being undefined rather than
having the value of 0 as I want. If the value is anything other
than zero it works. This is what I tried to explain in my original
(probably unclear) post...
$ cat CMakeLists.txt
cmake_minimum_required( VERSION 2.6 )
project( test )
set( TEST_VAR_VALUE1 0 )
set( TEST_VAR_VALUE2 1 )
set( TEST_VAR_VALUE3 "hello there" )
configure_file( config.h.in ${test_BINARY_DIR}/config.h )

$ cat config.h.in
#define TEST_VAR_VALUE1 ${TEST_VAR_VALUE1}
#define TEST_VAR_VALUE2 ${TEST_VAR_VALUE2}
#define TEST_VAR_VALUE3 ${TEST_VAR_VALUE3}

$ mkdir build && cd build && cmake ..
$ cat config.h
#define TEST_VAR_VALUE1 0
#define TEST_VAR_VALUE2 1
#define TEST_VAR_VALUE3 hello there


Which presumably is what you want... why would you think that
SET(TEST_VAR_VALUE 0) "undefines" it? For that you either use
SET(TEST_VAR_VALUE), or with newer versions of CMake you can use the
clearer UNSET(TEST_VAR_VALUE).


Michael
James C. Sutherland
2009-08-09 22:05:09 UTC
Permalink
Post by Michael Wild
Post by James C. Sutherland
Post by Michael Wild
Aah, now I see what you want...
#define TEST_VAR_VALUE ${TEST_VAR_VALUE}
is what you want.
But if I do
set( TEST_VAR_VALUE 0 )
then this results in TEST_VAR_VALUE being undefined rather than
having the value of 0 as I want. If the value is anything other
than zero it works. This is what I tried to explain in my original
(probably unclear) post...
$ cat CMakeLists.txt
cmake_minimum_required( VERSION 2.6 )
project( test )
set( TEST_VAR_VALUE1 0 )
set( TEST_VAR_VALUE2 1 )
set( TEST_VAR_VALUE3 "hello there" )
configure_file( config.h.in ${test_BINARY_DIR}/config.h )
$ cat config.h.in
#define TEST_VAR_VALUE1 ${TEST_VAR_VALUE1}
#define TEST_VAR_VALUE2 ${TEST_VAR_VALUE2}
#define TEST_VAR_VALUE3 ${TEST_VAR_VALUE3}
$ mkdir build && cd build && cmake ..
$ cat config.h
#define TEST_VAR_VALUE1 0
#define TEST_VAR_VALUE2 1
#define TEST_VAR_VALUE3 hello there
Which presumably is what you want... why would you think that
SET(TEST_VAR_VALUE 0) "undefines" it? For that you either use
SET(TEST_VAR_VALUE), or with newer versions of CMake you can use the
clearer UNSET(TEST_VAR_VALUE).
Michael
Thank you and Bill for your patience and help. Indeed, I
misunderstood the "#define" vs "#cmakedefine" in the config.h.in
file. This now works.

BTW, although I am somewhat new to build systems, I find cmake to be a
very nice tool - definitely much simpler to use than autoconf! I also
dabbled with bjam and find cmake more usable (and the fact that it
supports F90 is great).

Thanks again for the help.

Continue reading on narkive:
Loading...