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
_______________________________________________
Kde-buildsystem mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/kde-buildsystem