ACGCommon.cmake 30.3 KB
Newer Older
Jan Möbius's avatar
   
Jan Möbius committed
1
2
3
4
5
if (EXISTS ${CMAKE_SOURCE_DIR}/${CMAKE_PROJECT_NAME}.cmake)
  include (${CMAKE_SOURCE_DIR}/${CMAKE_PROJECT_NAME}.cmake)
endif ()

# prevent build in source directory
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# add option to disable plugin build
option (
  BLOCK_IN_SOURCE_BUILD
  "Disable building inside the source tree"
  ON
)

if ( BLOCK_IN_SOURCE_BUILD )
  if ("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}")
      message (SEND_ERROR "Building in the source directory is not supported.")
      message (FATAL_ERROR "Please remove the created \"CMakeCache.txt\" file, the \"CMakeFiles\" directory and create a build directory and call \"${CMAKE_COMMAND} <path to the sources>\".")
  endif ("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}")
endif()
Jan Möbius's avatar
   
Jan Möbius committed
20
21

# allow only Debug and Release builds
Matthias Möller's avatar
Matthias Möller committed
22
set (CMAKE_CONFIGURATION_TYPES "Debug;Release;RelWithDebInfo" CACHE STRING "" FORCE)
Jan Möbius's avatar
   
Jan Möbius committed
23
24
25
26
27
28
29
30
31
32
33
34
35
36
mark_as_advanced (CMAKE_CONFIGURATION_TYPES)

# set Debus as default build target
if (NOT CMAKE_BUILD_TYPE)
  set (CMAKE_BUILD_TYPE Debug CACHE STRING
      "Choose the type of build, options are: Debug, Release."
      FORCE)
endif ()

# create our output directroy
if (NOT EXISTS ${CMAKE_BINARY_DIR}/Build)
  file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Build)
endif ()

37
38
39
40
41
42
43
#generate the global doc target (but only once!)
GET_TARGET_PROPERTY(target_location doc EchoString)
if ( NOT target_location STREQUAL "Building Documentation" )
  ADD_CUSTOM_TARGET( doc )
  SET_TARGET_PROPERTIES( doc PROPERTIES EchoString "Building Documentation"  )
endif()

Jan Möbius's avatar
   
Jan Möbius committed
44
45
# read version from file
macro (acg_get_version)
46
47
48
    if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/branding/VERSION")
      file (READ "${CMAKE_CURRENT_SOURCE_DIR}/branding/VERSION" _file)
    elseif (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${ARGN}/VERSION")
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
49
50
51
52
53
54
55
56
57
58
      file (READ "${CMAKE_CURRENT_SOURCE_DIR}/${ARGN}/VERSION" _file)
    else ()
      file (READ "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" _file)
    endif ()

    string (
        REGEX REPLACE
        "^.*ID=([^\n]*).*$" "\\1"
        _id ${_file}
    )
Jan Möbius's avatar
   
Jan Möbius committed
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
    string (
        REGEX REPLACE
        "^.*VERSION=([^\n]*).*$" "\\1"
        _version ${_file}
    )
    string (
        REGEX REPLACE
        "^.*MAJOR=([^\n]*).*$" "\\1"
        _major ${_file}
    )
    string (
        REGEX REPLACE
        "^.*MINOR=([^\n]*).*$" "\\1"
        _minor ${_file}
    )
    string (
        REGEX REPLACE
        "^.*PATCH=([^\n]*).*$" "\\1"
        _patch ${_file}
    )
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
79
80
81
82
83

    set (${_id}_VERSION ${_version})
    set (${_id}_VERSION_MAJOR ${_major})
    set (${_id}_VERSION_MINOR ${_minor})
    set (${_id}_VERSION_PATCH ${_patch})
Jan Möbius's avatar
   
Jan Möbius committed
84
85
86
87
88
89
endmacro ()


# set directory structures for the different platforms
if (WIN32)
  set (ACG_PROJECT_DATADIR ".")
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
90
91
  set (ACG_PROJECT_LIBDIR "lib")
  set (ACG_PROJECT_BINDIR ".")
Jan Möbius's avatar
   
Jan Möbius committed
92
  set (ACG_PROJECT_PLUGINDIR "Plugins")
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
93
94
  if (NOT EXISTS ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR})
    file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR})
Jan Möbius's avatar
   
Jan Möbius committed
95
96
97
98
99
100
101
102
  endif ()
else ()
  set (ACG_PROJECT_DATADIR "share/${CMAKE_PROJECT_NAME}")
  set (ACG_PROJECT_LIBDIR "lib/${CMAKE_PROJECT_NAME}")
  set (ACG_PROJECT_PLUGINDIR "lib/${CMAKE_PROJECT_NAME}/plugins")
  set (ACG_PROJECT_BINDIR "bin")
endif ()

Jan Möbius's avatar
Jan Möbius committed
103
104
105
106
107
108
109
110
111
if( NOT APPLE )
  # check 64 bit
  if( CMAKE_SIZEOF_VOID_P MATCHES 4 )
    set( HAVE_64_BIT 0 )
  else( CMAKE_SIZEOF_VOID_P MATCHES 4 )
    set( HAVE_64_BIT 1 )
  endif( CMAKE_SIZEOF_VOID_P MATCHES 4 )
endif (  NOT APPLE )

Jan Möbius's avatar
   
Jan Möbius committed
112
113
114
115
116
# allow a project to modify the directories
if (COMMAND acg_modify_project_dirs)
  acg_modify_project_dirs ()
