emscripten.toolchain.cmake 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #
  2. # Copyright (c) 2008-2015 the Urho3D project.
  3. #
  4. # Permission is hereby granted, free of charge, to any person obtaining a copy
  5. # of this software and associated documentation files (the "Software"), to deal
  6. # in the Software without restriction, including without limitation the rights
  7. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. # copies of the Software, and to permit persons to whom the Software is
  9. # furnished to do so, subject to the following conditions:
  10. #
  11. # The above copyright notice and this permission notice shall be included in
  12. # all copies or substantial portions of the Software.
  13. #
  14. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  20. # THE SOFTWARE.
  21. #
  22. # Based on cmake/Modules/Platform/Emscripten.cmake from https://github.com/kripken/emscripten
  23. cmake_minimum_required (VERSION 2.6.3)
  24. if (CMAKE_TOOLCHAIN_FILE)
  25. # Reference toolchain variable to suppress "unused variable" warning
  26. mark_as_advanced (CMAKE_TOOLCHAIN_FILE)
  27. endif ()
  28. # this one is important
  29. set (CMAKE_SYSTEM_NAME Linux)
  30. # this one not so much
  31. set (CMAKE_SYSTEM_VERSION 1)
  32. # specify the cross compiler
  33. if (CMAKE_HOST_WIN32)
  34. set (TOOL_EXT .bat)
  35. endif ()
  36. if (NOT EMSCRIPTEN_ROOT_PATH)
  37. if (DEFINED ENV{EMSCRIPTEN_ROOT_PATH})
  38. file (TO_CMAKE_PATH $ENV{EMSCRIPTEN_ROOT_PATH} EMSCRIPTEN_ROOT_PATH)
  39. elseif (DEFINED ENV{EMSCRIPTEN})
  40. file (TO_CMAKE_PATH $ENV{EMSCRIPTEN} EMSCRIPTEN_ROOT_PATH)
  41. endif ()
  42. endif ()
  43. if (NOT EXISTS ${EMSCRIPTEN_ROOT_PATH}/emcc${TOOL_EXT})
  44. message (FATAL_ERROR "Could not find Emscripten cross compilation tool. "
  45. "Use EMSCRIPTEN_ROOT_PATH environment variable or build option to specify the location of the toolchain. "
  46. "Or use the canonical EMSCRIPTEN environment variable by calling emsdk_env script.")
  47. endif ()
  48. if (NOT EMCC_VERSION)
  49. execute_process (COMMAND ${EMSCRIPTEN_ROOT_PATH}/emcc${TOOL_EXT} --version RESULT_VARIABLE EXIT_CODE OUTPUT_VARIABLE EMCC_VERSION ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
  50. if (EXIT_CODE EQUAL 0)
  51. string (REGEX MATCH "[^ .]+\\.[^.]+\\.[^ ]+" EMCC_VERSION "${EMCC_VERSION}") # Stringify as it could be empty when an error has occured
  52. else ()
  53. message (FATAL_ERROR "Could not determine the emcc version. Make sure you have installed and activated the Emscripten SDK correctly.")
  54. endif ()
  55. set (EMCC_VERSION ${EMCC_VERSION} CACHE STRING "emcc version being used in this build tree") # Cache the result even when there was error in determining the version
  56. endif ()
  57. set (COMPILER_PATH ${EMSCRIPTEN_ROOT_PATH})
  58. # ccache support could only be enabled for emcc prior to 1.31.3 when the CCACHE_CPP2 env var is also set to 1, newer emcc version could enable ccache support without this caveat (see https://github.com/kripken/emscripten/issues/3365 for more detail)
  59. # The CCACHE_CPP2 env var tells ccache to fallback to use original input source file instead of preprocessed one when passing on the compilation task to the compiler proper
  60. if (NOT CMAKE_C_COMPILER AND "$ENV{USE_CCACHE}" AND NOT CMAKE_HOST_WIN32 AND ("$ENV{CCACHE_CPP2}" OR NOT EMCC_VERSION VERSION_LESS 1.31.3))
  61. if (NOT $ENV{PATH} MATCHES ${EMSCRIPTEN_ROOT_PATH})
  62. message (FATAL_ERROR "The bin directory containing the compiler toolchain (${EMSCRIPTEN_ROOT_PATH}) has not been added in the PATH environment variable. "
  63. "This is required to enable ccache support for Emscripten compiler toolchain.")
  64. endif ()
  65. execute_process (COMMAND which ccache RESULT_VARIABLE EXIT_CODE OUTPUT_VARIABLE CCACHE ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
  66. if (EXIT_CODE EQUAL 0)
  67. foreach (name emcc em++)
  68. execute_process (COMMAND ${CMAKE_COMMAND} -E create_symlink ${CCACHE} ${CMAKE_BINARY_DIR}/${name})
  69. endforeach ()
  70. set (COMPILER_PATH ${CMAKE_BINARY_DIR})
  71. else ()
  72. message (WARNING "ccache may not have been installed on this host system. "
  73. "This is required to enable ccache support for Emscripten compiler toolchain. CMake has been configured to use the actual compiler toolchain instead of ccache. "
  74. "In order to rectify this, the build tree must be regenerated after installing ccache.")
  75. endif ()
  76. endif ()
  77. set (CMAKE_C_COMPILER ${COMPILER_PATH}/emcc${TOOL_EXT} CACHE PATH "C compiler")
  78. set (CMAKE_CXX_COMPILER ${COMPILER_PATH}/em++${TOOL_EXT} CACHE PATH "C++ compiler")
  79. set (CMAKE_AR ${EMSCRIPTEN_ROOT_PATH}/emar${TOOL_EXT} CACHE PATH "archive")
  80. set (CMAKE_RANLIB ${EMSCRIPTEN_ROOT_PATH}/emranlib${TOOL_EXT} CACHE PATH "ranlib")
  81. # Specific to Emscripten
  82. set (EMRUN ${EMSCRIPTEN_ROOT_PATH}/emrun${TOOL_EXT} CACHE PATH "emrun")
  83. set (EMPACKAGER python ${EMSCRIPTEN_ROOT_PATH}/tools/file_packager.py CACHE PATH "file_packager.py")
  84. # specify the system root
  85. if (NOT EMSCRIPTEN_SYSROOT)
  86. if (DEFINED ENV{EMSCRIPTEN_SYSROOT})
  87. file (TO_CMAKE_PATH $ENV{EMSCRIPTEN_SYSROOT} EMSCRIPTEN_SYSROOT)
  88. else ()
  89. set (EMSCRIPTEN_SYSROOT ${EMSCRIPTEN_ROOT_PATH}/system)
  90. endif ()
  91. if (NOT EXISTS ${EMSCRIPTEN_SYSROOT})
  92. message (FATAL_ERROR "Could not find Emscripten system root. "
  93. "Use EMSCRIPTEN_SYSROOT environment variable or build option to specify the location of system root.")
  94. endif ()
  95. set (EMSCRIPTEN_ROOT_PATH ${EMSCRIPTEN_ROOT_PATH} CACHE STRING "Root path to Emscripten cross-compiler tools (Emscripten cross-compiling build only)" FORCE)
  96. set (EMSCRIPTEN_SYSROOT ${EMSCRIPTEN_SYSROOT} CACHE PATH "Path to Emscripten system root (Emscripten cross-compiling build only)" FORCE)
  97. endif ()
  98. set (CMAKE_FIND_ROOT_PATH ${EMSCRIPTEN_SYSROOT})
  99. # only search libraries, and headers in the target directories
  100. set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  101. set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  102. set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  103. # Since currently CMake does not able to identify Emscripten cross compiler, so set the compiler identification explicitly
  104. # However, don't force it so the rest of the compiler checks are still being performed
  105. set (CMAKE_C_COMPILER_ID_RUN TRUE)
  106. set (CMAKE_C_COMPILER_ID Clang)
  107. set (CMAKE_CXX_COMPILER_ID_RUN TRUE)
  108. set (CMAKE_CXX_COMPILER_ID Clang)
  109. # Set required compiler flags for internal CMake various check_xxx() macros which rely on the error to occur for the check to be performed correctly
  110. set (CMAKE_REQUIRED_FLAGS "-s ERROR_ON_UNDEFINED_SYMBOLS=1")
  111. # Use response files on Windows host
  112. if (CMAKE_HOST_WIN32)
  113. foreach (lang C CXX)
  114. foreach (cat LIBRARIES OBJECTS INCLUDES)
  115. set (CMAKE_${lang}_USE_RESPONSE_FILE_FOR_${cat} 1)
  116. endforeach ()
  117. set (CMAKE_${lang}_CREATE_STATIC_LIBRARY "<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>")
  118. endforeach ()
  119. endif ()
  120. set (EMSCRIPTEN 1)