Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/cmake/TargetUtilities.cmake @ 5929

Last change on this file since 5929 was 5929, checked in by rgrieder, 15 years ago

Merged core5 branch back to the trunk.
Key features include clean level unloading and an extended XML event system.

Two important notes:
Delete your keybindings.ini files! * or you will still get parser errors when loading the key bindings.
Delete build_dir/lib/modules/libgamestates.module! * or orxonox won't start.
Best thing to do is to delete the build folder ;)

  • Property svn:eol-style set to native
File size: 10.0 KB
Line 
1 #
2 #             ORXONOX - the hottest 3D action shooter ever to exist
3 #                             > www.orxonox.net <
4 #
5 #        This program is free software; you can redistribute it and/or
6 #         modify it under the terms of the GNU General Public License
7 #        as published by the Free Software Foundation; either version 2
8 #            of the License, or (at your option) any later version.
9 #
10 #       This program is distributed in the hope that it will be useful,
11 #        but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 #                 GNU General Public License for more details.
14 #
15 #   You should have received a copy of the GNU General Public License along
16 #      with this program; if not, write to the Free Software Foundation,
17 #     Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18 #
19 #
20 #  Author:
21 #    Reto Grieder
22 #  Description:
23 #    Adds a library or an executable like ADD_LIBRARY/ADD_EXECUTABLE, but
24 #    accepts a lot more input information. Simply supply the keywords
25 #    described below in any order you wish.
26 #    The output is then stored in "_arg_ARGNAME" where ARGNAME is the the
27 #    name of the switch or list.
28 #
29 #    Switches: (when given --> TRUE, FALSE otherwise)
30 #      FIND_HEADER_FILES: Searches the current directory for all header files
31 #                         and adds them to the target.
32 #      EXCLUDE_FROM_ALL:  Inherited from ADD_LIBRARY/ADD_EXECUTABLE
33 #      ORXONOX_EXTERNAL:  Specify this for third party libraries
34 #      NO_DLL_INTERFACE:  Link statically with MSVC
35 #      NO_SOURCE_GROUPS:  Don't create msvc source groups
36 #      STATIC/SHARED:     Inherited from ADD_LIBRARY
37 #      MODULE:            For dynamic module libraries
38 #      WIN32:             Inherited from ADD_EXECUTABLE
39 #      PCH_NO_DEFAULT:    Do not make precompiled header files default if
40 #                         specified with PCH_FILE
41 #      NO_INSTALL:        Do not install the target at all
42 #
43 #    Lists:
44 #      LINK_LIBRARIES:    Redirects to TARGET_LINK_LIBRARIES
45 #      VERSION:           Set version to the binary
46 #      SOURCE_FILES:      Source files for the target
47 #      DEFINE_SYMBOL:     Sets the DEFINE_SYMBOL target property
48 #      TOLUA_FILES:       Files with tolua interface
49 #      PCH_FILE:          Precompiled header file
50 #      PCH_EXCLUDE:       Source files to be excluded from PCH support
51 #      OUTPUT_NAME:       If you want a different name than the target name
52 #  Note:
53 #    This function also installs the target!
54 #  Prerequisistes:
55 #    ORXONOX_DEFAULT_LINK, ORXONOX_CONFIG_FILES
56 #  Parameters:
57 #    _target_name, ARGN for the macro arguments
58 #
59
60INCLUDE(CMakeDependentOption)
61INCLUDE(CapitaliseName)
62INCLUDE(GenerateToluaBindings)
63INCLUDE(ParseMacroArguments)
64INCLUDE(SourceFileUtilities)
65IF(PCH_COMPILER_SUPPORT)
66  INCLUDE(PrecompiledHeaderFiles)
67ENDIF()
68
69MACRO(ORXONOX_ADD_LIBRARY _target_name)
70  TU_ADD_TARGET(${_target_name} LIBRARY "STATIC;SHARED" ${ARGN})
71ENDMACRO(ORXONOX_ADD_LIBRARY)
72
73MACRO(ORXONOX_ADD_EXECUTABLE _target_name)
74  TU_ADD_TARGET(${_target_name} EXECUTABLE "WIN32" ${ARGN})
75ENDMACRO(ORXONOX_ADD_EXECUTABLE)
76
77
78MACRO(TU_ADD_TARGET _target_name _target_type _additional_switches)
79  CAPITALISE_NAME(${_target_name} _target_name_capitalised)
80
81  # Specify all possible options (either switch or with add. arguments)
82  SET(_switches   FIND_HEADER_FILES  EXCLUDE_FROM_ALL  ORXONOX_EXTERNAL
83                  NO_DLL_INTERFACE   NO_SOURCE_GROUPS  ${_additional_switches}
84                  PCH_NO_DEFAULT     NO_INSTALL        MODULE)
85  SET(_list_names LINK_LIBRARIES  VERSION   SOURCE_FILES  DEFINE_SYMBOL
86                  TOLUA_FILES     PCH_FILE  PCH_EXCLUDE OUTPUT_NAME)
87  PARSE_MACRO_ARGUMENTS("${_switches}" "${_list_names}" ${ARGN})
88
89
90  # Workaround: Source file properties get lost when leaving a subdirectory
91  # Therefore an "H" after a file means we have to set it as HEADER_FILE_ONLY
92  FOREACH(_file ${_arg_SOURCE_FILES})
93    IF(_file STREQUAL "H")
94      SET_SOURCE_FILES_PROPERTIES(${_last_file} PROPERTIES HEADER_FILE_ONLY TRUE)
95    ELSE()
96      SET(_last_file ${_file})
97      LIST(APPEND _${_target_name}_source_files ${_file})
98    ENDIF()
99  ENDFOREACH(_file)
100
101  # Assemble all header files of the library
102  IF(_arg_FIND_HEADER_FILES)
103    GET_ALL_HEADER_FILES(_${_target_name}_header_files)
104  ENDIF()
105
106  # Remove potential duplicates
107  SET(_${_target_name}_files ${_${_target_name}_header_files} ${_${_target_name}_source_files})
108  LIST(REMOVE_DUPLICATES _${_target_name}_files)
109
110  # Generate the source groups
111  IF(NOT _arg_NO_SOURCE_GROUPS)
112    GENERATE_SOURCE_GROUPS(${_${_target_name}_files})
113
114    IF(NOT _arg_ORXONOX_EXTERNAL)
115      # Move the prereqs.h file to the config section
116      IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_target_name_capitalised}Prereqs.h)
117        SOURCE_GROUP("Config" FILES ${_target_name_capitalised}Prereqs.h)
118      ENDIF()
119      # Add the config files in a special source group
120      LIST(APPEND _${_target_name}_files ${ORXONOX_CONFIG_FILES})
121      SOURCE_GROUP("Config" FILES ${ORXONOX_CONFIG_FILES})
122    ENDIF()
123  ENDIF(NOT _arg_NO_SOURCE_GROUPS)
124
125  # TOLUA_FILES
126  IF(_arg_TOLUA_FILES)
127    GENERATE_TOLUA_BINDINGS(${_target_name_capitalised} _${_target_name}_files
128                            INPUTFILES ${_arg_TOLUA_FILES})
129  ENDIF()
130
131  # First part (pre target) of precompiled header files
132  IF(PCH_COMPILER_SUPPORT AND _arg_PCH_FILE)
133    # Provide convenient option to control PCH
134    STRING(TOUPPER "${_target_name}" _target_name_upper)
135    IF(_arg_PCH_NO_DEFAULT)
136      SET(PCH_DEFAULT FALSE)
137    ELSE()
138      SET(PCH_DEFAULT TRUE)
139    ENDIF()
140    CMAKE_DEPENDENT_OPTION(PCH_ENABLE_${_target_name_upper}
141      "Enable using precompiled header files for library ${_target_name}." ${PCH_DEFAULT} PCH_ENABLE OFF)
142
143    IF(PCH_ENABLE_${_target_name_upper})
144      PRECOMPILED_HEADER_FILES_PRE_TARGET(${_target_name} ${_arg_PCH_FILE} _${_target_name}_files EXCLUDE ${_arg_PCH_EXCLUDE})
145    ENDIF()
146  ENDIF()
147
148  # Certain libraries don't have dllexport/dllimport and can't be linked shared with msvc
149  IF(MSVC AND _arg_NO_DLL_INTERFACE)
150    SET(_arg_SHARED)
151    SET(_arg_STATIC STATIC)
152  ENDIF()
153
154  # No warnings needed from third party libraries
155  IF(_arg_ORXONOX_EXTERNAL)
156    REMOVE_COMPILER_FLAGS("-W3 -W4" MSVC)
157    ADD_COMPILER_FLAGS("-w")
158  ENDIF()
159
160  # Set default linking if required
161  IF(NOT _arg_SHARED AND NOT _arg_STATIC)
162    IF("${ORXONOX_DEFAULT_LINK}" STREQUAL "STATIC")
163      SET(_arg_STATIC STATIC)
164    ELSEIF("${ORXONOX_DEFAULT_LINK}" STREQUAL "SHARED")
165      SET(_arg_SHARED SHARED)
166    ENDIF()
167  ENDIF()
168
169  # MODULE A
170  # Always create shared libraries
171  IF(_arg_MODULE)
172    SET(_arg_SHARED SHARED)
173    SET(_arg_STATIC)
174  ENDIF()
175
176  # Don't compile header files
177  FOREACH(_file ${_${_target_name}_files})
178    IF(NOT _file MATCHES "\\.(c|cc|cpp)")
179      SET_SOURCE_FILES_PROPERTIES(${_file} PROPERTIES HEADER_FILE_ONLY TRUE)
180    ENDIF()
181  ENDFOREACH(_file)
182
183  # Add the library/executable
184  IF("${_target_type}" STREQUAL "LIBRARY")
185    ADD_LIBRARY(${_target_name} ${_arg_STATIC} ${_arg_SHARED}
186                ${_arg_EXCLUDE_FROM_ALL} ${_${_target_name}_files})
187  ELSE()
188    ADD_EXECUTABLE(${_target_name} ${_arg_WIN32} ${_arg_EXCLUDE_FROM_ALL}
189                   ${_${_target_name}_files})
190  ENDIF()
191
192  # Change library prefix to "lib"
193  IF(MSVC AND ${_target_type} STREQUAL "LIBRARY")
194    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES
195      PREFIX "lib"
196    )
197  ENDIF()
198
199  # MODULE B
200  IF (_arg_MODULE)
201    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES
202      RUNTIME_OUTPUT_DIRECTORY ${CMAKE_MODULE_OUTPUT_DIRECTORY} # Windows
203      LIBRARY_OUTPUT_DIRECTORY ${CMAKE_MODULE_OUTPUT_DIRECTORY} # Unix
204    )
205    ADD_MODULE(${_target_name})
206  ENDIF()
207
208  # LINK_LIBRARIES
209  IF(_arg_LINK_LIBRARIES)
210    TARGET_LINK_LIBRARIES(${_target_name} ${_arg_LINK_LIBRARIES})
211  ENDIF()
212
213  # DEFINE_SYMBOL
214  IF(_arg_DEFINE_SYMBOL)
215    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES DEFINE_SYMBOL ${_arg_DEFINE_SYMBOL})
216  ENDIF()
217
218  # VERSION
219  IF(_arg_VERSION)
220    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES VERSION ${_arg_VERSION})
221  ELSEIF(NOT _arg_ORXONOX_EXTERNAL)
222    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES VERSION ${ORXONOX_VERSION})
223  ENDIF()
224
225  # OUTPUT_NAME
226  IF(_arg_OUTPUT_NAME)
227    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES OUTPUT_NAME  ${_arg_OUTPUT_NAME})
228  ENDIF()
229
230  # Second part of precompiled header files
231  IF(PCH_COMPILER_SUPPORT AND PCH_ENABLE_${_target_name_upper} AND _arg_PCH_FILE)
232    PRECOMPILED_HEADER_FILES_POST_TARGET(${_target_name} ${_arg_PCH_FILE})
233  ENDIF()
234
235  IF(NOT _arg_STATIC AND NOT _arg_NO_INSTALL)
236    IF(_arg_MODULE)
237      INSTALL(TARGETS ${_target_name}
238        RUNTIME DESTINATION ${MODULE_INSTALL_DIRECTORY}
239        LIBRARY DESTINATION ${MODULE_INSTALL_DIRECTORY}
240      )
241    ELSE()
242      INSTALL(TARGETS ${_target_name}
243        RUNTIME DESTINATION ${RUNTIME_INSTALL_DIRECTORY}
244        LIBRARY DESTINATION ${LIBRARY_INSTALL_DIRECTORY}
245      )
246    ENDIF()
247  ENDIF()
248
249ENDMACRO(TU_ADD_TARGET)
250
251
252# Creates a helper file with name <name_of_the_library>${ORXONOX_MODULE_EXTENSION}
253# This helps finding dynamically loadable modules at runtime
254
255FUNCTION(ADD_MODULE _target)
256  # We use the properties to get the name because the librarys name may differ from
257  # the target name (for example orxonox <-> liborxonox)
258
259  GET_TARGET_PROPERTY(_target_loc ${_target} LOCATION)
260  GET_FILENAME_COMPONENT(_target_name ${_target_loc} NAME_WE)
261
262  IF(CMAKE_CONFIGURATION_TYPES)
263    FOREACH(_config ${CMAKE_CONFIGURATION_TYPES})
264      SET(_module_filename ${CMAKE_MODULE_OUTPUT_DIRECTORY}/${_config}/${_target_name}${ORXONOX_MODULE_EXTENSION})
265
266      FILE(WRITE ${_module_filename})
267
268      INSTALL(
269        FILES ${_module_filename}
270        DESTINATION ${MODULE_INSTALL_DIRECTORY}
271        CONFIGURATIONS ${_config}
272      )
273    ENDFOREACH()
274  ELSE()
275    SET(_module_filename ${CMAKE_MODULE_OUTPUT_DIRECTORY}/${_target_name}${ORXONOX_MODULE_EXTENSION})
276
277    FILE(WRITE ${_module_filename})
278
279    INSTALL(
280      FILES ${_module_filename}
281      DESTINATION ${MODULE_INSTALL_DIRECTORY}
282    )
283  ENDIF()
284ENDFUNCTION(ADD_MODULE)
Note: See TracBrowser for help on using the repository browser.