endif ()

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
117
118
119
120
121
if (NOT EXISTS ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_DATADIR})
 file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_DATADIR})
endif ()


Jan Möbius's avatar
   
Jan Möbius committed
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# sets default build properties
macro (acg_set_target_props target)
  if (WIN32)
    set_target_properties (
      ${target} PROPERTIES
      BUILD_WITH_INSTALL_RPATH 1
      SKIP_BUILD_RPATH 0
    )
  elseif (APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE)
    set_target_properties (
      ${target} PROPERTIES
      INSTALL_NAME_DIR "@executable_path/../lib/${CMAKE_PROJECT_NAME}"
      BUILD_WITH_INSTALL_RPATH 1
      SKIP_BUILD_RPATH 0
    )
  elseif (NOT APPLE)
Jan Möbius's avatar
Jan Möbius committed
138

Jan Möbius's avatar
   
Jan Möbius committed
139
140
141
142
143
144
145
146
    set_target_properties (
      ${target} PROPERTIES
      INSTALL_RPATH "$ORIGIN/../lib/${CMAKE_PROJECT_NAME}"
      BUILD_WITH_INSTALL_RPATH 1
      SKIP_BUILD_RPATH 0
      RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_BINDIR}"
      LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}"
    )
Jan Möbius's avatar
Jan Möbius committed
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173

    # prepare for cross compiling
    if ( HAVE_64_BIT )
      if ( NOT CROSS_COMPILE_32)
        # Already in cache, be silent
        set( CROSS_COMPILE_32 false CACHE BOOL "Compile for 32-bit architecture")
      endif( NOT  CROSS_COMPILE_32 )

      if ( CROSS_COMPILE_32 )
        add_definitions( -m32 )
        set_target_properties( ${target} PROPERTIES LINK_FLAGS -m32  )
      endif ( CROSS_COMPILE_32 )

    else ( HAVE_64_BIT )

      if ( NOT CROSS_COMPILE_64)
        # Already in cache, be silent
        set( CROSS_COMPILE_64 false CACHE BOOL "Compile for 64-bit architecture")
      endif( NOT  CROSS_COMPILE_64 )

      if ( CROSS_COMPILE_64 )
        add_definitions( -m64 )
        set_target_properties( ${target} PROPERTIES LINK_FLAGS -m64  )
      endif ( CROSS_COMPILE_64 )

    endif( HAVE_64_BIT )

Jan Möbius's avatar
   
Jan Möbius committed
174
175
176
177
178
179
180
181
182
183
184
185
  endif ()
endmacro ()

include (AddFileDependencies)
include (ACGCompiler)

# define INCLUDE_TEMPLATES for everything we build
add_definitions (-DINCLUDE_TEMPLATES)

# look for selected qt dependencies
macro (acg_qt4)
  if (NOT QT4_FOUND)
Jan Möbius's avatar
Jan Möbius committed
186

187
    set (QT_MIN_VERSION ${ARGN}) 
Jan Möbius's avatar
Jan Möbius committed
188

189
190
191
192
193
    if(POLICY CMP0020)
      # Automatically link Qt executables to qtmain target on Windows
      cmake_policy(SET CMP0020 NEW)
    endif(POLICY CMP0020)

Jan Möbius's avatar
Jan Möbius committed
194
    find_package (Qt4 COMPONENTS QtCore QtGui )
Jan Möbius's avatar
   
Jan Möbius committed
195
196
197
198
199

    set (QT_USE_QTOPENGL 1)
    set (QT_USE_QTNETWORK 1)
    set (QT_USE_QTSCRIPT 1)
    set (QT_USE_QTSQL 1)
Jan Möbius's avatar
Jan Möbius committed
200
    set (QT_USE_QTXML 1)
Jan Möbius's avatar
Jan Möbius committed
201
    set (QT_USE_QTXMLPATTERNS 1)
Jan Möbius's avatar
   
Jan Möbius committed
202
203
204
205
    set (QT_USE_QTHELP 1)
    set (QT_USE_QTWEBKIT 1)
    set (QT_USE_QTUITOOLS 1)

206
207
208
209
    if (QT_QTSCRIPTTOOLS_FOUND)
      set (QT_USE_QTSCRIPTTOOLS 1)
    endif()

Jan Möbius's avatar
   
Jan Möbius committed
210
211
212
213
    include (${QT_USE_FILE})
  endif ()
endmacro ()

Matthias Möller's avatar
Matthias Möller committed
214
macro (acg_qt5)
215
216
217
218
219

   if(POLICY CMP0020)
     # Automatically link Qt executables to qtmain target on Windows
     cmake_policy(SET CMP0020 NEW)
   endif(POLICY CMP0020)
Matthias Möller's avatar
Matthias Möller committed
220
221
222
223
224
  #if (NOT QT5_FOUND)

    #set (QT_MIN_VERSION ${ARGN})

    #for custom installation of qt5, dont use any of these variables
Matthias Möller's avatar
Matthias Möller committed
225
    set (QT5_INSTALL_PATH "" CACHE PATH "Path to Qt5 directory which contains lib and include folder")
226
227
228
229
230
231
232
233
234
235
236
237
 
    if (EXISTS ${QT5_INSTALL_PATH})
