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
Kde-buildsystem@kde.org
https://mail.kde.org/mailman/listinfo/kde-buildsystem

Reply via email to