Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/libraries/cmake/TargetUtilities.cmake @ 5649

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

Fixed msvc build: I had to link the plugins as SHARED instead of MODULE because CMake doesn't allow modules to be linked against another module.
The reason why it did work after all was because the quest library was built before overlays causing CMake to link against whatever it found under the name "overlays" in the end (which was of course the output file instead of the CMake representation of a library). Since msvc never links against dlls but rather against the corresponding *.lib file things got completely busted.

Also added the proposed fix for the PATH variable (successfully tested under Windows by deleting the overlays.plugin file).

  • Property svn:eol-style set to native
File size: 8.9 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 #      PLUGIN:            For dynamic plugin 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(CapitaliseName)
61INCLUDE(GenerateToluaBindings)
62INCLUDE(ParseMacroArguments)
63INCLUDE(SourceFileUtilities)
64IF(PCH_COMPILER_SUPPORT)
65  INCLUDE(PrecompiledHeaderFiles)
66ENDIF()
67
68FUNCTION(ORXONOX_ADD_LIBRARY _target_name)
69  TU_ADD_TARGET(${_target_name} LIBRARY "STATIC;SHARED" ${ARGN})
70ENDFUNCTION(ORXONOX_ADD_LIBRARY)
71
72FUNCTION(ORXONOX_ADD_EXECUTABLE _target_name)
73  TU_ADD_TARGET(${_target_name} EXECUTABLE "WIN32" ${ARGN})
74ENDFUNCTION(ORXONOX_ADD_EXECUTABLE)
75
76
77FUNCTION(TU_ADD_TARGET _target_name _target_type _additional_switches)
78  CAPITALISE_NAME(${_target_name} _target_name_capitalised)
79
80  # Specify all possible options (either switch or with add. arguments)
81  SET(_switches   FIND_HEADER_FILES  EXCLUDE_FROM_ALL  ORXONOX_EXTERNAL
82                  NO_DLL_INTERFACE   NO_SOURCE_GROUPS  ${_additional_switches}
83                  PCH_NO_DEFAULT     NO_INSTALL        PLUGIN)
84  SET(_list_names LINK_LIBRARIES  VERSION   SOURCE_FILES  DEFINE_SYMBOL
85                  TOLUA_FILES     PCH_FILE  PCH_EXCLUDE OUTPUT_NAME)
86  PARSE_MACRO_ARGUMENTS("${_switches}" "${_list_names}" ${ARGN})
87
88
89  # GET_HEADER_FILES
90  IF(_arg_FIND_HEADER_FILES)
91    GET_ALL_HEADER_FILES(_${target_name}_header_files)
92  ENDIF()
93
94  # Remove potential duplicates
95  SET(_${_target_name}_files ${_${target_name}_header_files} ${_arg_SOURCE_FILES})
96  LIST(REMOVE_DUPLICATES _${_target_name}_files)
97
98  # Generate the source groups
99  IF(NOT _arg_NO_SOURCE_GROUPS)
100    GENERATE_SOURCE_GROUPS(${_${_target_name}_files})
101
102    IF(NOT _arg_ORXONOX_EXTERNAL)
103      # Move the prereqs.h file to the config section
104      IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${_target_name_capitalised}Prereqs.h)
105        SOURCE_GROUP("Config" FILES ${_target_name_capitalised}Prereqs.h)
106      ENDIF()
107      # Add the config files in a special source group
108      LIST(APPEND _${_target_name}_files ${ORXONOX_CONFIG_FILES})
109      SOURCE_GROUP("Config" FILES ${ORXONOX_CONFIG_FILES})
110    ENDIF()
111  ENDIF(NOT _arg_NO_SOURCE_GROUPS)
112
113  # TOLUA_FILES
114  IF(_arg_TOLUA_FILES)
115    GENERATE_TOLUA_BINDINGS(${_target_name_capitalised} _${_target_name}_files
116                            INPUTFILES ${_arg_TOLUA_FILES})
117  ENDIF()
118
119  # First part (pre target) of precompiled header files
120  IF(PCH_COMPILER_SUPPORT AND PCH_ENABLE AND _arg_PCH_FILE)
121    # Provide convenient option to control PCH
122    STRING(TOUPPER "${_target_name}" _target_name_upper)
123    IF(_arg_PCH_NO_DEFAULT)
124      SET(PCH_DEFAULT FALSE)
125    ELSE()
126      SET(PCH_DEFAULT TRUE)
127    ENDIF()
128    OPTION(PCH_ENABLE_${_target_name_upper} "Enable using precompiled header files for library ${_target_name}." ${PCH_DEFAULT})
129
130    IF(PCH_ENABLE_${_target_name_upper})
131      PRECOMPILED_HEADER_FILES_PRE_TARGET(${_target_name} ${_arg_PCH_FILE} _${_target_name}_files EXCLUDE ${_arg_PCH_EXCLUDE})
132    ENDIF()
133  ENDIF()
134
135  # Certain libraries don't have dllexport/dllimport and can't be linked shared with msvc
136  IF(MSVC AND _arg_NO_DLL_INTERFACE)
137    SET(_arg_SHARED)
138    SET(_arg_STATIC STATIC)
139  ENDIF()
140
141  # Set default linking if required
142  IF(NOT _arg_SHARED AND NOT _arg_STATIC)
143    IF("${ORXONOX_DEFAULT_LINK}" STREQUAL "STATIC")
144      SET(_arg_STATIC STATIC)
145    ELSEIF("${ORXONOX_DEFAULT_LINK}" STREQUAL "SHARED")
146      SET(_arg_SHARED SHARED)
147    ENDIF()
148  ENDIF()
149
150  # PLUGIN A, always create shared libraries
151  IF(_arg_PLUGIN)
152    SET(_arg_SHARED SHARED)
153    SET(_arg_STATIC)
154  ENDIF()
155
156  # Add the library/executable
157  IF("${_target_type}" STREQUAL "LIBRARY")
158    ADD_LIBRARY(${_target_name} ${_arg_STATIC} ${_arg_SHARED}
159                ${_arg_EXCLUDE_FROM_ALL} ${_${_target_name}_files})
160  ELSE()
161    ADD_EXECUTABLE(${_target_name} ${_arg_WIN32} ${_arg_EXCLUDE_FROM_ALL}
162                   ${_${_target_name}_files})
163  ENDIF()
164
165  # PLUGIN B
166  IF (_arg_PLUGIN)
167    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES
168      RUNTIME_OUTPUT_DIRECTORY ${CMAKE_PLUGIN_OUTPUT_DIRECTORY} # Windows
169      LIBRARY_OUTPUT_DIRECTORY ${CMAKE_PLUGIN_OUTPUT_DIRECTORY} # Unix
170    )
171    ADD_PLUGIN(${_target_name})
172  ENDIF()
173
174  # LINK_LIBRARIES
175  IF(_arg_LINK_LIBRARIES)
176    TARGET_LINK_LIBRARIES(${_target_name} ${_arg_LINK_LIBRARIES})
177  ENDIF()
178
179  # DEFINE_SYMBOL
180  IF(_arg_DEFINE_SYMBOL)
181    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES DEFINE_SYMBOL ${_arg_DEFINE_SYMBOL})
182  ENDIF()
183
184  # VERSION
185  IF(_arg_VERSION)
186    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES VERSION ${_arg_VERSION})
187  ELSEIF(NOT _arg_ORXONOX_EXTERNAL)
188    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES VERSION ${ORXONOX_VERSION})
189  ENDIF()
190
191  # OUTPUT_NAME
192  IF(_arg_OUTPUT_NAME)
193    SET_TARGET_PROPERTIES(${_target_name} PROPERTIES OUTPUT_NAME  ${_arg_OUTPUT_NAME})
194  ENDIF()
195
196  # Second part of precompiled header files
197  IF(PCH_COMPILER_SUPPORT AND PCH_ENABLE_${_target_name_upper} AND _arg_PCH_FILE)
198    PRECOMPILED_HEADER_FILES_POST_TARGET(${_target_name} ${_arg_PCH_FILE})
199  ENDIF()
200
201  IF(NOT _arg_STATIC AND NOT _arg_NO_INSTALL)
202    IF(_arg_PLUGIN)
203      INSTALL(TARGETS ${_target_name}
204        RUNTIME DESTINATION ${ORXONOX_PLUGIN_INSTALL_PATH}
205        LIBRARY DESTINATION ${ORXONOX_PLUGIN_INSTALL_PATH}
206      )
207    ELSE()
208      INSTALL(TARGETS ${_target_name}
209        RUNTIME DESTINATION ${ORXONOX_RUNTIME_INSTALL_PATH}
210        LIBRARY DESTINATION ${ORXONOX_LIBRARY_INSTALL_PATH}
211      )
212    ENDIF()
213  ENDIF()
214
215ENDFUNCTION(TU_ADD_TARGET)
216
217
218# Creates a helper file with name <name_of_the_library>.plugin
219# This helps finding dynamically loadable plugins at runtime
220
221FUNCTION(ADD_PLUGIN _target)
222  # We use the properties to get the name because the librarys name may differ from
223  # the target name (for example orxonox <-> liborxonox)
224
225  GET_TARGET_PROPERTY(_target_loc ${_target} LOCATION)
226  GET_FILENAME_COMPONENT(_target_name ${_target_loc} NAME_WE)
227
228  IF(CMAKE_CONFIGURATION_TYPES)
229    FOREACH(_config ${CMAKE_CONFIGURATION_TYPES})
230      SET(_plugin_filename ${CMAKE_PLUGIN_OUTPUT_DIRECTORY}/${_config}/${_target_name}.plugin)
231
232      FILE(WRITE ${_plugin_filename})
233
234      INSTALL(
235        FILES ${_plugin_filename}
236        DESTINATION ${ORXONOX_PLUGIN_INSTALL_PATH}
237        CONFIGURATIONS ${_config}
238      )
239    ENDFOREACH()
240  ELSE()
241    SET(_plugin_filename ${CMAKE_PLUGIN_OUTPUT_DIRECTORY}/${_target_name}.plugin)
242
243    FILE(WRITE ${_plugin_filename})
244
245    INSTALL(
246      FILES ${_plugin_filename}
247      DESTINATION ${ORXONOX_PLUGIN_INSTALL_PATH}
248    )
249  ENDIF()
250ENDFUNCTION(ADD_PLUGIN)
Note: See TracBrowser for help on using the repository browser.