#		if (NOT EXISTS "${QT5_INSTALL_PATH}/include")
#			message( FATAL_ERROR "Could not find Qt5 include directory. Please set QT5_INSTALL_PATH to the directory which contains Qt5 lib and include folder.")
#		endif()
#		if (NOT EXISTS "${QT5_INSTALL_PATH}/lib")
#			message( FATAL_ERROR "Could not find Qt5 lib directory. Please set QT5_INSTALL_PATH to the directory which contains Qt5 lib and include folder.")
#		endif()
    else()
 	message( FATAL_ERROR "The Given QT5_INSTALL_PATH does not exists")
    endif()

Matthias Möller's avatar
Matthias Möller committed
238
239
    set (CMAKE_PREFIX_PATH  ${QT5_INSTALL_PATH})
    set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
Matthias Möller's avatar
Matthias Möller committed
240
	
Jan Möbius's avatar
Jan Möbius committed
241
	set (QT_PLUGINS_DIR "${QT5_INSTALL_PATH}/plugins" CACHE PATH "")
Matthias Möller's avatar
Matthias Möller committed
242
	set (QT_BINARY_DIR "${QT5_INSTALL_PATH}/bin" CACHE PATH "Qt5 binary Directory")
Jan Möbius's avatar
Jan Möbius committed
243
	set (QT_RCC_EXECUTABLE "${QT5_INSTALL_PATH}/bin/rcc" CACHE PATH "Path to the rcc executable")
Matthias Möller's avatar
Matthias Möller committed
244
	
245
246
247
248
249
250
251
252
253
254
255
256
257
    #glu32.lib is needed by qt5 opengl version. it cannot find it by itself so we help qt
    if ( WIN32 )
      
      set(WINDOWS_SDK_LIBS "COULD_NOT_FOUND" CACHE PATH "Path to the latest windows sdk libs which includes glu32.lib")
      if (EXISTS "${WINDOWS_SDK_LIBS}\\glu32.lib")
          set (WINDOWS_SDK_LIBS ${WINDOWS_SDK_LIBS})
          set (CMAKE_PREFIX_PATH "${QT5_INSTALL_PATH};${WINDOWS_SDK_LIBS}")
      else()
         message( FATAL_ERROR "Could not find glu32.lib in your Windows sdk libs.")
      endif()
      
    endif()#WIN32
    
Matthias Möller's avatar
Matthias Möller committed
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
    find_package (Qt5Core REQUIRED)
    find_package (Qt5Declarative REQUIRED)
    find_package (Qt5Widgets REQUIRED)
    find_package (Qt5Gui REQUIRED)
    find_package (Qt5OpenGL REQUIRED)
    find_package (Qt5Network REQUIRED)
    find_package (Qt5Script REQUIRED)
    find_package (Qt5ScriptTools REQUIRED)
    find_package (Qt5Sql REQUIRED)
    find_package (Qt5Xml REQUIRED)
    find_package (Qt5XmlPatterns REQUIRED)
    find_package (Qt5Help REQUIRED)
    find_package (Qt5WebKit REQUIRED)
    find_package (Qt5UiTools REQUIRED)
    find_package (Qt5Concurrent REQUIRED)
    find_package (Qt5PrintSupport REQUIRED)
    

Matthias Möller's avatar
Matthias Möller committed
276
    set (QT5_FOUND ${Qt5Core_FOUND} AND ${Qt5Declarative} AND ${Qt5Widgets_FOUND}
Matthias Möller's avatar
Matthias Möller committed
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
      AND ${Qt5Gui_FOUND} AND ${Qt5OpenGL_FOUND} AND ${Qt5Network_FOUND}
      AND ${Qt5Script_FOUND} AND ${Qt5ScriptTools_FOUND} AND ${Qt5Sql_FOUND}
      AND ${Qt5Xml_FOUND} AND ${Qt5XmlPatterns_FOUND} AND ${Qt5Help_FOUND}
      AND ${Qt5WebKit_FOUND} AND ${Qt5UiTools_FOUND} AND ${Qt5Concurrent_FOUND}
      AND ${Qt5PrintSupport_FOUND})

    if (QT5_FOUND)
      include_directories(${Qt5Core_INCLUDE_DIRS})
      include_directories(${Qt5Declarative_INCLUDE_DIRS})
      include_directories(${Qt5Widgets_INCLUDE_DIRS})
      include_directories(${Qt5Gui_INCLUDE_DIRS})
      include_directories(${Qt5OpenGL_INCLUDE_DIRS})
      include_directories(${Qt5Network_INCLUDE_DIRS})
      include_directories(${Qt5Script_INCLUDE_DIRS})
      include_directories(${Qt5ScriptTools_INCLUDE_DIRS})
      include_directories(${Qt5Sql_INCLUDE_DIRS})
      include_directories(${Qt5Xml_INCLUDE_DIRS})
      include_directories(${Qt5XmlPatterns_INCLUDE_DIRS})
      include_directories(${Qt5Help_INCLUDE_DIRS})
      include_directories(${Qt5WebKit_INCLUDE_DIRS})
      include_directories(${Qt5UiTools_INCLUDE_DIRS})
      include_directories(${Qt5Concurrent_INCLUDE_DIRS})
      include_directories(${Qt5PrintSupport_INCLUDE_DIRS})
      add_definitions(${Qt5Core_DEFINITIONS})
      add_definitions(${Qt5Widgets_DEFINITIONS})
      add_definitions(${Qt5Gui_DEFINITIONS})
      add_definitions(${Qt5OpenGL_DEFINITIONS})
      add_definitions(${Qt5Network_DEFINITIONS})
      add_definitions(${Qt5Script_DEFINITIONS})
      add_definitions(${Qt5ScriptTools_DEFINITIONS})
      add_definitions(${Qt5Sql_DEFINITIONS})
      add_definitions(${Qt5Xml_DEFINITIONS})
      add_definitions(${Qt5XmlPatterns_DEFINITIONS})
      add_definitions(${Qt5Help_DEFINITIONS})
      add_definitions(${Qt5WebKit_DEFINITIONS})
      add_definitions(${Qt5UiTools_DEFINITIONS})
      add_definitions(${Qt5Concurrent_DEFINITIONS})
      add_definitions(${Qt5PrintSupport_DEFINITIONS})
