From c3172bef50b4ff1ff8331387570239d8e0c4bd5a Mon Sep 17 00:00:00 2001 From: martell Date: Thu, 18 Sep 2014 03:22:24 +0100 Subject: [PATCH] Finalise Windows cmake support for mingw-w64 Signed-off-by: martell --- CMakeLists.txt | 4 +- {build => cmake}/BuildHelpers.CMakeLists.txt | 0 cmake/Modules/CMakeParseArguments.cmake | 160 ++++++++ cmake/Modules/FindChipmunk.cmake | 79 ++++ .../FindPackageHandleStandardArgs.cmake | 351 ++++++++++++++++++ cmake/Modules/FindPackageMessage.cmake | 57 +++ cmake/Modules/FindWebP.cmake | 69 ++++ cocos/3d/CMakeLists.txt | 4 + cocos/CMakeLists.txt | 25 ++ cocos/audio/CMakeLists.txt | 26 +- cocos/base/CMakeLists.txt | 10 +- cocos/network/CMakeLists.txt | 6 +- cocos/ui/CMakeLists.txt | 6 +- extensions/CMakeLists.txt | 64 ++-- 14 files changed, 805 insertions(+), 56 deletions(-) rename {build => cmake}/BuildHelpers.CMakeLists.txt (100%) create mode 100644 cmake/Modules/CMakeParseArguments.cmake create mode 100644 cmake/Modules/FindChipmunk.cmake create mode 100644 cmake/Modules/FindPackageHandleStandardArgs.cmake create mode 100644 cmake/Modules/FindPackageMessage.cmake create mode 100644 cmake/Modules/FindWebP.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index a89ba7ed69..131a38fff6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,7 +29,8 @@ project (Cocos2d-X) # The version number set(COCOS2D_X_VERSION 3.3.0-beta0) -include(build/BuildHelpers.CMakeLists.txt) +include(cmake/BuildHelpers.CMakeLists.txt) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") message(${BUILDING_STRING}) @@ -194,6 +195,7 @@ if(NOT MINGW) ) + endif() diff --git a/build/BuildHelpers.CMakeLists.txt b/cmake/BuildHelpers.CMakeLists.txt similarity index 100% rename from build/BuildHelpers.CMakeLists.txt rename to cmake/BuildHelpers.CMakeLists.txt diff --git a/cmake/Modules/CMakeParseArguments.cmake b/cmake/Modules/CMakeParseArguments.cmake new file mode 100644 index 0000000000..4248176ad6 --- /dev/null +++ b/cmake/Modules/CMakeParseArguments.cmake @@ -0,0 +1,160 @@ +#.rst: +# CMakeParseArguments +# ------------------- +# +# +# +# CMAKE_PARSE_ARGUMENTS( +# args...) +# +# CMAKE_PARSE_ARGUMENTS() is intended to be used in macros or functions +# for parsing the arguments given to that macro or function. It +# processes the arguments and defines a set of variables which hold the +# values of the respective options. +# +# The argument contains all options for the respective macro, +# i.e. keywords which can be used when calling the macro without any +# value following, like e.g. the OPTIONAL keyword of the install() +# command. +# +# The argument contains all keywords for this macro +# which are followed by one value, like e.g. DESTINATION keyword of the +# install() command. +# +# The argument contains all keywords for this +# macro which can be followed by more than one value, like e.g. the +# TARGETS or FILES keywords of the install() command. +# +# When done, CMAKE_PARSE_ARGUMENTS() will have defined for each of the +# keywords listed in , and +# a variable composed of the given +# followed by "_" and the name of the respective keyword. These +# variables will then hold the respective value from the argument list. +# For the keywords this will be TRUE or FALSE. +# +# All remaining arguments are collected in a variable +# _UNPARSED_ARGUMENTS, this can be checked afterwards to see +# whether your macro was called with unrecognized parameters. +# +# As an example here a my_install() macro, which takes similar arguments +# as the real install() command: +# +# :: +# +# function(MY_INSTALL) +# set(options OPTIONAL FAST) +# set(oneValueArgs DESTINATION RENAME) +# set(multiValueArgs TARGETS CONFIGURATIONS) +# cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) +# ... +# +# +# +# Assume my_install() has been called like this: +# +# :: +# +# my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub) +# +# +# +# After the cmake_parse_arguments() call the macro will have set the +# following variables: +# +# :: +# +# MY_INSTALL_OPTIONAL = TRUE +# MY_INSTALL_FAST = FALSE (this option was not used when calling my_install() +# MY_INSTALL_DESTINATION = "bin" +# MY_INSTALL_RENAME = "" (was not used) +# MY_INSTALL_TARGETS = "foo;bar" +# MY_INSTALL_CONFIGURATIONS = "" (was not used) +# MY_INSTALL_UNPARSED_ARGUMENTS = "blub" (no value expected after "OPTIONAL" +# +# +# +# You can then continue and process these variables. +# +# Keywords terminate lists of values, e.g. if directly after a +# one_value_keyword another recognized keyword follows, this is +# interpreted as the beginning of the new option. E.g. +# my_install(TARGETS foo DESTINATION OPTIONAL) would result in +# MY_INSTALL_DESTINATION set to "OPTIONAL", but MY_INSTALL_DESTINATION +# would be empty and MY_INSTALL_OPTIONAL would be set to TRUE therefor. + +#============================================================================= +# Copyright 2010 Alexander Neundorf +# +# 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. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + + +if(__CMAKE_PARSE_ARGUMENTS_INCLUDED) + return() +endif() +set(__CMAKE_PARSE_ARGUMENTS_INCLUDED TRUE) + + +function(CMAKE_PARSE_ARGUMENTS prefix _optionNames _singleArgNames _multiArgNames) + # first set all result variables to empty/FALSE + foreach(arg_name ${_singleArgNames} ${_multiArgNames}) + set(${prefix}_${arg_name}) + endforeach() + + foreach(option ${_optionNames}) + set(${prefix}_${option} FALSE) + endforeach() + + set(${prefix}_UNPARSED_ARGUMENTS) + + set(insideValues FALSE) + set(currentArgName) + + # now iterate over all arguments and fill the result variables + foreach(currentArg ${ARGN}) + list(FIND _optionNames "${currentArg}" optionIndex) # ... then this marks the end of the arguments belonging to this keyword + list(FIND _singleArgNames "${currentArg}" singleArgIndex) # ... then this marks the end of the arguments belonging to this keyword + list(FIND _multiArgNames "${currentArg}" multiArgIndex) # ... then this marks the end of the arguments belonging to this keyword + + if(${optionIndex} EQUAL -1 AND ${singleArgIndex} EQUAL -1 AND ${multiArgIndex} EQUAL -1) + if(insideValues) + if("${insideValues}" STREQUAL "SINGLE") + set(${prefix}_${currentArgName} ${currentArg}) + set(insideValues FALSE) + elseif("${insideValues}" STREQUAL "MULTI") + list(APPEND ${prefix}_${currentArgName} ${currentArg}) + endif() + else() + list(APPEND ${prefix}_UNPARSED_ARGUMENTS ${currentArg}) + endif() + else() + if(NOT ${optionIndex} EQUAL -1) + set(${prefix}_${currentArg} TRUE) + set(insideValues FALSE) + elseif(NOT ${singleArgIndex} EQUAL -1) + set(currentArgName ${currentArg}) + set(${prefix}_${currentArgName}) + set(insideValues "SINGLE") + elseif(NOT ${multiArgIndex} EQUAL -1) + set(currentArgName ${currentArg}) + set(${prefix}_${currentArgName}) + set(insideValues "MULTI") + endif() + endif() + + endforeach() + + # propagate the result variables to the caller: + foreach(arg_name ${_singleArgNames} ${_multiArgNames} ${_optionNames}) + set(${prefix}_${arg_name} ${${prefix}_${arg_name}} PARENT_SCOPE) + endforeach() + set(${prefix}_UNPARSED_ARGUMENTS ${${prefix}_UNPARSED_ARGUMENTS} PARENT_SCOPE) + +endfunction() diff --git a/cmake/Modules/FindChipmunk.cmake b/cmake/Modules/FindChipmunk.cmake new file mode 100644 index 0000000000..924de3db7e --- /dev/null +++ b/cmake/Modules/FindChipmunk.cmake @@ -0,0 +1,79 @@ +#.rst: +# FindChipmunk +# ------------ +# +# Locate FindChipmunk library +# +# This module defines +# +# :: +# +# CHIPMUNK_LIBRARIES, the library to link against +# CHIPMUNK_FOUND, if false, do not try to link to FREETYPE +# CHIPMUNK_INCLUDE_DIRS, where to find headers. +# This is the concatenation of the paths: +# CHIPMUNK_INCLUDE_DIR +# +#============================================================================= +# Copyright 2014-2014 Martell Malone +# +# 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. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +FIND_PATH(CHIPMUNK_INCLUDE_DIR chipmunk.h + HINTS + ENV CHIPMUNK_DIR + PATH_SUFFIXES include/chipmunk include + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw # Fink + /opt/local # DarwinPorts + /opt/csw # Blastwave + /opt +) + +FIND_LIBRARY(CHIPMUNK_LIBRARY + NAMES chipmunk libchipmunk + HINTS + ENV CHIPMUNK_DIR + PATH_SUFFIXES lib + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt +) + +set(CHIPMUNK_INCLUDE_DIRS "${CHIPMUNK_INCLUDE_DIR}") + +IF(CHIPMUNK_LIBRARY) + # include the math library for Unix + IF(UNIX AND NOT APPLE) + FIND_LIBRARY(CHIPMUNK_MATH_LIBRARY m) + SET(CHIPMUNK_LIBRARIES "${CHIPMUNK_LIBRARY};${CHIPMUNK_MATH_LIBRARY}" CACHE STRING "Chipmunk Libraries") + # For Windows and Mac, don't need to explicitly include the math library + ELSE(UNIX AND NOT APPLE) + SET( CHIPMUNK_LIBRARIES "${CHIPMUNK_LIBRARY}" CACHE STRING "Chipmunk Libraries") + ENDIF(UNIX AND NOT APPLE) +ENDIF(CHIPMUNK_LIBRARY) + +INCLUDE(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +# handle the QUIETLY and REQUIRED arguments and set CHIPMUNK_FOUND to TRUE if +# all listed variables are TRUE +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Chipmunk DEFAULT_MSG CHIPMUNK_LIBRARIES CHIPMUNK_INCLUDE_DIR) + +MARK_AS_ADVANCED(CHIPMUNK_INCLUDE_DIR CHIPMUNK_LIBRARIES CHIPMUNK_LIBRARY CHIPMUNK_MATH_LIBRARY) diff --git a/cmake/Modules/FindPackageHandleStandardArgs.cmake b/cmake/Modules/FindPackageHandleStandardArgs.cmake new file mode 100644 index 0000000000..d03041852d --- /dev/null +++ b/cmake/Modules/FindPackageHandleStandardArgs.cmake @@ -0,0 +1,351 @@ +#.rst: +# FindPackageHandleStandardArgs +# ----------------------------- +# +# +# +# FIND_PACKAGE_HANDLE_STANDARD_ARGS( ... ) +# +# This function is intended to be used in FindXXX.cmake modules files. +# It handles the REQUIRED, QUIET and version-related arguments to +# find_package(). It also sets the _FOUND variable. The +# package is considered found if all variables ... listed contain +# valid results, e.g. valid filepaths. +# +# There are two modes of this function. The first argument in both +# modes is the name of the Find-module where it is called (in original +# casing). +# +# The first simple mode looks like this: +# +# :: +# +# FIND_PACKAGE_HANDLE_STANDARD_ARGS( (DEFAULT_MSG|"Custom failure message") ... ) +# +# If the variables to are all valid, then +# _FOUND will be set to TRUE. If DEFAULT_MSG is given +# as second argument, then the function will generate itself useful +# success and error messages. You can also supply a custom error +# message for the failure case. This is not recommended. +# +# The second mode is more powerful and also supports version checking: +# +# :: +# +# FIND_PACKAGE_HANDLE_STANDARD_ARGS(NAME [FOUND_VAR ] +# [REQUIRED_VARS ...] +# [VERSION_VAR ] +# [HANDLE_COMPONENTS] +# [CONFIG_MODE] +# [FAIL_MESSAGE "Custom failure message"] ) +# +# +# +# In this mode, the name of the result-variable can be set either to +# either _FOUND or _FOUND using the +# FOUND_VAR option. Other names for the result-variable are not +# allowed. So for a Find-module named FindFooBar.cmake, the two +# possible names are FooBar_FOUND and FOOBAR_FOUND. It is recommended +# to use the original case version. If the FOUND_VAR option is not +# used, the default is _FOUND. +# +# As in the simple mode, if through are all valid, +# _FOUND will be set to TRUE. After REQUIRED_VARS the +# variables which are required for this package are listed. Following +# VERSION_VAR the name of the variable can be specified which holds the +# version of the package which has been found. If this is done, this +# version will be checked against the (potentially) specified required +# version used in the find_package() call. The EXACT keyword is also +# handled. The default messages include information about the required +# version and the version which has been actually found, both if the +# version is ok or not. If the package supports components, use the +# HANDLE_COMPONENTS option to enable handling them. In this case, +# find_package_handle_standard_args() will report which components have +# been found and which are missing, and the _FOUND variable +# will be set to FALSE if any of the required components (i.e. not the +# ones listed after OPTIONAL_COMPONENTS) are missing. Use the option +# CONFIG_MODE if your FindXXX.cmake module is a wrapper for a +# find_package(... NO_MODULE) call. In this case VERSION_VAR will be +# set to _VERSION and the macro will automatically check whether +# the Config module was found. Via FAIL_MESSAGE a custom failure +# message can be specified, if this is not used, the default message +# will be displayed. +# +# Example for mode 1: +# +# :: +# +# find_package_handle_standard_args(LibXml2 DEFAULT_MSG LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR) +# +# +# +# LibXml2 is considered to be found, if both LIBXML2_LIBRARY and +# LIBXML2_INCLUDE_DIR are valid. Then also LIBXML2_FOUND is set to +# TRUE. If it is not found and REQUIRED was used, it fails with +# FATAL_ERROR, independent whether QUIET was used or not. If it is +# found, success will be reported, including the content of . On +# repeated Cmake runs, the same message won't be printed again. +# +# Example for mode 2: +# +# :: +# +# find_package_handle_standard_args(LibXslt FOUND_VAR LibXslt_FOUND +# REQUIRED_VARS LibXslt_LIBRARIES LibXslt_INCLUDE_DIRS +# VERSION_VAR LibXslt_VERSION_STRING) +# +# In this case, LibXslt is considered to be found if the variable(s) +# listed after REQUIRED_VAR are all valid, i.e. LibXslt_LIBRARIES and +# LibXslt_INCLUDE_DIRS in this case. The result will then be stored in +# LibXslt_FOUND . Also the version of LibXslt will be checked by using +# the version contained in LibXslt_VERSION_STRING. Since no +# FAIL_MESSAGE is given, the default messages will be printed. +# +# Another example for mode 2: +# +# :: +# +# find_package(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4) +# find_package_handle_standard_args(Automoc4 CONFIG_MODE) +# +# In this case, FindAutmoc4.cmake wraps a call to find_package(Automoc4 +# NO_MODULE) and adds an additional search directory for automoc4. Here +# the result will be stored in AUTOMOC4_FOUND. The following +# FIND_PACKAGE_HANDLE_STANDARD_ARGS() call produces a proper +# success/error message. + +#============================================================================= +# Copyright 2007-2009 Kitware, Inc. +# +# 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. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +include(${CMAKE_CURRENT_LIST_DIR}/FindPackageMessage.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/CMakeParseArguments.cmake) + +# internal helper macro +macro(_FPHSA_FAILURE_MESSAGE _msg) + if (${_NAME}_FIND_REQUIRED) + message(FATAL_ERROR "${_msg}") + else () + if (NOT ${_NAME}_FIND_QUIETLY) + message(STATUS "${_msg}") + endif () + endif () +endmacro() + + +# internal helper macro to generate the failure message when used in CONFIG_MODE: +macro(_FPHSA_HANDLE_FAILURE_CONFIG_MODE) + # _CONFIG is set, but FOUND is false, this means that some other of the REQUIRED_VARS was not found: + if(${_NAME}_CONFIG) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: missing: ${MISSING_VARS} (found ${${_NAME}_CONFIG} ${VERSION_MSG})") + else() + # If _CONSIDERED_CONFIGS is set, the config-file has been found, but no suitable version. + # List them all in the error message: + if(${_NAME}_CONSIDERED_CONFIGS) + set(configsText "") + list(LENGTH ${_NAME}_CONSIDERED_CONFIGS configsCount) + math(EXPR configsCount "${configsCount} - 1") + foreach(currentConfigIndex RANGE ${configsCount}) + list(GET ${_NAME}_CONSIDERED_CONFIGS ${currentConfigIndex} filename) + list(GET ${_NAME}_CONSIDERED_VERSIONS ${currentConfigIndex} version) + set(configsText "${configsText} ${filename} (version ${version})\n") + endforeach() + if (${_NAME}_NOT_FOUND_MESSAGE) + set(configsText "${configsText} Reason given by package: ${${_NAME}_NOT_FOUND_MESSAGE}\n") + endif() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} ${VERSION_MSG}, checked the following files:\n${configsText}") + + else() + # Simple case: No Config-file was found at all: + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: found neither ${_NAME}Config.cmake nor ${_NAME_LOWER}-config.cmake ${VERSION_MSG}") + endif() + endif() +endmacro() + + +function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG) + +# set up the arguments for CMAKE_PARSE_ARGUMENTS and check whether we are in +# new extended or in the "old" mode: + set(options CONFIG_MODE HANDLE_COMPONENTS) + set(oneValueArgs FAIL_MESSAGE VERSION_VAR FOUND_VAR) + set(multiValueArgs REQUIRED_VARS) + set(_KEYWORDS_FOR_EXTENDED_MODE ${options} ${oneValueArgs} ${multiValueArgs} ) + list(FIND _KEYWORDS_FOR_EXTENDED_MODE "${_FIRST_ARG}" INDEX) + + if(${INDEX} EQUAL -1) + set(FPHSA_FAIL_MESSAGE ${_FIRST_ARG}) + set(FPHSA_REQUIRED_VARS ${ARGN}) + set(FPHSA_VERSION_VAR) + else() + + CMAKE_PARSE_ARGUMENTS(FPHSA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${_FIRST_ARG} ${ARGN}) + + if(FPHSA_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown keywords given to FIND_PACKAGE_HANDLE_STANDARD_ARGS(): \"${FPHSA_UNPARSED_ARGUMENTS}\"") + endif() + + if(NOT FPHSA_FAIL_MESSAGE) + set(FPHSA_FAIL_MESSAGE "DEFAULT_MSG") + endif() + endif() + +# now that we collected all arguments, process them + + if("${FPHSA_FAIL_MESSAGE}" STREQUAL "DEFAULT_MSG") + set(FPHSA_FAIL_MESSAGE "Could NOT find ${_NAME}") + endif() + + # In config-mode, we rely on the variable _CONFIG, which is set by find_package() + # when it successfully found the config-file, including version checking: + if(FPHSA_CONFIG_MODE) + list(INSERT FPHSA_REQUIRED_VARS 0 ${_NAME}_CONFIG) + list(REMOVE_DUPLICATES FPHSA_REQUIRED_VARS) + set(FPHSA_VERSION_VAR ${_NAME}_VERSION) + endif() + + if(NOT FPHSA_REQUIRED_VARS) + message(FATAL_ERROR "No REQUIRED_VARS specified for FIND_PACKAGE_HANDLE_STANDARD_ARGS()") + endif() + + list(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR) + + string(TOUPPER ${_NAME} _NAME_UPPER) + string(TOLOWER ${_NAME} _NAME_LOWER) + + if(FPHSA_FOUND_VAR) + if(FPHSA_FOUND_VAR MATCHES "^${_NAME}_FOUND$" OR FPHSA_FOUND_VAR MATCHES "^${_NAME_UPPER}_FOUND$") + set(_FOUND_VAR ${FPHSA_FOUND_VAR}) + else() + message(FATAL_ERROR "The argument for FOUND_VAR is \"${FPHSA_FOUND_VAR}\", but only \"${_NAME}_FOUND\" and \"${_NAME_UPPER}_FOUND\" are valid names.") + endif() + else() + set(_FOUND_VAR ${_NAME_UPPER}_FOUND) + endif() + + # collect all variables which were not found, so they can be printed, so the + # user knows better what went wrong (#6375) + set(MISSING_VARS "") + set(DETAILS "") + # check if all passed variables are valid + unset(${_FOUND_VAR}) + foreach(_CURRENT_VAR ${FPHSA_REQUIRED_VARS}) + if(NOT ${_CURRENT_VAR}) + set(${_FOUND_VAR} FALSE) + set(MISSING_VARS "${MISSING_VARS} ${_CURRENT_VAR}") + else() + set(DETAILS "${DETAILS}[${${_CURRENT_VAR}}]") + endif() + endforeach() + if(NOT "${${_FOUND_VAR}}" STREQUAL "FALSE") + set(${_FOUND_VAR} TRUE) + endif() + + # component handling + unset(FOUND_COMPONENTS_MSG) + unset(MISSING_COMPONENTS_MSG) + + if(FPHSA_HANDLE_COMPONENTS) + foreach(comp ${${_NAME}_FIND_COMPONENTS}) + if(${_NAME}_${comp}_FOUND) + + if(NOT DEFINED FOUND_COMPONENTS_MSG) + set(FOUND_COMPONENTS_MSG "found components: ") + endif() + set(FOUND_COMPONENTS_MSG "${FOUND_COMPONENTS_MSG} ${comp}") + + else() + + if(NOT DEFINED MISSING_COMPONENTS_MSG) + set(MISSING_COMPONENTS_MSG "missing components: ") + endif() + set(MISSING_COMPONENTS_MSG "${MISSING_COMPONENTS_MSG} ${comp}") + + if(${_NAME}_FIND_REQUIRED_${comp}) + set(${_FOUND_VAR} FALSE) + set(MISSING_VARS "${MISSING_VARS} ${comp}") + endif() + + endif() + endforeach() + set(COMPONENT_MSG "${FOUND_COMPONENTS_MSG} ${MISSING_COMPONENTS_MSG}") + set(DETAILS "${DETAILS}[c${COMPONENT_MSG}]") + endif() + + # version handling: + set(VERSION_MSG "") + set(VERSION_OK TRUE) + set(VERSION ${${FPHSA_VERSION_VAR}} ) + if (${_NAME}_FIND_VERSION) + + if(VERSION) + + if(${_NAME}_FIND_VERSION_EXACT) # exact version required + if (NOT "${${_NAME}_FIND_VERSION}" VERSION_EQUAL "${VERSION}") + set(VERSION_MSG "Found unsuitable version \"${VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable exact version \"${VERSION}\")") + endif () + + else() # minimum version specified: + if ("${${_NAME}_FIND_VERSION}" VERSION_GREATER "${VERSION}") + set(VERSION_MSG "Found unsuitable version \"${VERSION}\", but required is at least \"${${_NAME}_FIND_VERSION}\"") + set(VERSION_OK FALSE) + else () + set(VERSION_MSG "(found suitable version \"${VERSION}\", minimum required is \"${${_NAME}_FIND_VERSION}\")") + endif () + endif() + + else() + + # if the package was not found, but a version was given, add that to the output: + if(${_NAME}_FIND_VERSION_EXACT) + set(VERSION_MSG "(Required is exact version \"${${_NAME}_FIND_VERSION}\")") + else() + set(VERSION_MSG "(Required is at least version \"${${_NAME}_FIND_VERSION}\")") + endif() + + endif() + else () + if(VERSION) + set(VERSION_MSG "(found version \"${VERSION}\")") + endif() + endif () + + if(VERSION_OK) + set(DETAILS "${DETAILS}[v${VERSION}(${${_NAME}_FIND_VERSION})]") + else() + set(${_FOUND_VAR} FALSE) + endif() + + + # print the result: + if (${_FOUND_VAR}) + FIND_PACKAGE_MESSAGE(${_NAME} "Found ${_NAME}: ${${_FIRST_REQUIRED_VAR}} ${VERSION_MSG} ${COMPONENT_MSG}" "${DETAILS}") + else () + + if(FPHSA_CONFIG_MODE) + _FPHSA_HANDLE_FAILURE_CONFIG_MODE() + else() + if(NOT VERSION_OK) + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found ${${_FIRST_REQUIRED_VAR}})") + else() + _FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} (missing: ${MISSING_VARS}) ${VERSION_MSG}") + endif() + endif() + + endif () + + set(${_FOUND_VAR} ${${_FOUND_VAR}} PARENT_SCOPE) + +endfunction() diff --git a/cmake/Modules/FindPackageMessage.cmake b/cmake/Modules/FindPackageMessage.cmake new file mode 100644 index 0000000000..b6a58e427d --- /dev/null +++ b/cmake/Modules/FindPackageMessage.cmake @@ -0,0 +1,57 @@ +#.rst: +# FindPackageMessage +# ------------------ +# +# +# +# FIND_PACKAGE_MESSAGE( "message for user" "find result details") +# +# This macro is intended to be used in FindXXX.cmake modules files. It +# will print a message once for each unique find result. This is useful +# for telling the user where a package was found. The first argument +# specifies the name (XXX) of the package. The second argument +# specifies the message to display. The third argument lists details +# about the find result so that if they change the message will be +# displayed again. The macro also obeys the QUIET argument to the +# find_package command. +# +# Example: +# +# :: +# +# if(X11_FOUND) +# FIND_PACKAGE_MESSAGE(X11 "Found X11: ${X11_X11_LIB}" +# "[${X11_X11_LIB}][${X11_INCLUDE_DIR}]") +# else() +# ... +# endif() + +#============================================================================= +# Copyright 2008-2009 Kitware, Inc. +# +# 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. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +function(FIND_PACKAGE_MESSAGE pkg msg details) + # Avoid printing a message repeatedly for the same find result. + if(NOT ${pkg}_FIND_QUIETLY) + string(REGEX REPLACE "[\n]" "" details "${details}") + set(DETAILS_VAR FIND_PACKAGE_MESSAGE_DETAILS_${pkg}) + if(NOT "${details}" STREQUAL "${${DETAILS_VAR}}") + # The message has not yet been printed. + message(STATUS "${msg}") + + # Save the find details in the cache to avoid printing the same + # message again. + set("${DETAILS_VAR}" "${details}" + CACHE INTERNAL "Details about finding ${pkg}") + endif() + endif() +endfunction() diff --git a/cmake/Modules/FindWebP.cmake b/cmake/Modules/FindWebP.cmake new file mode 100644 index 0000000000..8b74805bdc --- /dev/null +++ b/cmake/Modules/FindWebP.cmake @@ -0,0 +1,69 @@ +#.rst: +# FindWebP +# ------------ +# +# Locate FindChipmunk library +# +# This module defines +# +# :: +# +# WEBP_LIBRARIES, the library to link against +# WEBP_FOUND, if false, do not try to link to FREETYPE +# WEBP_INCLUDE_DIRS, where to find headers. +# This is the concatenation of the paths: +# WEBP_INCLUDE_DIR +# +#============================================================================= +# Copyright 2014-2014 Martell Malone +# +# 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. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +FIND_PATH(WEBP_INCLUDE_DIR decode.h + HINTS + ENV WEBP_DIR + PATH_SUFFIXES include/webp include + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw # Fink + /opt/local # DarwinPorts + /opt/csw # Blastwave + /opt +) + +FIND_LIBRARY(WEBP_LIBRARY + NAMES WEBP libWEBP + HINTS + ENV WEBP_DIR + PATH_SUFFIXES lib + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt +) + +set(WEBP_INCLUDE_DIRS "${WEBP_INCLUDE_DIR}") +set(WEBP_LIBRARIES "${WEBP_LIBRARY}") + +INCLUDE(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) +# handle the QUIETLY and REQUIRED arguments and set WEBP_FOUND to TRUE if +# all listed variables are TRUE +FIND_PACKAGE_HANDLE_STANDARD_ARGS(WebP DEFAULT_MSG WEBP_LIBRARIES WEBP_INCLUDE_DIR) + +MARK_AS_ADVANCED(WEBP_INCLUDE_DIR WEBP_LIBRARIES WEBP_LIBRARY) diff --git a/cocos/3d/CMakeLists.txt b/cocos/3d/CMakeLists.txt index 489e9038b1..ce58d57fbb 100644 --- a/cocos/3d/CMakeLists.txt +++ b/cocos/3d/CMakeLists.txt @@ -1,4 +1,8 @@ +if(WINDOWS AND NOT BUILD_STATIC) + ADD_DEFINITIONS (-D_USE3DDLL) +endif() + set(COCOS_3D_SRC 3d/CCAABB.cpp diff --git a/cocos/CMakeLists.txt b/cocos/CMakeLists.txt index 4328cd5f11..4ecdd39d84 100644 --- a/cocos/CMakeLists.txt +++ b/cocos/CMakeLists.txt @@ -77,6 +77,31 @@ add_library(cocos2d ${BUILD_TYPE} ${COCOS_SRC}) if(MINGW) + + find_package(Freetype REQUIRED) + find_package(WebP REQUIRED) + #find_package(MiniZip REQUIRED) + #${MINIZIP_INCLUDE_DIR} + + #find_package(GLFW REQUIRED) + #${GLFW_INCLUDE_DIRS} + + find_package(ZLIB REQUIRED) + + find_package(Chipmunk REQUIRED) + + message( STATUS "ZLIB dirs: ${ZLIB_INCLUDE_DIRS}") + message( STATUS "WEBP dirs: ${WEBP_INCLUDE_DIRS}") + message( STATUS "FREETYPE dirs: ${FREETYPE_INCLUDE_DIRS}") + message( STATUS "Chipmunk dirs: ${CHIPMUNK_INCLUDE_DIRS}") + + include_directories(${FREETYPE_INCLUDE_DIRS} ${WEBP_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS} ${CHIPMUNK_INCLUDE_DIRS}) + + include_directories( + ../external/xxhash + ../external/xxtea) + + set(PLATFORM_SPECIFIC_LIBS z jpeg png webp tiff curl websockets glfw3 glew32 opengl32 iconv freetype bz2) elseif(WINDOWS) set(PLATFORM_SPECIFIC_LIBS libjpeg libpng libwebp libtiff libcurl_imp libwebsockets freetype250 glfw3 glew32 opengl32 libiconv libzlib) diff --git a/cocos/audio/CMakeLists.txt b/cocos/audio/CMakeLists.txt index 2781fde6e8..289ea93231 100644 --- a/cocos/audio/CMakeLists.txt +++ b/cocos/audio/CMakeLists.txt @@ -5,17 +5,17 @@ endif() if(WINDOWS) set(COCOS_AUDIO_SRC - win32/SimpleAudioEngine.cpp - win32/MciPlayer.cpp - win32/MciPlayer.h + audio/win32/SimpleAudioEngine.cpp + audio/win32/MciPlayer.cpp + audio/win32/MciPlayer.h ) elseif(LINUX) set(COCOS_AUDIO_SRC - linux/SimpleAudioEngineFMOD.cpp - linux/FmodAudioPlayer.cpp - linux/FmodAudioPlayer.h - linux/AudioPlayer.h + audio/linux/SimpleAudioEngineFMOD.cpp + audio/linux/FmodAudioPlayer.cpp + audio/linux/FmodAudioPlayer.h + audio/linux/AudioPlayer.h ) include_directories( ../external/linux-specific/fmod/include/${ARCH_DIR} ) @@ -25,15 +25,15 @@ elseif(MACOSX) # because C files needs to be compiled with C compiler and not C++ # compiler set(COCOS_AUDIO_SRC_C - mac/CDAudioManager.m - mac/CDOpenALSupport.m - mac/CocosDenshion.m - mac/SimpleAudioEngine_objc.m + audio/mac/CDAudioManager.m + audio/mac/CDOpenALSupport.m + audio/mac/CocosDenshion.m + audio/mac/SimpleAudioEngine_objc.m ) set(COCOS_AUDIO_SRC ${COCOS_AUDIO_SRC_C} - mac/SimpleAudioEngine.mm - mac/CDXMacOSXSupport.mm + audio/mac/SimpleAudioEngine.mm + audio/mac/CDXMacOSXSupport.mm ) SET_SOURCE_FILES_PROPERTIES( ${COCOS_AUDIO_SRC_C} diff --git a/cocos/base/CMakeLists.txt b/cocos/base/CMakeLists.txt index 54cdee6516..79292ac142 100644 --- a/cocos/base/CMakeLists.txt +++ b/cocos/base/CMakeLists.txt @@ -5,24 +5,29 @@ if(MACOSX) endif() # todo: android support via base/CCUserDefaultAndroid.cpp +# todo: also base/CCController-android.cpp set(COCOS_BASE_SRC + base/ccFPSImages.c base/CCAutoreleasePool.cpp base/CCCamera.cpp base/CCConfiguration.cpp base/CCConsole.cpp + base/CCController.cpp base/CCData.cpp base/CCDataVisitor.cpp base/CCDirector.cpp base/CCEvent.cpp base/CCEventAcceleration.cpp + base/CCEventController.cpp base/CCEventCustom.cpp base/CCEventDispatcher.cpp base/CCEventFocus.cpp base/CCEventKeyboard.cpp base/CCEventListener.cpp base/CCEventListenerAcceleration.cpp + base/CCEventListenerController.cpp base/CCEventListenerCustom.cpp base/CCEventListenerFocus.cpp base/CCEventListenerKeyboard.cpp @@ -31,7 +36,6 @@ set(COCOS_BASE_SRC base/CCEventMouse.cpp base/CCEventTouch.cpp base/CCIMEDispatcher.cpp - base/CCModuleManager.cpp base/CCNS.cpp base/CCProfiling.cpp base/CCRef.cpp @@ -40,19 +44,19 @@ set(COCOS_BASE_SRC base/CCTouch.cpp base/CCUserDefault.cpp base/CCValue.cpp + base/ObjectFactory.cpp base/TGAlib.cpp base/ZipUtils.cpp base/atitc.cpp base/base64.cpp base/ccCArray.cpp - base/ccFPSImages.c + base/ccRandom.cpp base/ccTypes.cpp base/ccUTF8.cpp base/ccUtils.cpp base/etc1.cpp base/pvr.cpp base/s3tc.cpp - base/ObjectFactory.cpp ${COCOS_BASE_SPECIFIC_SRC} ) diff --git a/cocos/network/CMakeLists.txt b/cocos/network/CMakeLists.txt index 62b868fada..85ccb1138b 100644 --- a/cocos/network/CMakeLists.txt +++ b/cocos/network/CMakeLists.txt @@ -9,9 +9,9 @@ endif() set(COCOS_NETWORK_SRC - HttpClient.cpp - SocketIO.cpp - WebSocket.cpp + network/HttpClient.cpp + network/SocketIO.cpp + network/WebSocket.cpp ) diff --git a/cocos/ui/CMakeLists.txt b/cocos/ui/CMakeLists.txt index b46a16cb12..71c685e7ff 100644 --- a/cocos/ui/CMakeLists.txt +++ b/cocos/ui/CMakeLists.txt @@ -5,13 +5,13 @@ endif() if(WINDOWS) set(COCOS_UI_SPECIFIC_SRC - UIEditBoxImpl-win32.cpp) + ui/UIEditBox/UIEditBoxImpl-win32.cpp) elseif(MACOSX) set(COCOS_UI_SPECIFIC_SRC - UIEditBoxImpl-mac.mm) + ui/UIEditBox/UIEditBoxImpl-mac.mm) elseif(LINUX) set(COCOS_UI_SPECIFIC_SRC - UIEditBoxImpl-stub.cpp) + ui/UIEditBox/UIEditBoxImpl-stub.cpp) endif() #todo: android UIWebViewImpl and UIVideoPlayer diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt index 347500523b..b5b057e8c2 100644 --- a/extensions/CMakeLists.txt +++ b/extensions/CMakeLists.txt @@ -2,43 +2,41 @@ if(WINDOWS AND NOT BUILD_STATIC) ADD_DEFINITIONS (-D_USREXDLL) endif() -set(COCOS_EXTENSIONS_SRC - assets-manager/AssetsManager.cpp - GUI/CCControlExtension/CCControl.cpp - GUI/CCControlExtension/CCControlButton.cpp - GUI/CCControlExtension/CCControlColourPicker.cpp - GUI/CCControlExtension/CCControlHuePicker.cpp - GUI/CCControlExtension/CCControlPotentiometer.cpp - GUI/CCControlExtension/CCControlSaturationBrightnessPicker.cpp - GUI/CCControlExtension/CCControlSlider.cpp - GUI/CCControlExtension/CCControlStepper.cpp - GUI/CCControlExtension/CCControlSwitch.cpp - GUI/CCControlExtension/CCControlUtils.cpp - GUI/CCControlExtension/CCInvocation.cpp - GUI/CCControlExtension/CCScale9Sprite.cpp - GUI/CCEditBox/CCEditBox.cpp - GUI/CCEditBox/CCEditBoxImplAndroid.cpp - GUI/CCEditBox/CCEditBoxImplNone.cpp - GUI/CCEditBox/CCEditBoxImplWin.cpp - GUI/CCScrollView/CCScrollView.cpp - GUI/CCScrollView/CCTableView.cpp - GUI/CCScrollView/CCTableViewCell.cpp - physics-nodes/CCPhysicsDebugNode.cpp - physics-nodes/CCPhysicsSprite.cpp -) +if(WINDOWS) -if(WIN32) - ADD_DEFINITIONS(-DUNICODE -D_UNICODE) - - set(PLATFORM_EXTENSIONS_SRC - proj.win32/Win32InputBox.cpp - ) -elseif(APPLE) +# set(PLATFORM_EXTENSIONS_SRC +# ../extensions/proj.win32/Win32InputBox.cpp +# ) + +elseif(MACOSX) else() - +# set(PLATFORM_EXTENSIONS_SRC +# ../../extensions/GUI/CCEditBox/CCEditBoxImplNone.cpp) endif() include_directories( - .. + ../../extensions +) + +set(COCOS_EXTENSIONS_SRC + + ../extensions/assets-manager/AssetsManager.cpp + ../extensions/GUI/CCControlExtension/CCControl.cpp + ../extensions/GUI/CCControlExtension/CCControlButton.cpp + ../extensions/GUI/CCControlExtension/CCControlColourPicker.cpp + ../extensions/GUI/CCControlExtension/CCControlHuePicker.cpp + ../extensions/GUI/CCControlExtension/CCControlPotentiometer.cpp + ../extensions/GUI/CCControlExtension/CCControlSaturationBrightnessPicker.cpp + ../extensions/GUI/CCControlExtension/CCControlSlider.cpp + ../extensions/GUI/CCControlExtension/CCControlStepper.cpp + ../extensions/GUI/CCControlExtension/CCControlSwitch.cpp + ../extensions/GUI/CCControlExtension/CCControlUtils.cpp + ../extensions/GUI/CCControlExtension/CCInvocation.cpp + ../extensions/GUI/CCScrollView/CCScrollView.cpp + ../extensions/GUI/CCScrollView/CCTableView.cpp + ../extensions/GUI/CCScrollView/CCTableViewCell.cpp + ../extensions/physics-nodes/CCPhysicsDebugNode.cpp + ../extensions/physics-nodes/CCPhysicsSprite.cpp + ${PLATFORM_EXTENSIONS_SRC} )