Phonon

Alexander Neundorf neundorf at kde.org
Fri Mar 11 18:28:48 CET 2011


Hi all,

On Thursday 10 March 2011, Ben Cooksley wrote:
> Hi all,
>
> I have found recently that I cannot build KDE Runtime. In tracing
> this, I ended up with an obscure error:
>
> CMake Error at
> /opt/trunk-kde/kde/share/apps/cmake/modules/MacroEnsureVersion.cmake:95
> (NORMALIZE_VERSION):
>   NORMALIZE_VERSION Macro invoked with incorrect arguments for macro named:
>   NORMALIZE_VERSION
> Call Stack (most recent call first):
>   phonon/CMakeLists.txt:18 (macro_ensure_version)

When calling normalize_version(), the version variable should be put in 
quotes, this way even if it is empty it at least becomes an empty string 
instead of nothing.

NORMALIZE_VERSION( "${found_version}" found_vers_num )

> This error message actually means that PHONON_VERSION is empty.
> Further diagnosing this, I noticed that Phonon recently made changes
> to where they stored the version string, yet they updated their CMake
> files.
>
> Digging further, I discovered that CMake wasn't using the new ones,
> because they are being installed to $prefix/share/phonon-buildsystem/

That's not a good idea. Don't do that. Or only do it if you are really sure 
you know what you are doing.

> instead of the standard location ( $prefix/share/apps/cmake )

Although kdelibs install both cmake find-modules as well as it's own cmake 
info-files there, it is not a standard location in any way. For KDE5 this 
will be different.


I just had a look at cmake/CMakeLists.txt in phonons git. 

Now this does not look good:

set(BUILDSYSTEM_INSTALL_DIR ${SHARE_INSTALL_PREFIX}/phonon-buildsystem/)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in
              ${CMAKE_CURRENT_SOURCE_DIR}/FindAutomoc4.cmake
              ${CMAKE_CURRENT_SOURCE_DIR}/FindPackageHandleStandardArgs.cmake
              ${CMAKE_CURRENT_SOURCE_DIR}/FindPhonon.cmake
              ${CMAKE_CURRENT_SOURCE_DIR}/FindPhononInternal.cmake
              ${CMAKE_CURRENT_SOURCE_DIR}/PhononMacros.cmake
              ${CMAKE_CURRENT_SOURCE_DIR}/FindQt4.cmake
              ${CMAKE_CURRENT_SOURCE_DIR}/MacroEnsureVersion.cmake
              ${CMAKE_CURRENT_SOURCE_DIR}/MacroLogFeature.cmake
              ${CMAKE_CURRENT_SOURCE_DIR}/MacroOptionalFindPackage.cmake
              ${CMAKE_CURRENT_SOURCE_DIR}/MacroPushRequiredVars.cmake
              ${CMAKE_CURRENT_SOURCE_DIR}/PhononMacros.cmake
        DESTINATION ${BUILDSYSTEM_INSTALL_DIR})


Why do you think that Phonon needs to install that many Find-modules ?

This means you have to take care of keeping compatibility for them !
(it's not often that I use the exclamation mark).
Who is your cmake guy who does that ?

Second, it makes no sense for package Foo to install a FindFoo.cmake for 
itself.
So, don't install FindPhonon.cmake.

Sorry, FindPhonon.cmake itself looks bad, delete it and start from scratch:

if (NOT PHONON_BUILDSYSTEM_DIR)
    find_program(PC_EXECUTABLE NAMES pkg-config
    PATH_SUFFIXES bin               
    HINTS
    ${CMAKE_INSTALL_PREFIX}
    ONLY_CMAKE_FIND_ROOT_PATH
    )


There is a FindPkgConfig.cmake, why don't you use that ?

Beside, Phonon itself uses cmake, so install a cmake Config.cmake file. This 
file can contain all the information about the installed phonon you want.
There is absolutely no need for *requiring* pkg-config.
Especially not in a FindPhonon.cmake which is only found if the "searching" 
project already knows where Phonon is.


...

if (PHONON_BUILDSYSTEM_DIR)
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PHONON_BUILDSYSTEM_DIR})

    if (Phonon_FIND_REQUIRED)
        set(_req REQUIRED)
    endif (Phonon_FIND_REQUIRED)
    if (PHONON_FIND_QUIETLY)
        set(_quiet QUIET)
    endif (PHONON_FIND_QUIETLY)

    find_package(PhononInternal ${_req} ${_quiet})
else (PHONON_BUILDSYSTEM_DIR)
    if (_data_DIR)
        if (Phonon_FIND_REQUIRED)
            message(FATAL_ERROR "ERROR: FindPhonon.cmake not found in 
${_data_DIR}")
        endif (Phonon_FIND_REQUIRED)
    else (_data_DIR)
        if (Phonon_FIND_REQUIRED)
            message(FATAL_ERROR "ERROR: Either pkg-config can not find its 
phonon config, or you are not using a recent enough Phonon version.")
        endif (Phonon_FIND_REQUIRED)
    endif (_data_DIR)
endif (PHONON_BUILDSYSTEM_DIR)

There is the macro find_package_handle_standard_args().
Use that and remove all the code above.

If you have question about how to do things properly with cmake, don't 
hesitate to ask on kde-buildsystem at kde.org or cmake at cmake.org.
This would be much better than spreading such code.

Alex


More information about the Kde-buildsystem mailing list