315
316
317
318
      
      if ( NOT MSVC )
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
      endif()
Matthias Möller's avatar
Matthias Möller committed
319

Matthias Möller's avatar
Matthias Möller committed
320
      set (QT_LIBRARIES ${Qt5Core_LIBRARIES} ${Qt5Declarative_LIBRARIES} ${Qt5Widgets_LIBRARIES}
Matthias Möller's avatar
Matthias Möller committed
321
322
323
        ${Qt5Gui_LIBRARIES} ${Qt5OpenGL_LIBRARIES} ${Qt5Network_LIBRARIES}
        ${Qt5Script_LIBRARIES} ${Qt5ScriptTools_LIBRARIES} ${Qt5Sql_LIBRARIES}
        ${Qt5Xml_LIBRARIES} ${Qt5XmlPatterns_LIBRARIES} ${Qt5Help_LIBRARIES}
324
        ${Qt5WebKit_LIBRARIES} ${Qt5UiTools_LIBRARIES} ${Qt5Concurrent_LIBARIES} ${Qt5PrintSupport_LIBRARIES})
Matthias Möller's avatar
Matthias Möller committed
325
       
326
327
328
      if (MSVC)
        set (QT_LIBRARIES ${QT_LIBRARIES} ${Qt5Core_QTMAIN_LIBRARIES})
      endif()
Matthias Möller's avatar
Matthias Möller committed
329

Matthias Möller's avatar
Matthias Möller committed
330
	  add_definitions(-DQT_NO_OPENGL)
Matthias Möller's avatar
Matthias Möller committed
331

332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
	  #adding QT_NO_DEBUG to all release modes. 
	  #  Note: for multi generators like msvc you cannot set this definition depending of
	  #  the current build type, because it may change in the future inside the ide and not via cmake
	  if (MSVC_IDE)
	    set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /DQT_NO_DEBUG")
	    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /DQT_NO_DEBUG")
		
		set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_RELEASE} /DQT_NO_DEBUG")
	    set(CMAKE_CXX_FLAGS_MINSITEREL "${CMAKE_C_FLAGS_RELEASE} /DQT_NO_DEBUG")
		
		set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} /DQT_NO_DEBUG")
	    set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} /DQT_NO_DEBUG")
	  else(MSVC_IDE)
	    if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
	      add_definitions(-DQT_NO_DEBUG)
	    endif()
      endif(MSVC_IDE)

    endif ()
Matthias Möller's avatar
Matthias Möller committed
351
352
endmacro ()

Jan Möbius's avatar
   
Jan Möbius committed
353
354
355
356
357
358
359
360
361
362
363
364
365
# unsets the given variable
macro (acg_unset var)
    set (${var} "" CACHE INTERNAL "")
endmacro ()

# sets the given variable
macro (acg_set var value)
    set (${var} ${value} CACHE INTERNAL "")
endmacro ()

# test for OpenMP
macro (acg_openmp)
  if (NOT OPENMP_NOTFOUND)
366
367
    # Set off OpenMP on Darwin architectures
    # since it causes crashes sometimes
368
#    if(NOT APPLE)    
369
370
371
372
373
        find_package(OpenMP)
      if (OPENMP_FOUND)
        set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
        set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
        add_definitions(-DUSE_OPENMP)
David Bommes's avatar
David Bommes committed
374
375
376
#      else ()
#        set (OPENMP_NOTFOUND 1)
#      endif ()
377
    endif()
Jan Möbius's avatar
   
Jan Möbius committed
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
  endif ()
endmacro ()

# test for FTGL
macro (acg_ftgl)
  find_package (Freetype)

  if (FREETYPE_FOUND)
    find_package (FTGL)

    if (FTGL_FOUND)
      add_definitions (-DUSE_FTGL)
      include_directories (${FTGL_INCLUDE_DIR} ${FREETYPE_INCLUDE_DIR_freetype2})
      set (FTGL_LIBS ${FREETYPE_LIBRARIES} ${FTGL_LIBRARIES})
    endif ()
  endif ()
endmacro ()

# append all files with extension "ext" in the "dirs" directories to "ret"
397
# excludes all files starting with a '.' (dot)
Jan Möbius's avatar
   
Jan Möbius committed
398
399
400
macro (acg_append_files ret ext)
  foreach (_dir ${ARGN})
    file (GLOB _files "${_dir}/${ext}")
401
402
403
404
405
406
    foreach (_file ${_files})
      get_filename_component (_filename ${_file} NAME)
      if (_filename MATCHES "^[.]")
	list (REMOVE_ITEM _files ${_file})
      endif ()
    endforeach ()
Jan Möbius's avatar
   
Jan Möbius committed
407
408
409
410
411
    list (APPEND ${ret} ${_files})
  endforeach ()
endmacro ()

