Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/pch/cmake/TargetUtilities.cmake @ 3117

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

Adding experimental precompiled header file support. It seems to work quite well with MSVC, but has a performance penalty when used with GCC

  • Property svn:eol-style set to native
File size: 6.8 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 #
27 #    Switches: (when given --> TRUE, FALSE otherwise)
28 #      FIND_HEADER_FILES: Searches the current directory for all header files
29 #                         and adds them to the target.
30 #      EXCLUDE_FROM_ALL:  Inherited from ADD_LIBRARY/ADD_EXECUTABLE
31 #      ORXONOX_EXTERNAL:  Specify this for third party libraries
32 #      NO_DLL_INTERFACE:  Link statically with MSVC
33 #      NO_SOURCE_GROUPS:  Don't create msvc source groups
34 #      STATIC/SHARED:     Inherited from ADD_LIBRARY
35 #      WIN32:             Inherited from ADD_EXECUTABLE
36 #      PCH_NO_DEFAULT:    Do not make precompiled header files default if
37 #                         specified with PCH_FILE
38 #    Lists:
39 #      LINK_LIBRARIES:    Redirects to TARGET_LINK_LIBRARIES
40 #      VERSION:           Set version to the binary
41 #      SOURCE_FILES:      Source files for the target
42 #      DEFINE_SYMBOL:     Sets the DEFINE_SYMBOL target property
43 #      TOLUA_FILES:       Files with tolua interface
44 #      PCH_FILE:          Precompiled header file
45 #      PCH_EXCLUDE:       Source files to be excluded from PCH support
46 #  Note:
47 #    This function also installs the target!
48 #  Prerequisistes:
49 #    ORXONOX_DEFAULT_LINK, ORXONOX_CONFIG_FILES
50 #  Parameters:
51 #    _target_name, ARGN for the macro arguments
52 #
53
54INCLUDE(CapitaliseName)
55INCLUDE(GenerateToluaBindings)
56INCLUDE(ParseMacroArguments)
57INCLUDE(SourceFileUtilities)
58IF(PCH_COMPILER_SUPPORT)
59  INCLUDE(PrecompiledHeaderFiles)
60ENDIF()
61
62FUNCTION(ORXONOX_ADD_LIBRARY _target_name)
63  TU_ADD_TARGET(${_target_name} LIBRARY "STATIC;SHARED" ${ARGN})
64ENDFUNCTION(ORXONOX_ADD_LIBRARY)
65
66FUNCTION(ORXONOX_ADD_EXECUTABLE _target_name)
67  TU_ADD_TARGET(${_target_name} EXECUTABLE "WIN32" ${ARGN})
68ENDFUNCTION(ORXONOX_ADD_EXECUTABLE)
69
70
71FUNCTION(TU_ADD_TARGET _target_name _target_type _additional_switches)
72  CAPITALISE_NAME(${_target_name} _target_name_capitalised)
73
74  # Specify all possible options (either switch or with add. arguments)
75  SET(_switches   FIND_HEADER_FILES  EXCLUDE_FROM_ALL  ORXONOX_EXTERNAL
76                  NO_DLL_INTERFACE   NO_SOURCE_GROUPS  ${_additional_switches}
77                  PCH_NO_DEFAULT)
78  SET(_list_names LINK_LIBRARIES  VERSION   SOURCE_FILES  DEFINE_SYMBOL
79                  TOLUA_FILES     PCH_FILE  PCH_EXCLUDE)
80  PARSE_MACRO_ARGUMENTS("${_switches}" "${_list_names}" ${ARGN})
81
82
83  # GET_HEADER_FILES
84  IF(_arg_FIND_HEADER_FILES)
85    GET_ALL_HEADER_FILES(_${target_name}_header_files)
86  ENDIF()
87
88  # Remove potential duplicates
89  SET(_${_target_name}_files ${_${target_name}_header_files} ${_arg_SOURCE_FILES})
90  LIST(REMOVE_DUPLICATES _${_target_name}_files)
91
92  # Generate the source groups
93  IF(NOT _arg_NO_SOURCE_GROUPS)
94    GENERATE_SOURCE_GROUPS(${_${_target_name}_files})
95
96    IF(NOT _arg_ORXONOX_EXTERNAL)
97      # Move the prereqs.h file to the config section
98      IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_target_name_capitalised}Prereqs.h)
99        SOURCE_GROUP("Config" FILES ${_target_name_capitalised}Prereqs.h)
100      ENDIF()
101      # Add the config files in a special source group
102      LIST(APPEND _${_target_name}_files ${ORXONOX_CONFIG_FILES})
103      SOURCE_GROUP("Config" FILES ${ORXONOX_CONFIG_FILES})
104    ENDIF()
105  ENDIF(NOT _arg_NO_SOURCE_GROUPS)
106
107  # TOLUA_FILES
108  IF(_arg_TOLUA_FILES)
109    GENERATE_TOLUA_BINDINGS(${_target_name_capitalised} _${_target_name}_files
110                            INPUTFILES ${_arg_TOLUA_FILES})
111  ENDIF()
112
113  # First part (pre target) of precompiled header files
114  IF(PCH_COMPILER_SUPPORT AND _arg_PCH_FILE)
115    # Provide convenient option to control PCH
116    STRING(TOUPPER "${_target_name}" _target_name_upper)
117    IF(_arg_PCH_NO_DEFAULT)
118      SET(PCH_DEFAULT FALSE)
119    ELSE()
120      SET(PCH_DEFAULT TRUE)
121    ENDIF()
122    OPTION(PCH_ENABLE_${_target_name_upper} "Enable using precompiled header files for library ${_target_name}." ${PCH_DEFAULT})
123
124    IF(PCH_ENABLE_${_target_name_upper})
125      PRECOMPILED_HEADER_FILES_PRE_TARGET(${_target_name} ${_arg_PCH_FILE} _${_target_name}_files EXCLUDE ${_arg_PCH_EXCLUDE})
126    ENDIF()
127  ENDIF()
128
129  # Certain libraries don't have dllexport/dllimport and can't be linked shared with msvc
130  IF(MSVC AND _arg_NO_DLL_INTERFACE)
131    SET(_arg_SHARED)
132    SET(_arg_STATIC STATIC)
133  ENDIF()
134
135  # Set default linking if required
136  IF(NOT _arg_SHARED AND NOT _arg_STATIC)
137    IF("${ORXONOX_DEFAULT_LINK}" STREQUAL "STATIC")
138      SET(_arg_STATIC STATIC)
139    ELSEIF("${ORXONOX_DEFAULT_LINK}" STREQUAL "SHARED")
140      SET(_arg_SHARED SHARED)
141    ENDIF()
142  ENDIF()
143
144  # Add the library/executable
145  IF("${_target_type}" STREQUAL "LIBRARY")
146    ADD_LIBRARY(${_target_name} ${_arg_STATIC} ${_arg_SHARED}
147                ${_arg_EXCLUDE_FROM_ALL} ${_${_target_name}_files})
148  ELSE()
149    ADD_EXECUTABLE(${_target_name} ${_arg_WIN32} ${_arg_EXCLUDE_FROM_ALL}
150                   ${_${_target_name}_files})
151  ENDIF()
152
153  # LINK_LIBRARIES
154  IF(_arg_LINK_LIBRARIES)
155    TARGET_LINK_LIBRARIES(${_target_name} ${_arg_LINK_LIBRARIES})
156  ENDIF()
157
158  # DEFINE_SYMBOL
159  IF(_arg_DEFINE_SYMBOL)
160    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES DEFINE_SYMBOL ${_arg_DEFINE_SYMBOL})
161  ENDIF()
162
163  # VERSION
164  IF(_arg_VERSION)
165    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES VERSION ${_arg_VERSION})
166  ELSEIF(NOT ORXONOX_EXTERNAL)
167    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES VERSION ${ORXONOX_VERSION})
168  ENDIF()
169
170  # Second part of precompiled header files
171  IF(PCH_COMPILER_SUPPORT AND PCH_ENABLE_${_target_name_upper} AND _arg_PCH_FILE)
172    PRECOMPILED_HEADER_FILES_POST_TARGET(${_target_name} ${_arg_PCH_FILE})
173  ENDIF()
174
175  IF(NOT _arg_STATIC)
176    INSTALL(TARGETS ${_target_name}
177      RUNTIME DESTINATION ${ORXONOX_RUNTIME_INSTALL_PATH}
178      LIBRARY DESTINATION ${ORXONOX_LIBRARY_INSTALL_PATH}
179      #ARCHIVE DESTINATION ${ORXONOX_ARCHIVE_INSTALL_PATH}
180    )
181  ENDIF()
182
183ENDFUNCTION(TU_ADD_TARGET)
Note: See TracBrowser for help on using the repository browser.