Build system for KDE4

Alexander Neundorf neundorf at kde.org
Tue Jun 14 19:49:00 BST 2005


Hi,

On Tuesday 14 June 2005 06:26, Thiago Macieira wrote:
> Alexander Neundorf wrote:
> >>  - icon installation
> >
> >needs a custom macro (not yet written)
>
> How easy is it to add such macro? How can it be shared among KDE modules?
>
> >>  - GCC visibility
> >
> >what does this mean for the buildtool ?
>
> Actually, this shouldn't be here. We need a configure test to check if gcc
> supports -fvisibility and, if so, enable the flag in CXXFLAGS.

Configure checks are a fundamental feature of cmake. It offers different ways 
to check for stuff. Just checking for the existence of files, try to compile 
stuff, try to execute stuff, grep files. 
E.g. the following line checks for a header and sets a variable accordingly:
CHECK_INCLUDE_FILES(dlfcn.h HAVE_DLFCN_H)

How to find out which CHECK_XXX() functions exist ? Just enter 
${CMAKE_ROOT_PATH}/Modules/ (usually /usr/local/share/CMake/Modules/) and 
check out the *.cmake files you'll find there. They all have descriptive 
names.

> >>  - automatic dependency resolution
> >
> >I'm not sure I understand exactly what you mean. If I say application
> > foo links to library libbar.so, cmake detects that libbar.so has to be
> > compiled before foo.
>
> That's it.
>
> Can it also do dependency resolution across different directories?
> (make/automake can't)

Inside one project (e.g. kdebase), yes.

> >>  - manual hints for dependency resolution
> >
> >Not sure. Can you explain more ? It is possible to manually add
> > dependencies of files.
>
> Like in make:
>
> foo.cpp: fooui.ui

Yes. (but for ui files this is not required, it works).

> >>  - flex/bison
> >
> >needs a custom macro similar to the ones for uic, moc, kconfig_compiler
> > etc.
>
> flex and bison are pretty standard... They should be supported
> out-of-the-box.

I was also a bit surprised that cmake doesn't come with ready-built flex/bison 
support. Since I have never used flex/bison myself until now please tell me 
what has to be done with these files so I can provide a sample 
implementation.
It's always the same schema: define a list of source files for your 
application:

SET(mySources main.cpp foo.cppl)

then call a macro which adds the generated files to these sources:

KDE_ADD_DCOP_SKELS(mySources blub.skel blah.skel)

which will create all necessary rules and dependencies for generating the 
appropriate files and add them to the list "mySources".
And finally create something from these files:

ADD_EXECUTABLE(myApp ${mySources} )

The macro implementation itself looks a bit hard to read on the first view, 
also due to the all-upper-case characters. Once you get around this, it's not 
hard. And, *all* cmake commands are documented on *one* manpage: 
http://www.cmake.org/HTML/Documentation.html . 

The macro implementation looks like this:

#now comes a macro
MACRO(KDE_ADD_DCOP_SKELS _sources)
   #iterate through all unnamed arguments, i.e. the ones coming after _sources
   FOREACH (_current_FILE ${ARGN})
      #get the filename without extension
      GET_FILENAME_COMPONENT(_basename ${_current_FILE} NAME_WE)
      #create the complete names for the generated files
      SET(_skel ${CMAKE_CURRENT_BINARY_DIR}/${_basename}_skel.cpp)
      SET(_kidl ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.kidl)

      #add the two necessary commands for the dcop idl stuff
      #here you specify which file is created by this command,
      #the actual command and its arguments to run
      #and on which files the generated file depends
      ADD_CUSTOM_COMMAND(OUTPUT ${_kidl}
         COMMAND ${DCOPIDL}         
         ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${_current_FILE} > ${_kidl}
         DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_current_FILE}
      )

       ADD_CUSTOM_COMMAND(OUTPUT ${_skel}
         COMMAND ${DCOPIDL2CPP}
         ARGS --c++-suffix cpp --no-signals --no-stub ${_kidl}
         DEPENDS ${_kidl}
      )
      #this one adds the generated file to the given list of source files
      SET(${_sources} ${${_sources}} ${_skel})
   #end of the loop
   ENDFOREACH (_current_FILE)
#end of the macro
ENDMACRO(KDE_ADD_DCOP_SKELS)

> >>  - kdeinit support (?)
> >
> >yes
>
> With a macro, right?

Of course. All custom functionality gets implemented via macros.
(I know the word "macro" has a negative touch for C++ people... [but even Qt 
uses macros for its signals and slots ;-) ] )