# append all files with extension "ext" in the "dirs" directories and its subdirectories to "ret"
412
# excludes all files starting with a '.' (dot)
Jan Möbius's avatar
   
Jan Möbius committed
413
414
macro (acg_append_files_recursive ret ext)
  foreach (_dir ${ARGN})
415
    file (GLOB_RECURSE _files "${_dir}/${ext}")
416
417
418
419
420
421
    foreach (_file ${_files})
      get_filename_component (_filename ${_file} NAME)
      if (_filename MATCHES "^[.]")
	list (REMOVE_ITEM _files ${_file})
      endif ()
    endforeach ()
Jan Möbius's avatar
   
Jan Möbius committed
422
423
424
425
    list (APPEND ${ret} ${_files})
  endforeach ()
endmacro ()

426

Jan Möbius's avatar
   
Jan Möbius committed
427
428
429
430
431
432
433
434
435
436
437
438
# drop all "*T.cc" files from list
macro (acg_drop_templates list)
  foreach (_file ${${list}})
    if (_file MATCHES "T.cc$")
      list (REMOVE_ITEM ${list} ${_file})
    endif ()
  endforeach ()
endmacro ()

# generate moc targets for sources in list
macro (acg_qt4_automoc moc_SRCS)
  qt4_get_moc_flags (_moc_INCS)
439
440
  
  list(REMOVE_DUPLICATES _moc_INCS)
Jan Möbius's avatar
   
Jan Möbius committed
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474

  set (_matching_FILES )
  foreach (_current_FILE ${ARGN})

     get_filename_component (_abs_FILE ${_current_FILE} ABSOLUTE)
     # 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
     get_source_file_property (_skip ${_abs_FILE} SKIP_AUTOMOC)

     if ( NOT _skip AND EXISTS ${_abs_FILE} )

        file (READ ${_abs_FILE} _contents)

        get_filename_component (_abs_PATH ${_abs_FILE} PATH)

        string (REGEX MATCHALL "Q_OBJECT" _match "${_contents}")
        if (_match)
            get_filename_component (_basename ${_current_FILE} NAME_WE)
            set (_header ${_abs_FILE})
            set (_moc    ${CMAKE_CURRENT_BINARY_DIR}/moc_${_basename}.cpp)

            add_custom_command (OUTPUT ${_moc}
                COMMAND ${QT_MOC_EXECUTABLE}
                ARGS ${_moc_INCS} ${_header} -o ${_moc}
                DEPENDS ${_header}
            )

            add_file_dependencies (${_abs_FILE} ${_moc})
            set (${moc_SRCS} ${${moc_SRCS}} ${_moc})
475
            
Matthias Möller's avatar
Matthias Möller committed
476
477
478
479
480
481
482
483
        endif ()
     endif ()
  endforeach ()
endmacro ()

# generate moc targets for sources in list
macro (acg_qt5_automoc moc_SRCS)
  qt5_get_moc_flags (_moc_INCS)
484
485
  
  list(REMOVE_DUPLICATES _moc_INCS)
Matthias Möller's avatar
Matthias Möller committed
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520

  set (_matching_FILES )
  foreach (_current_FILE ${ARGN})

     get_filename_component (_abs_FILE ${_current_FILE} ABSOLUTE)
     # 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
     get_source_file_property (_skip ${_abs_FILE} SKIP_AUTOMOC)

     if ( NOT _skip AND EXISTS ${_abs_FILE} )

        file (READ ${_abs_FILE} _contents)

        get_filename_component (_abs_PATH ${_abs_FILE} PATH)

        string (REGEX MATCHALL "Q_OBJECT" _match "${_contents}")
        if (_match)
            get_filename_component (_basename ${_current_FILE} NAME_WE)
            set (_header ${_abs_FILE})
            set (_moc    ${CMAKE_CURRENT_BINARY_DIR}/moc_${_basename}.cpp)

            add_custom_command (OUTPUT ${_moc}
                COMMAND ${QT_MOC_EXECUTABLE}
                ARGS ${_moc_INCS} ${_header} -o ${_moc}
                DEPENDS ${_header}
            )

            add_file_dependencies (${_abs_FILE} ${_moc})
            set (${moc_SRCS} ${${moc_SRCS}} ${_moc})

Jan Möbius's avatar
   
Jan Möbius committed
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
        endif ()
     endif ()
  endforeach ()
endmacro ()

# generate uic targets for sources in list
macro (acg_qt4_autouic uic_SRCS)

  set (_matching_FILES )
  foreach (_current_FILE ${ARGN})

     get_filename_component (_abs_FILE ${_current_FILE} ABSOLUTE)

     if ( EXISTS ${_abs_FILE} )

        file (READ ${_abs_FILE} _contents)

        get_filename_component (_abs_PATH ${_abs_FILE} PATH)

        get_filename_component (_basename ${_current_FILE} NAME_WE)
        string (REGEX REPLACE "Ui$" "" _cbasename ${_basename})
        set (_outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${_basename}.hh)
        set (_header ${_basename}.hh)
        set (_source ${_abs_PATH}/${_cbasename}.cc)
545
        
Jan Möbius's avatar
   
Jan Möbius committed
546
547
548
549
550
551
552
        add_custom_command (OUTPUT ${_outfile}
            COMMAND ${QT_UIC_EXECUTABLE}
            ARGS -o ${_outfile} ${_abs_FILE}
            DEPENDS ${_abs_FILE})

        add_file_dependencies (${_source} ${_outfile})
        set (${uic_SRCS} ${${uic_SRCS}} ${_outfile})
553
            
Jan Möbius's avatar
   
Jan Möbius committed
554
555
556
557
     endif ()
  endforeach ()
endmacro ()

Matthias Möller's avatar
Matthias Möller committed
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
# generate uic targets for sources in list
macro (acg_qt5_autouic uic_SRCS)

  set (_matching_FILES )
  foreach (_current_FILE ${ARGN})

     get_filename_component (_abs_FILE ${_current_FILE} ABSOLUTE)

     if ( EXISTS ${_abs_FILE} )

        file (READ ${_abs_FILE} _contents)

        get_filename_component (_abs_PATH ${_abs_FILE} PATH)

        get_filename_component (_basename ${_current_FILE} NAME_WE)
        string (REGEX REPLACE "Ui$" "" _cbasename ${_basename})
        set (_outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${_basename}.hh)
        set (_header ${_basename}.hh)
        set (_source ${_abs_PATH}/${_cbasename}.cc)

        add_custom_command (OUTPUT ${_outfile}
            COMMAND ${Qt5Widgets_UIC_EXECUTABLE}
            ARGS -o ${_outfile} ${_abs_FILE}
            DEPENDS ${_abs_FILE})

        add_file_dependencies (${_source} ${_outfile})
        set (${uic_SRCS} ${${uic_SRCS}} ${_outfile})

     endif ()
  endforeach ()
endmacro ()
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605

# generate qrc targets for sources in list
macro (acg_qt4_autoqrc qrc_SRCS)

  set (_matching_FILES )
  foreach (_current_FILE ${ARGN})

     get_filename_component (_abs_FILE ${_current_FILE} ABSOLUTE)

     if ( EXISTS ${_abs_FILE} )

        file (READ ${_abs_FILE} _contents)

        get_filename_component (_abs_PATH ${_abs_FILE} PATH)

        get_filename_component (_basename ${_current_FILE} NAME_WE)
        set (_outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${_basename}.cpp)
606
        
Matthias Möller's avatar
Matthias Möller committed
607
608
609
        add_custom_command (OUTPUT ${_outfile}
            COMMAND ${QT_RCC_EXECUTABLE}
            ARGS -o ${_outfile}  ${_abs_FILE}
610
            DEPENDS ${_abs_FILE}) 
Matthias Möller's avatar
Matthias Möller committed
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635

        add_file_dependencies (${_source} ${_outfile})
        set (${qrc_SRCS} ${${qrc_SRCS}} ${_outfile})

     endif ()
  endforeach ()
endmacro ()

# generate qrc targets for sources in list
macro (acg_qt5_autoqrc qrc_SRCS)

  set (_matching_FILES )
  foreach (_current_FILE ${ARGN})

     get_filename_component (_abs_FILE ${_current_FILE} ABSOLUTE)

     if ( EXISTS ${_abs_FILE} )

        file (READ ${_abs_FILE} _contents)

        get_filename_component (_abs_PATH ${_abs_FILE} PATH)

        get_filename_component (_basename ${_current_FILE} NAME_WE)
        set (_outfile ${CMAKE_CURRENT_BINARY_DIR}/qrc_${_basename}.cpp)

636
637
638
        add_custom_command (OUTPUT ${_outfile}
            COMMAND ${QT_RCC_EXECUTABLE}
            ARGS -o ${_outfile}  ${_abs_FILE}
Matthias Möller's avatar
Matthias Möller committed
639
            DEPENDS ${_abs_FILE})
640
641
642
643
644
645
646
647

        add_file_dependencies (${_source} ${_outfile})
        set (${qrc_SRCS} ${${qrc_SRCS}} ${_outfile})

     endif ()
  endforeach ()
endmacro ()

Jan Möbius's avatar
   
Jan Möbius committed
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
# get all files in directory, but ignore svn
macro (acg_get_files_in_dir ret dir)
  file (GLOB_RECURSE __files RELATIVE "${dir}" "${dir}/*")
  foreach (_file ${__files})
    if (NOT _file MATCHES ".*svn.*")
      list (APPEND ${ret} "${_file}")
    endif ()
  endforeach ()
endmacro ()

# copy the whole directory without svn files
function (acg_copy_after_build target src dst)
  acg_unset (_files)
  acg_get_files_in_dir (_files ${src})
  foreach (_file ${_files})
    add_custom_command(TARGET ${target} POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy_if_different "${src}/${_file}" "${dst}/${_file}"
    )
  endforeach ()
endfunction ()

# install the whole directory without svn files
function (acg_install_dir src dst)
  acg_unset (_files)
  acg_get_files_in_dir (_files ${src})
  foreach (_file ${_files})
    get_filename_component (_file_PATH ${_file} PATH)
    install(FILES "${src}/${_file}"
      DESTINATION "${dst}/${_file_PATH}"
    )
  endforeach ()
endfunction ()

# extended version of add_executable that also copies output to out Build directory
function (acg_add_executable _target)
  add_executable (${_target} ${ARGN})

  # set common target properties defined in common.cmake
  acg_set_target_props (${_target})

688
  if (WIN32 OR (APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE))
Jan Möbius's avatar
   
Jan Möbius committed
689
690
691
    add_custom_command (TARGET ${_target} POST_BUILD
                        COMMAND ${CMAKE_COMMAND} -E
                        copy_if_different
692
693
694
695
                          $<TARGET_FILE:${_target}>
                          ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_BINDIR}/$<TARGET_FILE_NAME:${_target}>)
  endif (WIN32 OR (APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE))
  
696
  if (NOT ACG_PROJECT_MACOS_BUNDLE OR NOT APPLE)
Jan Möbius's avatar
   
Jan Möbius committed
697
698
699
700
701
    install (TARGETS ${_target} DESTINATION ${ACG_PROJECT_BINDIR})
  endif ()
endfunction ()

# extended version of add_library that also copies output to out Build directory
702
703
704
705
706
707
708
709
function (acg_add_library _target _libtype)

  if (${_libtype} STREQUAL SHAREDANDSTATIC)
    set (_type SHARED)
    if (NOT WIN32)
      set (_and_static 1)
    else ()
      set (_and_static 0)
710
    endif ()    
711
712
713
714
715
  else ()
    set (_type ${_libtype})
    set (_and_static 0)
  endif ()

716
717
  add_library (${_target} ${_type} ${ARGN} )

Jan Möbius's avatar
   
Jan Möbius committed
718
719
720
  # set common target properties defined in common.cmake
  acg_set_target_props (${_target})

721
722
723
724
725
  if (_and_static)
    add_library (${_target}Static STATIC ${ARGN})

    # set common target properties defined in common.cmake
    acg_set_target_props (${_target}Static)
726
    
727
    if (NOT APPLE)
728
      set_target_properties (${_target}Static PROPERTIES 
729
730
                             LIBRARY_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}"
                            )
731
732
733
    endif ()
  endif ()

734
  if (WIN32 OR (APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE))
Jan Möbius's avatar
   
Jan Möbius committed
735
736
737
738
    if (${_type} STREQUAL SHARED)
      add_custom_command (TARGET ${_target} POST_BUILD
                          COMMAND ${CMAKE_COMMAND} -E
                          copy_if_different
739
740
741
                            $<TARGET_FILE:${_target}>
                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}/$<TARGET_FILE_NAME:${_target}>)
    add_custom_command (TARGET ${_target} POST_BUILD
Jan Möbius's avatar
   
Jan Möbius committed
742
743
                          COMMAND ${CMAKE_COMMAND} -E
                          copy_if_different
744
745
                            $<TARGET_LINKER_FILE:${_target}>
                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}/$<TARGET_LINKER_FILE_NAME:${_target}>)
Jan Möbius's avatar
   
Jan Möbius committed
746
747
748
749
    elseif (${_type} STREQUAL MODULE)
      if (NOT EXISTS ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_PLUGINDIR})
        file (MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_PLUGINDIR})
      endif ()
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
750
      add_custom_command (TARGET ${_target} POST_BUILD
Jan Möbius's avatar
   
Jan Möbius committed
751
752
                          COMMAND ${CMAKE_COMMAND} -E
                          copy_if_different
753
754
                            $<TARGET_FILE:${_target}>
                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_PLUGINDIR}/$<TARGET_FILE_NAME:${_target}>)
755
    elseif (${_type} STREQUAL STATIC)
756
    add_custom_command (TARGET ${_target} POST_BUILD
757
758
                          COMMAND ${CMAKE_COMMAND} -E
                          copy_if_different
759
760
761
762
763
764
765
766
                            $<TARGET_FILE:${_target}>
                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}/$<TARGET_FILE_NAME:${_target}>)
  endif()
  
   
  # make an extra copy for windows into the binary directory
    if (${_type} STREQUAL SHARED AND WIN32)
      add_custom_command (TARGET ${_target} POST_BUILD
767
                          COMMAND ${CMAKE_COMMAND} -E
768
769
770
771
772
773
774
775
776
777
778
779
                          copy_if_different 
                            $<TARGET_FILE:${_target}>
                            ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_BINDIR}/$<TARGET_FILE_NAME:${_target}>)
  endif () 
    
  endif(WIN32 OR (APPLE AND NOT ACG_PROJECT_MACOS_BUNDLE))
  
  if (_and_static)
    if( ${CMAKE_BUILD_TYPE} STREQUAL Debug )
      set ( postfix ${CMAKE_DEBUG_POSTFIX} )
    else ()
      set ( postfix "" )
Jan Möbius's avatar
   
Jan Möbius committed
780
    endif ()
781

782
783
784
785
786
787
    set( fullname ${_target}${postfix} )
    add_custom_command (TARGET ${_target}Static POST_BUILD
                        COMMAND ${CMAKE_COMMAND} -E
                        copy_if_different
                          $<TARGET_FILE:${_target}Static>
                          ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_LIBDIR}/lib${fullname}.a)
788

Jan Möbius's avatar
   
Jan Möbius committed
789
  endif ()
790
 
791
792

  # Block installation of libraries by setting ACG_NO_LIBRARY_INSTALL
793
  if ( NOT ACG_NO_LIBRARY_INSTALL ) 
794
795
796
797
798
799
800
    if (NOT ACG_PROJECT_MACOS_BUNDLE OR NOT APPLE)
      if (${_type} STREQUAL SHARED OR ${_type} STREQUAL STATIC )
        install (TARGETS ${_target}
                 RUNTIME DESTINATION ${ACG_PROJECT_BINDIR}
                 LIBRARY DESTINATION ${ACG_PROJECT_LIBDIR}
                 ARCHIVE DESTINATION ${ACG_PROJECT_LIBDIR})
        if (_and_static)
801
          install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${_target}Static${postfix}.a
