Digikam/CMake Documentation(Frameworks): Difference between revisions

From KDE Community Wiki
*>Veaceslav
No edit summary
*>Veaceslav
No edit summary
Line 35: Line 35:
*importui
*importui
*baloowrap
*baloowrap
This libs are linked in digikam main executable and some tests
{{Warning| Avoid making static libs, use OBJECT libraries instead. Only make STATIC libraries which does not depend on other digikam code. Also make sure you put the PRIVATE parameter when setting the target_link_libraries.}}


{{Warning| Avoid making static libs, use OBJECT libraries instead. Only make STATIC libraries which does not depend on other digikam code. Also make sure you put the PRIVATE parameter when setting the target_link_libraries.}}
===Object Libraries ===
While static libraries are still collection of objects, CMake offer a better approach by allowing to specify an OBJECT library:
<source lang="bash">
set(libslideshow_SRCS
    slidetoolbar.cpp
    slideosd.cpp
    slideproperties.cpp
    slideimage.cpp
    slideerror.cpp
    slideend.cpp
    slideshow.cpp
    slidehelp.cpp
    slideshowsettings.cpp
)


add_library(slideshow_src OBJECT ${libslideshow_SRCS})
</source>
OBJECT library is a cmake internal implementation feature and allow to easily manage sources. Here is an example of how to make a shared lib using OBJECT libraries:
<source lang="bash">
add_library(digikamcore
            SHARED
            $<TARGET_OBJECTS:digikamdatabasecore_src>
            $<TARGET_OBJECTS:dimg_src>
          ....
)
</source>
==Final Words==
{{Remember|Please follow the guidelines when adding sources to CMakeFiles:
{{Remember|Please follow the guidelines when adding sources to CMakeFiles:
* Use OBJECT libraries
* Use OBJECT libraries

Revision as of 09:34, 10 June 2015

Introduction

CMake configuration files were rewritten by Veaceslav Munteanu <veaceslav dot munteanu90 at gmail dot com> at 10 June 2014. The aim of new configuration was to reduce the linking overhead and improve CPU utilization while still keeping the modular design implemented by Teemu Rytilahti

CMake Structure

Independent Cmake configuration is presents in following folders:

  • digikam-software-compilation
  • core
  • extra
  • docs

The rewrite touched mostly the core folder.

CMake executables for core

Core cmake will link the following executable:

  • digikam
  • showfoto
  • digikam database server - if compilation is enabled in cmake files
  • various test executables - if testing is enabled

each of them depend on various sources which must be compiled before.

Shared Libraries

To avoid linking overhead and make a better use of sources there are some dynamic libs.

  • digikamcore - core components used by almost all executables
  • digikamdatabase - database components, also used together with digikamcore
  • imageplugins - image plugin implementation
  • kio modules - soon to be deprecated

Warning

Please add sources to digikam core or digikam database only if they don't depend on any big component from digikam main executable. These two shared libs must be kept small because they link in a lot of places


Static Libraries

Currently cmake configuration features 4 shared libs:

  • queuemanager
  • advancedrename
  • importui
  • baloowrap

This libs are linked in digikam main executable and some tests

Warning

Avoid making static libs, use OBJECT libraries instead. Only make STATIC libraries which does not depend on other digikam code. Also make sure you put the PRIVATE parameter when setting the target_link_libraries.


Object Libraries

While static libraries are still collection of objects, CMake offer a better approach by allowing to specify an OBJECT library:

set(libslideshow_SRCS
    slidetoolbar.cpp
    slideosd.cpp
    slideproperties.cpp
    slideimage.cpp
    slideerror.cpp
    slideend.cpp
    slideshow.cpp
    slidehelp.cpp
    slideshowsettings.cpp
)

add_library(slideshow_src OBJECT ${libslideshow_SRCS})

OBJECT library is a cmake internal implementation feature and allow to easily manage sources. Here is an example of how to make a shared lib using OBJECT libraries:

add_library(digikamcore
            SHARED
            $<TARGET_OBJECTS:digikamdatabasecore_src>
            $<TARGET_OBJECTS:dimg_src>
           ....
)

Final Words

 
Remember
Please follow the guidelines when adding sources to CMakeFiles:
  • Use OBJECT libraries
  • Avoid using STATIC libraries
  • Use PRIVATE parameter on target_link_libraries
  • Keep digikamcore and digikamdatabase libraries small