> >>  - pkg-config support
> >
> >If you want to use pkg-config with cmake, you are free to do so. But it
> > can also be done without pkg-config.
>
> The point here is: the tool should be able to read .pc files itself,
> without relying on running pkg-config and parsing the output. It should
> be easy to write tests for those.

I think this wouldn't be portable. Do they also exist on Mac OS X and 
Windows ? 
Directly reading pc-file is currently not implemented, but is possible if 
somebody does it.
The "native" cmake way of checking for existing stuff is to write 
FindXXX.cmake files for each package. A lot of them come with cmake.

> >>  - support rpath sanely
> >
> >cmake supports rpath. I don't know what exactly you mean with "sanely".
>
> This was one addition of mine.
>
> Currently, libtool will add to rpath everything you throw at it. That
> means /usr on some systems, making it impossible to build and/or run KDE
> when another KDE is already installed on prefix=/usr.
>
> We should be able to sanely control what goes on rpath.
>
> I know this is vague.

I'm afraid somebody else should check the behaviour of cmake in this regard.

> >Well, does it count that cmake can generate kdevelop project files ?
>
> This is one of the "musts":
>
> the file describing the build must be machine-parseable. That rules out
> Sconscript files directly, but it does not rule out scons.
>
> In my opinion, a simple "name = value" list should suffice: easy to
> understand, and easy to parse.
>
> I would even go so far as to say: keep the Makefile.am files!

About an easy syntax, e.g. kdevelop/parts/abbrev/CMakeLists.txt:

---------8<-------------8<-------------8<---------------

#create a kpart:
KDE_ADD_KPART(kdevabbrev abbrevpart.cpp abbrevconfigwidget.cpp 
addtemplatedlg.cpp abbrevconfigwidgetbase.ui addtemplatedlgbase.ui )

#link it to some kde libs
TARGET_LINK_LIBRARIES(kdevabbrev ${KDEV_PART_LIBS})

#install rules, relative to CMAKE_INSTALL_PREFIX
INSTALL_TARGETS(/lib/kde3 kdevabbrev)

---------8<-------------8<-------------8<---------------

KDE_ADD_KPART() comes from the newly created kdevelop/cmake/KDEMagic.cmake

> >>  - ability to build from svn:/trunk/KDE
> >
> >Don't know.
>
> Also one of my ideas.

http://www.cmake.org/Wiki/CMake_Scripting_Of_CTest shows an example how to use 
ctest with cvs. It seems as the cvs commands could simply be replaced with 
svn commands. Might be worth trying.

> Suppose you went into your local checkout of /trunk/KDE, where you have
> kdelibs, kdebase and kdepim. Instead of running:
>
> for dir in kdelibs kdebase kdepim; do
>   cd $dir; build-command; cd ..
> done
>
> I want to be able to do:
> build-command
>
> provided the necessary files are present in /trunk/KDE or, even better,
> automatically guessed.

It would probably need at least an CMakeLists.txt file in this directory, 
featuring something like this:

FILE(GLOB_RECURSE allDirs "/*/CMakeLists.txt") 
SUBDIRS(${allDirs})

(didn't test, just a quick guess from the man page).

> >> support for something like "make install DESTDIR=/tmp/kde-buildroot"
> >> to keep packagers happy
> >
> >I.e. changing the install path after compilation ? You can change the
> >CMAKE_INSTALL_PREFIX and then it will be installed there.
>
> This is not a "nice to have". It's a must-have feature.

Since the "install" target depends optionally on the "all" target, I see no 
reason why it shouldn't work.

...
> If you created FreeBSD binaries, you can't run them in Linux.
>
> If the tool helped with this, it would have to detect that (say)
> kconfig_compiler is used, and must, therefore, be compiled twice: once
> for the native tools, and once for the cross-compilation.

Sounds complicated.

> >Additional features of cmake:
> >-no other tools (no shell, no perl, no m4, no python, no automake, no
> > libtool, no autoconf, no autoheader, no aclocal,...)
>
> no make?

If you're on Mac and use XCode, then, yes, no make. If you're on unix and want 
use make, then you need make ;-)

> >cvs -d :pserver:anonymous at www.cmake.org:/cvsroot/CMake login
> > (respond with password cmake)
>
> Eww, cvs. That's so... March :-)

LOL
I guess this should become the quote of the week :-)

In some way cmake reminds me on Qt: it's written and maintained by a company, 
it's available as open source, it has good documentation, and it's 
implemented in C++.

Bye
Alex
-- 
Work: alexander.neundorf at jenoptik.com - http://www.jenoptik-los.de
Home: neundorf at kde.org                - http://www.kde.org
      alex at neundorf.net               - http://www.neundorf.net




More information about the kde-core-devel mailing list