[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