Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
d14e007f
Commit
d14e007f
authored
Jan 30, 2014
by
Roman Donchenko
Committed by
OpenCV Buildbot
Jan 30, 2014
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2231 from asmorkalov:android_toolchain_update
parents
40f6f679
c8150436
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
54 additions
and
27 deletions
+54
-27
android.toolchain.cmake
platforms/android/android.toolchain.cmake
+54
-27
No files found.
platforms/android/android.toolchain.cmake
View file @
d14e007f
# Copyright (c) 2010-2011, Ethan Rublee
# Copyright (c) 2010-2011, Ethan Rublee
# Copyright (c) 2011-201
3
, Andrey Kamaev
# Copyright (c) 2011-201
4
, Andrey Kamaev
# All rights reserved.
# All rights reserved.
#
#
# Redistribution and use in source and binary forms, with or without
# Redistribution and use in source and binary forms, with or without
...
@@ -12,9 +12,9 @@
...
@@ -12,9 +12,9 @@
# this list of conditions and the following disclaimer in the documentation
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
# and/or other materials provided with the distribution.
#
#
# 3.
The name of the copyright holders may be used to endorse or promote
# 3.
Neither the name of the copyright holder nor the names of its
#
products derived from this software without specific prior written
#
contributors may be used to endorse or promote products derived from this
# permission.
#
software without specific prior written
permission.
#
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
@@ -29,12 +29,12 @@
...
@@ -29,12 +29,12 @@
# POSSIBILITY OF SUCH DAMAGE.
# POSSIBILITY OF SUCH DAMAGE.
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# Android CMake toolchain file, for use with the Android NDK r5-r
8
# Android CMake toolchain file, for use with the Android NDK r5-r
9
# Requires cmake 2.6.3 or newer (2.8.5 or newer is recommended).
# Requires cmake 2.6.3 or newer (2.8.5 or newer is recommended).
# See home page: https://github.com/taka-no-me/android-cmake
# See home page: https://github.com/taka-no-me/android-cmake
#
#
# The file is mantained by the OpenCV project. The latest version can be get at
# The file is mantained by the OpenCV project. The latest version can be get at
# http
s://github.com/Itseez/opencv/tree/master/platform
s/android/android.toolchain.cmake
# http
://code.opencv.org/projects/opencv/repository/revisions/master/change
s/android/android.toolchain.cmake
#
#
# Usage Linux:
# Usage Linux:
# $ export ANDROID_NDK=/absolute/path/to/the/android-ndk
# $ export ANDROID_NDK=/absolute/path/to/the/android-ndk
...
@@ -87,8 +87,7 @@
...
@@ -87,8 +87,7 @@
# "armeabi-v6 with VFP" - tuned for ARMv6 processors having VFP.
# "armeabi-v6 with VFP" - tuned for ARMv6 processors having VFP.
# "x86" - matches to the NDK ABI with the same name.
# "x86" - matches to the NDK ABI with the same name.
# See ${ANDROID_NDK}/docs/CPU-ARCH-ABIS.html for the documentation.
# See ${ANDROID_NDK}/docs/CPU-ARCH-ABIS.html for the documentation.
# "mips" - matches to the NDK ABI with the same name
# "mips" - matches to the NDK ABI with the same name.
# (It is not tested on real devices by the authos of this toolchain)
# See ${ANDROID_NDK}/docs/CPU-ARCH-ABIS.html for the documentation.
# See ${ANDROID_NDK}/docs/CPU-ARCH-ABIS.html for the documentation.
#
#
# ANDROID_NATIVE_API_LEVEL=android-8 - level of Android API compile for.
# ANDROID_NATIVE_API_LEVEL=android-8 - level of Android API compile for.
...
@@ -292,6 +291,16 @@
...
@@ -292,6 +291,16 @@
# - April 2013
# - April 2013
# [+] support non-release NDK layouts (from Linaro git and Android git)
# [+] support non-release NDK layouts (from Linaro git and Android git)
# [~] automatically detect if explicit link to crtbegin_*.o is needed
# [~] automatically detect if explicit link to crtbegin_*.o is needed
# - June 2013
# [~] fixed stl include path for standalone toolchain made by NDK >= r8c
# - July 2013
# [+] updated for NDK r9
# - November 2013
# [+] updated for NDK r9b
# - December 2013
# [+] updated for NDK r9c
# - January 2014
# [~] fix copying of shared STL
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
cmake_minimum_required
(
VERSION 2.6.3
)
cmake_minimum_required
(
VERSION 2.6.3
)
...
@@ -318,7 +327,7 @@ set( CMAKE_SYSTEM_VERSION 1 )
...
@@ -318,7 +327,7 @@ set( CMAKE_SYSTEM_VERSION 1 )
# rpath makes low sence for Android
# rpath makes low sence for Android
set
(
CMAKE_SKIP_RPATH TRUE CACHE BOOL
"If set, runtime paths are not added when using shared libraries."
)
set
(
CMAKE_SKIP_RPATH TRUE CACHE BOOL
"If set, runtime paths are not added when using shared libraries."
)
set
(
ANDROID_SUPPORTED_NDK_VERSIONS
${
ANDROID_EXTRA_NDK_VERSIONS
}
-r9b -r9 -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5
""
)
set
(
ANDROID_SUPPORTED_NDK_VERSIONS
${
ANDROID_EXTRA_NDK_VERSIONS
}
-r9
c -r9
b -r9 -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5
""
)
if
(
NOT DEFINED ANDROID_NDK_SEARCH_PATHS
)
if
(
NOT DEFINED ANDROID_NDK_SEARCH_PATHS
)
if
(
CMAKE_HOST_WIN32
)
if
(
CMAKE_HOST_WIN32
)
file
(
TO_CMAKE_PATH
"$ENV{PROGRAMFILES}"
ANDROID_NDK_SEARCH_PATHS
)
file
(
TO_CMAKE_PATH
"$ENV{PROGRAMFILES}"
ANDROID_NDK_SEARCH_PATHS
)
...
@@ -464,7 +473,7 @@ endif()
...
@@ -464,7 +473,7 @@ endif()
# detect current host platform
# detect current host platform
if
(
NOT DEFINED ANDROID_NDK_HOST_X64 AND
CMAKE_HOST_SYSTEM_PROCESSOR MATCHES
"amd64|x86_64|AMD64"
)
if
(
NOT DEFINED ANDROID_NDK_HOST_X64
AND
(
CMAKE_HOST_SYSTEM_PROCESSOR MATCHES
"amd64|x86_64|AMD64"
OR CMAKE_HOST_APPLE
)
)
set
(
ANDROID_NDK_HOST_X64 1 CACHE BOOL
"Try to use 64-bit compiler toolchain"
)
set
(
ANDROID_NDK_HOST_X64 1 CACHE BOOL
"Try to use 64-bit compiler toolchain"
)
mark_as_advanced
(
ANDROID_NDK_HOST_X64
)
mark_as_advanced
(
ANDROID_NDK_HOST_X64
)
endif
()
endif
()
...
@@ -484,9 +493,7 @@ else()
...
@@ -484,9 +493,7 @@ else()
message
(
FATAL_ERROR
"Cross-compilation on your platform is not supported by this cmake toolchain"
)
message
(
FATAL_ERROR
"Cross-compilation on your platform is not supported by this cmake toolchain"
)
endif
()
endif
()
# CMAKE_HOST_SYSTEM_PROCESSOR on MacOS X always says i386 on Intel platform
if
(
NOT ANDROID_NDK_HOST_X64
)
# So we do not trust ANDROID_NDK_HOST_X64 on Apple hosts
if
(
NOT ANDROID_NDK_HOST_X64 AND NOT CMAKE_HOST_APPLE
)
set
(
ANDROID_NDK_HOST_SYSTEM_NAME
${
ANDROID_NDK_HOST_SYSTEM_NAME2
}
)
set
(
ANDROID_NDK_HOST_SYSTEM_NAME
${
ANDROID_NDK_HOST_SYSTEM_NAME2
}
)
endif
()
endif
()
...
@@ -634,8 +641,6 @@ endif()
...
@@ -634,8 +641,6 @@ endif()
macro
(
__GLOB_NDK_TOOLCHAINS __availableToolchainsVar __availableToolchainsLst __toolchain_subpath
)
macro
(
__GLOB_NDK_TOOLCHAINS __availableToolchainsVar __availableToolchainsLst __toolchain_subpath
)
foreach
(
__toolchain
${${
__availableToolchainsLst
}}
)
foreach
(
__toolchain
${${
__availableToolchainsLst
}}
)
# Skip renderscript folder. It's not C++ toolchain
if
(
NOT
${
__toolchain
}
STREQUAL
"renderscript"
)
if
(
"
${
__toolchain
}
"
MATCHES
"-clang3[.][0-9]$"
AND NOT EXISTS
"
${
ANDROID_NDK_TOOLCHAINS_PATH
}
/
${
__toolchain
}${
__toolchain_subpath
}
"
)
if
(
"
${
__toolchain
}
"
MATCHES
"-clang3[.][0-9]$"
AND NOT EXISTS
"
${
ANDROID_NDK_TOOLCHAINS_PATH
}
/
${
__toolchain
}${
__toolchain_subpath
}
"
)
string
(
REGEX REPLACE
"-clang3[.][0-9]$"
"-4.6"
__gcc_toolchain
"
${
__toolchain
}
"
)
string
(
REGEX REPLACE
"-clang3[.][0-9]$"
"-4.6"
__gcc_toolchain
"
${
__toolchain
}
"
)
else
()
else
()
...
@@ -657,7 +662,6 @@ macro( __GLOB_NDK_TOOLCHAINS __availableToolchainsVar __availableToolchainsLst _
...
@@ -657,7 +662,6 @@ macro( __GLOB_NDK_TOOLCHAINS __availableToolchainsVar __availableToolchainsLst _
list
(
APPEND
${
__availableToolchainsVar
}
"
${
__toolchain
}
"
)
list
(
APPEND
${
__availableToolchainsVar
}
"
${
__toolchain
}
"
)
endif
()
endif
()
unset
(
__gcc_toolchain
)
unset
(
__gcc_toolchain
)
endif
()
endforeach
()
endforeach
()
endmacro
()
endmacro
()
...
@@ -687,6 +691,7 @@ if( BUILD_WITH_ANDROID_NDK )
...
@@ -687,6 +691,7 @@ if( BUILD_WITH_ANDROID_NDK )
endif
()
endif
()
__LIST_FILTER
(
__availableToolchainsLst
"^[.]"
)
__LIST_FILTER
(
__availableToolchainsLst
"^[.]"
)
__LIST_FILTER
(
__availableToolchainsLst
"llvm"
)
__LIST_FILTER
(
__availableToolchainsLst
"llvm"
)
__LIST_FILTER
(
__availableToolchainsLst
"renderscript"
)
__GLOB_NDK_TOOLCHAINS
(
__availableToolchains __availableToolchainsLst
"
${
ANDROID_NDK_TOOLCHAINS_SUBPATH
}
"
)
__GLOB_NDK_TOOLCHAINS
(
__availableToolchains __availableToolchainsLst
"
${
ANDROID_NDK_TOOLCHAINS_SUBPATH
}
"
)
if
(
NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2
)
if
(
NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2
)
__GLOB_NDK_TOOLCHAINS
(
__availableToolchains __availableToolchainsLst
"
${
ANDROID_NDK_TOOLCHAINS_SUBPATH2
}
"
)
__GLOB_NDK_TOOLCHAINS
(
__availableToolchains __availableToolchainsLst
"
${
ANDROID_NDK_TOOLCHAINS_SUBPATH2
}
"
)
...
@@ -975,7 +980,11 @@ if( BUILD_WITH_STANDALONE_TOOLCHAIN )
...
@@ -975,7 +980,11 @@ if( BUILD_WITH_STANDALONE_TOOLCHAIN )
set
(
ANDROID_SYSROOT
"
${
ANDROID_STANDALONE_TOOLCHAIN
}
/sysroot"
)
set
(
ANDROID_SYSROOT
"
${
ANDROID_STANDALONE_TOOLCHAIN
}
/sysroot"
)
if
(
NOT ANDROID_STL STREQUAL
"none"
)
if
(
NOT ANDROID_STL STREQUAL
"none"
)
set
(
ANDROID_STL_INCLUDE_DIRS
"
${
ANDROID_STANDALONE_TOOLCHAIN
}
/include/c++/
${
ANDROID_COMPILER_VERSION
}
"
)
if
(
NOT EXISTS
"
${
ANDROID_STL_INCLUDE_DIRS
}
"
)
# old location ( pre r8c )
set
(
ANDROID_STL_INCLUDE_DIRS
"
${
ANDROID_STANDALONE_TOOLCHAIN
}
/
${
ANDROID_TOOLCHAIN_MACHINE_NAME
}
/include/c++/
${
ANDROID_COMPILER_VERSION
}
"
)
set
(
ANDROID_STL_INCLUDE_DIRS
"
${
ANDROID_STANDALONE_TOOLCHAIN
}
/
${
ANDROID_TOOLCHAIN_MACHINE_NAME
}
/include/c++/
${
ANDROID_COMPILER_VERSION
}
"
)
endif
()
if
(
ARMEABI_V7A AND EXISTS
"
${
ANDROID_STL_INCLUDE_DIRS
}
/
${
ANDROID_TOOLCHAIN_MACHINE_NAME
}
/
${
CMAKE_SYSTEM_PROCESSOR
}
/bits"
)
if
(
ARMEABI_V7A AND EXISTS
"
${
ANDROID_STL_INCLUDE_DIRS
}
/
${
ANDROID_TOOLCHAIN_MACHINE_NAME
}
/
${
CMAKE_SYSTEM_PROCESSOR
}
/bits"
)
list
(
APPEND ANDROID_STL_INCLUDE_DIRS
"
${
ANDROID_STL_INCLUDE_DIRS
}
/
${
ANDROID_TOOLCHAIN_MACHINE_NAME
}
/
${
CMAKE_SYSTEM_PROCESSOR
}
"
)
list
(
APPEND ANDROID_STL_INCLUDE_DIRS
"
${
ANDROID_STL_INCLUDE_DIRS
}
/
${
ANDROID_TOOLCHAIN_MACHINE_NAME
}
/
${
CMAKE_SYSTEM_PROCESSOR
}
"
)
elseif
(
ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS
"
${
ANDROID_STL_INCLUDE_DIRS
}
/
${
ANDROID_TOOLCHAIN_MACHINE_NAME
}
/thumb/bits"
)
elseif
(
ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS
"
${
ANDROID_STL_INCLUDE_DIRS
}
/
${
ANDROID_TOOLCHAIN_MACHINE_NAME
}
/thumb/bits"
)
...
@@ -1130,15 +1139,7 @@ endif()
...
@@ -1130,15 +1139,7 @@ endif()
# case of shared STL linkage
# case of shared STL linkage
if
(
ANDROID_STL MATCHES
"shared"
AND DEFINED __libstl
)
if
(
ANDROID_STL MATCHES
"shared"
AND DEFINED __libstl
)
string
(
REPLACE
"_static.a"
"_shared.so"
__libstl
"
${
__libstl
}
"
)
string
(
REPLACE
"_static.a"
"_shared.so"
__libstl
"
${
__libstl
}
"
)
if
(
NOT _CMAKE_IN_TRY_COMPILE AND __libstl MATCHES
"[.]so$"
)
# TODO: check if .so file exists before the renaming
get_filename_component
(
__libstlname
"
${
__libstl
}
"
NAME
)
execute_process
(
COMMAND
"
${
CMAKE_COMMAND
}
"
-E copy_if_different
"
${
__libstl
}
"
"
${
LIBRARY_OUTPUT_PATH
}
/
${
__libstlname
}
"
RESULT_VARIABLE __fileCopyProcess
)
if
(
NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS
"
${
LIBRARY_OUTPUT_PATH
}
/
${
__libstlname
}
"
)
message
(
SEND_ERROR
"Failed copying of
${
__libstl
}
to the
${
LIBRARY_OUTPUT_PATH
}
/
${
__libstlname
}
"
)
endif
()
unset
(
__fileCopyProcess
)
unset
(
__libstlname
)
endif
()
endif
()
endif
()
...
@@ -1503,7 +1504,8 @@ endif()
...
@@ -1503,7 +1504,8 @@ endif()
# global includes and link directories
# global includes and link directories
include_directories
(
SYSTEM
"
${
ANDROID_SYSROOT
}
/usr/include"
${
ANDROID_STL_INCLUDE_DIRS
}
)
include_directories
(
SYSTEM
"
${
ANDROID_SYSROOT
}
/usr/include"
${
ANDROID_STL_INCLUDE_DIRS
}
)
link_directories
(
"
${
CMAKE_INSTALL_PREFIX
}
/libs/
${
ANDROID_NDK_ABI_NAME
}
"
)
get_filename_component
(
__android_install_path
"
${
CMAKE_INSTALL_PREFIX
}
/libs/
${
ANDROID_NDK_ABI_NAME
}
"
ABSOLUTE
)
# avoid CMP0015 policy warning
link_directories
(
"
${
__android_install_path
}
"
)
# detect if need link crtbegin_so.o explicitly
# detect if need link crtbegin_so.o explicitly
if
(
NOT DEFINED ANDROID_EXPLICIT_CRT_LINK
)
if
(
NOT DEFINED ANDROID_EXPLICIT_CRT_LINK
)
...
@@ -1555,6 +1557,18 @@ if(NOT _CMAKE_IN_TRY_COMPILE)
...
@@ -1555,6 +1557,18 @@ if(NOT _CMAKE_IN_TRY_COMPILE)
set
(
LIBRARY_OUTPUT_PATH
"
${
LIBRARY_OUTPUT_PATH_ROOT
}
/libs/
${
ANDROID_NDK_ABI_NAME
}
"
CACHE PATH
"path for android libs"
)
set
(
LIBRARY_OUTPUT_PATH
"
${
LIBRARY_OUTPUT_PATH_ROOT
}
/libs/
${
ANDROID_NDK_ABI_NAME
}
"
CACHE PATH
"path for android libs"
)
endif
()
endif
()
# copy shaed stl library to build directory
if
(
NOT _CMAKE_IN_TRY_COMPILE AND __libstl MATCHES
"[.]so$"
)
get_filename_component
(
__libstlname
"
${
__libstl
}
"
NAME
)
execute_process
(
COMMAND
"
${
CMAKE_COMMAND
}
"
-E copy_if_different
"
${
__libstl
}
"
"
${
LIBRARY_OUTPUT_PATH
}
/
${
__libstlname
}
"
RESULT_VARIABLE __fileCopyProcess
)
if
(
NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS
"
${
LIBRARY_OUTPUT_PATH
}
/
${
__libstlname
}
"
)
message
(
SEND_ERROR
"Failed copying of
${
__libstl
}
to the
${
LIBRARY_OUTPUT_PATH
}
/
${
__libstlname
}
"
)
endif
()
unset
(
__fileCopyProcess
)
unset
(
__libstlname
)
endif
()
# set these global flags for cmake client scripts to change behavior
# set these global flags for cmake client scripts to change behavior
set
(
ANDROID True
)
set
(
ANDROID True
)
set
(
BUILD_ANDROID True
)
set
(
BUILD_ANDROID True
)
...
@@ -1663,6 +1677,19 @@ if( NOT PROJECT_NAME STREQUAL "CMAKE_TRY_COMPILE" )
...
@@ -1663,6 +1677,19 @@ if( NOT PROJECT_NAME STREQUAL "CMAKE_TRY_COMPILE" )
endif
()
endif
()
# force cmake to produce / instead of \ in build commands for Ninja generator
if
(
CMAKE_GENERATOR MATCHES
"Ninja"
AND CMAKE_HOST_WIN32
)
# it is a bad hack after all
# CMake generates Ninja makefiles with UNIX paths only if it thinks that we are going to build with MinGW
set
(
CMAKE_COMPILER_IS_MINGW TRUE
)
# tell CMake that we are MinGW
set
(
CMAKE_CROSSCOMPILING TRUE
)
# stop recursion
enable_language
(
C
)
enable_language
(
CXX
)
# unset( CMAKE_COMPILER_IS_MINGW ) # can't unset because CMake does not convert back-slashes in response files without it
unset
(
MINGW
)
endif
()
# set some obsolete variables for backward compatibility
# set some obsolete variables for backward compatibility
set
(
ANDROID_SET_OBSOLETE_VARIABLES ON CACHE BOOL
"Define obsolete Andrid-specific cmake variables"
)
set
(
ANDROID_SET_OBSOLETE_VARIABLES ON CACHE BOOL
"Define obsolete Andrid-specific cmake variables"
)
mark_as_advanced
(
ANDROID_SET_OBSOLETE_VARIABLES
)
mark_as_advanced
(
ANDROID_SET_OBSOLETE_VARIABLES
)
...
@@ -1717,7 +1744,7 @@ endif()
...
@@ -1717,7 +1744,7 @@ endif()
# BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used
# BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used
# ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform
# ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform
# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86" or "mips" depending on ANDROID_ABI
# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86" or "mips" depending on ANDROID_ABI
# ANDROID_NDK_RELEASE : one of r5, r5b, r5c, r6, r6b, r7, r7b, r7c, r8, r8b, r8c, r8d, r8e; set only for NDK
# ANDROID_NDK_RELEASE : one of r5, r5b, r5c, r6, r6b, r7, r7b, r7c, r8, r8b, r8c, r8d, r8e
, r9, r9b, r9c
; set only for NDK
# ANDROID_ARCH_NAME : "arm" or "x86" or "mips" depending on ANDROID_ABI
# ANDROID_ARCH_NAME : "arm" or "x86" or "mips" depending on ANDROID_ABI
# ANDROID_SYSROOT : path to the compiler sysroot
# ANDROID_SYSROOT : path to the compiler sysroot
# TOOL_OS_SUFFIX : "" or ".exe" depending on host platform
# TOOL_OS_SUFFIX : "" or ".exe" depending on host platform
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment