[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-buildsystem
Subject: config.h.cmake issue ?
From: ralf.habacker () freenet ! de (Ralf Habacker)
Date: 2006-05-03 13:32:44
Message-ID: 4458B0FC.4010504 () freenet ! de
[Download RAW message or body]
Hi all,
in recent cmake releases it is required to setup two places in case C defines are \
required. One place is the ...h.cmake and one the related CMakeLists.txt or \
Find...cmake module. One example:
in kdelibs/kjs/CMakeLists.txt there is:
macro_optional_find_package(PCRE)
if(PCRE_FOUND)
set(HAVE_PCREPOSIX 1)
else(PCRE_FOUND)
set(HAVE_PCREPOSIX 0)
endif(PCRE_FOUND)
# Generate global.h
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/global.h.cmake \
${CMAKE_CURRENT_BINARY_DIR}/global.h )
in kdelibs/kjs/global.h.cmake there is
#cmakedefine HAVE_PTHREAD_ATTR_GET_NP 1
#cmakedefine HAVE_PTHREAD_GETATTR_NP 1
#cmakedefine HAVE_PCREPOSIX 1
The problem is that if someone forgets to add this constants the resulting errors are \
hards to detect. Another example I encountered was the preparation of the \
CMakeLists.txt for a dbus test build. I took the config.h.cmake from kdecore and \
added it to the dbus sources. Now I had to disable all not required #cmakedefine by \
hand, which wasn't very easy to detect. And if I had forgotten one, this was only \
detected by an compiler error, so this ends up in an iterative process until i had \
fixed this area.
Now imagine there is an developer, who adds stuff to a package which uses cmake and \
it new to cmake. He adds and Find....cmake from another package and is thinking, \
thats all, but unfortunally he had to add the #cmakedefine by hand, which will be \
probably forgotten after a time not working with the build system.
In scons/bksys or the successor waf I think there is a better way for this. See the \
below mentioned example.
# create a config instance
conf = Configure.Configure()
# add config define by hand
conf.addDefine('HAVE_MY_DEFINE',1)
#check one header an set default define ('HAVE_TEST_H') in internal array if test.h \
found conf.checkHeader('test.h')
#check one header and set HAVE_SPECIFIC_TEST_H in internal array if test.h found
conf.checkHeader('test.h','HAVE_SPECIFIC_TEST_H')
#check for library z using function compress and an set HAVE_COMPRESS in internal \
array if library was found conf.checkLibrary('z','compress','HAVE_COMPRESS')
# write all HAVE_ defines since config instance creating into config.h
conf.writeConfigHeader('config.h')
Because I'm not very deeply knowledged about cmake internals I don't
know who such a support should be implemented best, but maybe by using a
second parameter in macro_optional_find_package()
macro_optional_find_package(PCRE,HAVE_PCREPOSIX)
or similar functions
Then configure_file(${CMAKE_CURRENT_SOURCE_DIR}/global.h.cmake \
${CMAKE_CURRENT_BINARY_DIR}/global.h ) would take all this HAVE_ defines and write it \
into global.h. Maybe in global.h.cmake there will be a #cmakedefines construct \
required to activate this support, i don't know.
One open problem i haven't a solution is for is about overlapping definitions. In the \
above waf example all symbols since creating the config instance were written into \
the config header and not more. To differentiate two config headers a second object \
or recreating the same object variable does the job.
In kdelibs this may be possible between the config.h and kjs/global.h
Just my 2 cent
Ralf
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic