KDE3Macros.cmake 13.3 KB
Newer Older
1
#
2

3 4 5 6 7 8 9 10 11 12 13
#=============================================================================
# Copyright 2006-2009 Kitware, Inc.
# Copyright 2006 Alexander Neundorf <neundorf@kde.org>
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
14
# (To distribute this file outside of CMake, substitute the full
15 16
#  License text for the above reference.)

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
# See FindKDE3.cmake for documentation.
#
# this file contains the following macros:
# KDE3_ADD_DCOP_SKELS
# KDE3_ADD_DCOP_STUBS
# KDE3_ADD_MOC_FILES
# KDE3_ADD_UI_FILES
# KDE3_ADD_KCFG_FILES
# KDE3_AUTOMOC
# KDE3_INSTALL_LIBTOOL_FILE
# KDE3_CREATE_FINAL_FILE
# KDE3_ADD_KPART
# KDE3_ADD_KDEINIT_EXECUTABLE
# KDE3_ADD_EXECUTABLE


#neundorf@kde.org

35
include(AddFileDependencies)
36 37 38

#create the kidl and skeletion file for dcop stuff
#usage: KDE_ADD_COP_SKELS(foo_SRCS ${dcop_headers})
39 40
macro(KDE3_ADD_DCOP_SKELS _sources)
   foreach (_current_FILE ${ARGN})
41

42 43
      get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE)
      get_filename_component(_basename ${_tmp_FILE} NAME_WE)
44

45 46
      set(_skel ${CMAKE_CURRENT_BINARY_DIR}/${_basename}_skel.cpp)
      set(_kidl ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.kidl)
47

48 49
      if (NOT HAVE_${_basename}_KIDL_RULE)
         set(HAVE_${_basename}_KIDL_RULE ON)
50

51
          add_custom_command(OUTPUT ${_kidl}
52
          COMMAND ${KDE3_DCOPIDL_EXECUTABLE}
53
          ARGS ${_tmp_FILE} > ${_kidl}
54 55
          DEPENDS ${_tmp_FILE}
         )
56

57
       endif ()
58

59 60
      if (NOT HAVE_${_basename}_SKEL_RULE)
        set(HAVE_${_basename}_SKEL_RULE ON)
61

62
       add_custom_command(OUTPUT ${_skel}
63 64 65 66 67
          COMMAND ${KDE3_DCOPIDL2CPP_EXECUTABLE}
          ARGS --c++-suffix cpp --no-signals --no-stub ${_kidl}
          DEPENDS ${_kidl}
          )

68
      endif ()
69

70
      set(${_sources} ${${_sources}} ${_skel})
71

72
   endforeach ()
73

74
endmacro()
75 76


77 78
macro(KDE3_ADD_DCOP_STUBS _sources)
   foreach (_current_FILE ${ARGN})
79

80
      get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE)
81

82
      get_filename_component(_basename ${_tmp_FILE} NAME_WE)
83

84 85
      set(_stub_CPP ${CMAKE_CURRENT_BINARY_DIR}/${_basename}_stub.cpp)
      set(_kidl ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.kidl)
86

87 88
      if (NOT HAVE_${_basename}_KIDL_RULE)
        set(HAVE_${_basename}_KIDL_RULE ON)
89 90


91
        add_custom_command(OUTPUT ${_kidl}
92
           COMMAND ${KDE3_DCOPIDL_EXECUTABLE}
93 94
           ARGS ${_tmp_FILE} > ${_kidl}
           DEPENDS ${_tmp_FILE}
95 96
           )

97
      endif ()
98 99


100 101
      if (NOT HAVE_${_basename}_STUB_RULE)
        set(HAVE_${_basename}_STUB_RULE ON)
102

103
        add_custom_command(OUTPUT ${_stub_CPP}
104 105 106 107 108
           COMMAND ${KDE3_DCOPIDL2CPP_EXECUTABLE}
           ARGS --c++-suffix cpp --no-signals --no-skel ${_kidl}
           DEPENDS ${_kidl}
         )

109
      endif ()
110

111
      set(${_sources} ${${_sources}} ${_stub_CPP})
112

113
   endforeach ()
114

115
endmacro()
116 117


118 119
macro(KDE3_ADD_KCFG_FILES _sources)
   foreach (_current_FILE ${ARGN})
120

121
      get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE)
122

123
      get_filename_component(_basename ${_tmp_FILE} NAME_WE)
124

125 126
      file(READ ${_tmp_FILE} _contents)
      string(REGEX REPLACE "^(.*\n)?File=([^\n]+)\n.*$" "\\2"  _kcfg_FILE "${_contents}")
127

128 129
      set(_src_FILE    ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp)
      set(_header_FILE ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h)
130

131
      add_custom_command(OUTPUT ${_src_FILE}
132 133 134 135
         COMMAND ${KDE3_KCFGC_EXECUTABLE}
         ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${_kcfg_FILE} ${_tmp_FILE}
         DEPENDS ${_tmp_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/${_kcfg_FILE} )

136
      set(${_sources} ${${_sources}} ${_src_FILE})
137

138
   endforeach ()
139

140
endmacro()
141 142 143 144


#create the moc files and add them to the list of sources
#usage: KDE_ADD_MOC_FILES(foo_SRCS ${moc_headers})
145 146
macro(KDE3_ADD_MOC_FILES _sources)
   foreach (_current_FILE ${ARGN})
147

148
      get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE)
149

150 151
      get_filename_component(_basename ${_tmp_FILE} NAME_WE)
      set(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc.cpp)
152

153
      add_custom_command(OUTPUT ${_moc}
154 155 156 157 158
         COMMAND ${QT_MOC_EXECUTABLE}
         ARGS ${_tmp_FILE} -o ${_moc}
         DEPENDS ${_tmp_FILE}
      )

159
      set(${_sources} ${${_sources}} ${_moc})
160

161 162
   endforeach ()
endmacro()
163 164


165
get_filename_component( KDE3_MODULE_DIR  ${CMAKE_CURRENT_LIST_FILE} PATH)
166 167 168

#create the implementation files from the ui files and add them to the list of sources
#usage: KDE_ADD_UI_FILES(foo_SRCS ${ui_files})
169 170
macro(KDE3_ADD_UI_FILES _sources )
   foreach (_current_FILE ${ARGN})
171

172
      get_filename_component(_tmp_FILE ${_current_FILE} ABSOLUTE)
173

174 175 176 177
      get_filename_component(_basename ${_tmp_FILE} NAME_WE)
      set(_header ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.h)
      set(_src ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.cpp)
      set(_moc ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.moc.cpp)
178

179
      add_custom_command(OUTPUT ${_header}
180
         COMMAND ${QT_UIC_EXECUTABLE}
181
         ARGS  -L ${KDE3_LIB_DIR}/kde3/plugins/designer -nounload -o ${_header} ${CMAKE_CURRENT_SOURCE_DIR}/${_current_FILE}
182 183 184
         DEPENDS ${_tmp_FILE}
      )

185
      add_custom_command(OUTPUT ${_src}
186 187
         COMMAND ${CMAKE_COMMAND}
         ARGS
188
         -DKDE_UIC_PLUGIN_DIR:FILEPATH=${KDE3_LIB_DIR}/kde3/plugins/designer
189 190 191 192
         -DKDE_UIC_EXECUTABLE:FILEPATH=${QT_UIC_EXECUTABLE}
         -DKDE_UIC_FILE:FILEPATH=${_tmp_FILE}
         -DKDE_UIC_CPP_FILE:FILEPATH=${_src}
         -DKDE_UIC_H_FILE:FILEPATH=${_header}
193 194 195 196
         -P ${KDE3_MODULE_DIR}/kde3uic.cmake
         DEPENDS ${_header}
      )

197
      add_custom_command(OUTPUT ${_moc}
198 199 200 201 202
         COMMAND ${QT_MOC_EXECUTABLE}
         ARGS ${_header} -o ${_moc}
         DEPENDS ${_header}
      )

203
      set(${_sources} ${${_sources}} ${_src} ${_moc} )
204

205 206
   endforeach ()
endmacro()
207 208


209 210 211
macro(KDE3_AUTOMOC)
   set(_matching_FILES )
   foreach (_current_FILE ${ARGN})
212

213
      get_filename_component(_abs_FILE ${_current_FILE} ABSOLUTE)
214 215 216 217 218 219 220 221

      # if "SKIP_AUTOMOC" is set to true, we will not handle this file here.
      # here. this is required to make bouic work correctly:
      # we need to add generated .cpp files to the sources (to compile them),
      # but we cannot let automoc handle them, as the .cpp files don't exist yet when
      # cmake is run for the very first time on them -> however the .cpp files might
      # exist at a later run. at that time we need to skip them, so that we don't add two
      # different rules for the same moc file
222
      get_source_file_property(_skip ${_abs_FILE} SKIP_AUTOMOC)
223

224
      if (EXISTS ${_abs_FILE} AND NOT _skip)
225

226
         file(STRINGS ${_abs_FILE} _match REGEX "#include +[^ ]+\\.moc[\">]")
227

228
         get_filename_component(_abs_PATH ${_abs_FILE} PATH)
229

230 231
         foreach (_current_MOC_INC IN LISTS _match)
            string(REGEX MATCH "[^ <\"]+\\.moc" _current_MOC "${_current_MOC_INC}")
232

233 234 235 236
            get_filename_component(_basename ${_current_MOC} NAME_WE)
#            set(_header ${CMAKE_CURRENT_SOURCE_DIR}/${_basename}.h)
            set(_header ${_abs_PATH}/${_basename}.h)
            set(_moc    ${CMAKE_CURRENT_BINARY_DIR}/${_current_MOC})
237

238 239 240 241 242
            add_custom_command(OUTPUT ${_moc}
               COMMAND ${QT_MOC_EXECUTABLE}
               ARGS ${_header} -o ${_moc}
               DEPENDS ${_header}
            )
243

244
            ADD_FILE_DEPENDENCIES(${_abs_FILE} ${_moc})
245

246 247 248 249
         endforeach ()
         unset(_match)
         unset(_header)
         unset(_moc)
250 251 252
      endif ()
   endforeach ()
endmacro()
253

254
# only used internally by KDE3_INSTALL_ICONS
255
macro (_KDE3_ADD_ICON_INSTALL_RULE _install_SCRIPT _install_PATH _group _orig_NAME _install_NAME)
256

257
   # if the string doesn't match the pattern, the result is the full string, so all three have the same content
258 259
   if (NOT ${_group} STREQUAL ${_install_NAME} )
      set(_icon_GROUP "actions")
260

261 262
      if (${_group} STREQUAL "mime")
         set(_icon_GROUP  "mimetypes")
263
      endif ()
264

265 266
      if (${_group} STREQUAL "filesys")
         set(_icon_GROUP  "filesystems")
267
      endif ()
268

269 270
      if (${_group} STREQUAL "device")
         set(_icon_GROUP  "devices")
271
      endif ()
272

273 274
      if (${_group} STREQUAL "app")
         set(_icon_GROUP  "apps")
275
      endif ()
276

277 278
      if (${_group} STREQUAL "action")
         set(_icon_GROUP  "actions")
279
      endif ()
280 281

#      message(STATUS "icon: ${_current_ICON} size: ${_size} group: ${_group} name: ${_name}" )
282
   install(FILES ${_orig_NAME} DESTINATION ${_install_PATH}/${_icon_GROUP}/ RENAME ${_install_NAME} )
283
   endif ()
284

285
endmacro ()
286 287


288 289
macro (KDE3_INSTALL_ICONS _theme )
   set(_defaultpath "${CMAKE_INSTALL_PREFIX}/share/icons")
290
   # first the png icons
291 292 293 294 295
   file(GLOB _icons *.png)
   foreach (_current_ICON ${_icons} )
      string(REGEX REPLACE "^.*/[a-zA-Z]+([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\1" _size  "${_current_ICON}")
      string(REGEX REPLACE "^.*/[a-zA-Z]+([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\2" _group "${_current_ICON}")
      string(REGEX REPLACE "^.*/[a-zA-Z]+([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" "\\3" _name  "${_current_ICON}")
296 297
      _KDE3_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake
         ${_defaultpath}/${_theme}/${_size}x${_size}
298
         ${_group} ${_current_ICON} ${_name})
299
   endforeach ()
300

301
   # and now the svg icons
302 303 304 305
   file(GLOB _icons *.svgz)
   foreach (_current_ICON ${_icons} )
      string(REGEX REPLACE "^.*/crsc\\-([a-z]+)\\-(.+\\.svgz)$" "\\1" _group "${_current_ICON}")
      string(REGEX REPLACE "^.*/crsc\\-([a-z]+)\\-(.+\\.svgz)$" "\\2" _name "${_current_ICON}")
306 307
      _KDE3_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake
                                 ${_defaultpath}/${_theme}/scalable
308
                                 ${_group} ${_current_ICON} ${_name})
309
   endforeach ()
310

311
endmacro ()
312

313 314
macro(KDE3_INSTALL_LIBTOOL_FILE _target)
   get_target_property(_target_location ${_target} LOCATION)
315

316 317 318
   get_filename_component(_laname ${_target_location} NAME_WE)
   get_filename_component(_soname ${_target_location} NAME)
   set(_laname ${CMAKE_CURRENT_BINARY_DIR}/${_laname}.la)
319

320 321 322 323 324 325
   file(WRITE ${_laname} "# ${_laname} - a libtool library file, generated by cmake \n")
   file(APPEND ${_laname} "# The name that we can dlopen(3).\n")
   file(APPEND ${_laname} "dlname='${_soname}'\n")
   file(APPEND ${_laname} "# Names of this library\n")
   if(CYGWIN)
     file(APPEND ${_laname} "library_names='${_soname}'\n")
326
   else()
327
     file(APPEND ${_laname} "library_names='${_soname} ${_soname} ${_soname}'\n")
328
   endif()
329 330 331 332 333 334 335 336 337 338 339
   file(APPEND ${_laname} "# The name of the static archive\n")
   file(APPEND ${_laname} "old_library=''\n")
   file(APPEND ${_laname} "# Libraries that this one depends upon.\n")
   file(APPEND ${_laname} "dependency_libs=''\n")
#   file(APPEND ${_laname} "dependency_libs='${${_target}_LIB_DEPENDS}'\n")
   file(APPEND ${_laname} "# Version information.\ncurrent=0\nage=0\nrevision=0\n")
   file(APPEND ${_laname} "# Is this an already installed library?\ninstalled=yes\n")
   file(APPEND ${_laname} "# Should we warn about portability when linking against -modules?\nshouldnotlink=yes\n")
   file(APPEND ${_laname} "# Files to dlopen/dlpreopen\ndlopen=''\ndlpreopen=''\n")
   file(APPEND ${_laname} "# Directory that this library needs to be installed in:\n")
   file(APPEND ${_laname} "libdir='${CMAKE_INSTALL_PREFIX}/lib/kde3'\n")
340

341
   install_files(${KDE3_LIBTOOL_DIR} FILES ${_laname})
342
endmacro()
343 344


345 346 347 348
macro(KDE3_CREATE_FINAL_FILE _filename)
   file(WRITE ${_filename} "//autogenerated file\n")
   foreach (_current_FILE ${ARGN})
      file(APPEND ${_filename} "#include \"${_current_FILE}\"\n")
349
   endforeach ()
350

351
endmacro()
352 353


354 355
# option(KDE3_ENABLE_FINAL "Enable final all-in-one compilation")
option(KDE3_BUILD_TESTS  "Build the tests")
356 357


358
macro(KDE3_ADD_KPART _target_NAME _with_PREFIX)
359
#is the first argument is "WITH_PREFIX" then keep the standard "lib" prefix, otherwise SET the prefix empty
360 361
   if (${_with_PREFIX} STREQUAL "WITH_PREFIX")
      set(_first_SRC)
362
   else ()
363
      set(_first_SRC ${_with_PREFIX})
364
   endif ()
365

366
#    if (KDE3_ENABLE_FINAL)
367
#       KDE3_CREATE_FINAL_FILE(${_target_NAME}_final.cpp ${_first_SRC} ${ARGN})
368
#       add_library(${_target_NAME} MODULE  ${_target_NAME}_final.cpp)
369
#    else ()
370
   add_library(${_target_NAME} MODULE ${_first_SRC} ${ARGN})
371
#    endif ()
372

373 374
   if(_first_SRC)
      set_target_properties(${_target_NAME} PROPERTIES PREFIX "")
375
   endif()
376 377 378

   KDE3_INSTALL_LIBTOOL_FILE(${_target_NAME})

379
endmacro()
380 381


382
macro(KDE3_ADD_KDEINIT_EXECUTABLE _target_NAME )
383

384
#    if (KDE3_ENABLE_FINAL)
385
#       KDE3_CREATE_FINAL_FILE(${_target_NAME}_final.cpp ${ARGN})
386
#       add_library(kdeinit_${_target_NAME} SHARED  ${_target_NAME}_final.cpp)
387
#    else ()
388
   add_library(kdeinit_${_target_NAME} SHARED ${ARGN} )
389
#    endif ()
390

391
   configure_file(${KDE3_MODULE_DIR}/kde3init_dummy.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_dummy.cpp)
392

393 394
   add_executable( ${_target_NAME} ${CMAKE_CURRENT_BINARY_DIR}/${_target_NAME}_dummy.cpp )
   target_link_libraries( ${_target_NAME} kdeinit_${_target_NAME} )
395

396
endmacro()
397 398


399
macro(KDE3_ADD_EXECUTABLE _target_NAME )
400

401
#    if (KDE3_ENABLE_FINAL)
402
#       KDE3_CREATE_FINAL_FILE(${_target_NAME}_final.cpp ${ARGN})
403
#       add_executable(${_target_NAME} ${_target_NAME}_final.cpp)
404
#    else ()
405
   add_executable(${_target_NAME} ${ARGN} )
406
#    endif ()
407

408
endmacro()
409 410