802
                   DESTINATION ${ACG_PROJECT_LIBDIR}
803
                   RENAME lib${fullname}.a
804
805
806
807
                   PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
        endif ()
      elseif (${_type} STREQUAL MODULE)
        install (TARGETS ${_target} DESTINATION ${ACG_PROJECT_PLUGINDIR})
808
      endif ()
Jan Möbius's avatar
   
Jan Möbius committed
809
    endif ()
810
  endif()
Jan Möbius's avatar
Jan Möbius committed
811

Jan Möbius's avatar
   
Jan Möbius committed
812
endfunction ()
Jan Möbius's avatar
Jan Möbius committed
813
814
815
816
817
818
819
820
821
822
823
824
825

#generates qt translations
function (acg_add_translations _target _languages _sources)

  string (TOUPPER ${_target} _TARGET)
  # generate/use translation files
  # run with UPDATE_TRANSLATIONS set to on to build qm files
  option (UPDATE_TRANSLATIONS_${_TARGET} "Update source translation *.ts files (WARNING: make clean will delete the source .ts files! Danger!)")

  set (_new_ts_files)
  set (_ts_files)

  foreach (lang ${_languages})
Jan Möbius's avatar
Jan Möbius committed
826
827
    if (NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/translations/${_target}_${lang}.ts" OR UPDATE_TRANSLATIONS_${_TARGET})
      list (APPEND _new_ts_files "translations/${_target}_${lang}.ts")
Jan Möbius's avatar
Jan Möbius committed
828
    else ()
Jan Möbius's avatar
Jan Möbius committed
829
      list (APPEND _ts_files "translations/${_target}_${lang}.ts")
Jan Möbius's avatar
Jan Möbius committed
830
831
832
    endif ()
  endforeach ()

Jan Möbius's avatar
Jan Möbius committed
833

Jan Möbius's avatar
Jan Möbius committed
834
  set (_qm_files)
Jan Möbius's avatar
Jan Möbius committed
835
  if ( _new_ts_files )
Matthias Möller's avatar
Matthias Möller committed
836
837
838
    if (QT5_FOUND)
      #qt5_create_translation(_qm_files ${_sources} ${_new_ts_files})
    elseif (QT4_FOUND)
839
840
    qt4_create_translation(_qm_files ${_sources} ${_new_ts_files})
  endif ()
Jan Möbius's avatar
Jan Möbius committed
841
842
  endif ()

Jan Möbius's avatar
Jan Möbius committed
843
  if ( _ts_files )
Matthias Möller's avatar
Matthias Möller committed
844
845
846
    if (QT5_FOUND)
      #qt5_add_translation(_qm_files2 ${_ts_files})
    elseif (QT4_FOUND)
847
    qt4_add_translation(_qm_files2 ${_ts_files})
Matthias Möller's avatar
Matthias Möller committed
848
    endif()
Jan Möbius's avatar
Jan Möbius committed
849
850
851
852
853
854
855
856
857
858
859
860
861
862
    list (APPEND _qm_files ${_qm_files2})
  endif ()

  # create a target for the translation files ( and object files )
  # Use this target, to update only the translations
  add_custom_target (translations_target_${_target} DEPENDS ${_qm_files})

  # Build translations with the application
  add_dependencies(${_target} translations_target_${_target} )

  if (NOT EXISTS ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_DATADIR}/Translations)
    file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_DATADIR}/Translations )
  endif ()

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
863
864
865
866
867
868
869
870
  foreach (_qm ${_qm_files})
    get_filename_component (_qm_name "${_qm}" NAME)
    add_custom_command (TARGET translations_target_${_target} POST_BUILD
                        COMMAND ${CMAKE_COMMAND} -E
                        copy_if_different
                          ${_qm}
                          ${CMAKE_BINARY_DIR}/Build/${ACG_PROJECT_DATADIR}/Translations/${_qm_name})
  endforeach ()
Jan Möbius's avatar
Jan Möbius committed
871
872

  if (NOT ACG_PROJECT_MACOS_BUNDLE OR NOT APPLE)
873
    install (FILES ${_qm_files} DESTINATION "${ACG_PROJECT_DATADIR}/Translations")
Jan Möbius's avatar
Jan Möbius committed
874
875
  endif ()
endfunction ()
876
877
878
879
880
881
882

# Function that writes all generated qch files into one Help.qhcp project file
function (generate_qhp_file files_loc plugin_name)

    set(qhp_file "${files_loc}/${plugin_name}.qhp")
    # Read in template file
    file(STRINGS "${CMAKE_SOURCE_DIR}/OpenFlipper/Documentation/QtHelpResources/QtHelpProject.qhp" qhp_template)
883
    
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
    # Initialize new project file
    file(WRITE ${qhp_file} "")
    foreach (_line ${qhp_template})
        string(STRIP ${_line} stripped)
        if("${stripped}" STREQUAL "files")
            acg_get_files_in_dir (_files ${files_loc})
            foreach (_file ${_files})
                string(REGEX MATCH ".+[.]+((html)|(htm)|(xml))$" fileresult ${_file})
                string(LENGTH "${fileresult}" len)
                if(${len} GREATER 0)
                    file(APPEND ${qhp_file} "<file>${_file}</file>\n")
                endif()
            endforeach()
        else()
            string(REGEX REPLACE "plugin" ${plugin} newline ${_line})
            file(APPEND ${qhp_file} "${newline}\n")
        endif()
    endforeach()
endfunction()