Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/platforms/android/build-tests/test_cmake_build.py
16337 views
1
#!/usr/bin/env python
2
3
import unittest
4
import os, sys, subprocess, argparse, shutil, re
5
import logging as log
6
7
log.basicConfig(format='%(message)s', level=log.DEBUG)
8
9
CMAKE_TEMPLATE='''\
10
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
11
12
# Enable C++11
13
set(CMAKE_CXX_STANDARD 11)
14
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
15
16
SET(PROJECT_NAME hello-android)
17
PROJECT(${PROJECT_NAME})
18
19
FIND_PACKAGE(OpenCV REQUIRED %(libset)s)
20
FILE(GLOB srcs "*.cpp")
21
22
ADD_EXECUTABLE(${PROJECT_NAME} ${srcs})
23
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenCV_LIBS} dl z)
24
'''
25
26
CPP_TEMPLATE = '''\
27
#include <opencv2/core.hpp>
28
#include <opencv2/highgui.hpp>
29
#include <opencv2/imgproc.hpp>
30
using namespace cv;
31
const char* message = "Hello Android!";
32
int main(int argc, char* argv[])
33
{
34
(void)argc; (void)argv;
35
printf("%s\\n", message);
36
Size textsize = getTextSize(message, FONT_HERSHEY_COMPLEX, 3, 5, 0);
37
Mat img(textsize.height + 20, textsize.width + 20, CV_32FC1, Scalar(230,230,230));
38
putText(img, message, Point(10, img.rows - 10), FONT_HERSHEY_COMPLEX, 3, Scalar(0, 0, 0), 5);
39
imwrite("/mnt/sdcard/HelloAndroid.png", img);
40
return 0;
41
}
42
'''
43
44
#===================================================================================================
45
46
class TestCmakeBuild(unittest.TestCase):
47
def __init__(self, libset, abi, toolchain, opencv_cmake_path, workdir, *args, **kwargs):
48
unittest.TestCase.__init__(self, *args, **kwargs)
49
self.libset = libset
50
self.abi = abi
51
self.toolchain = toolchain
52
self.opencv_cmake_path = opencv_cmake_path
53
self.workdir = workdir
54
self.srcdir = os.path.join(self.workdir, "src")
55
self.bindir = os.path.join(self.workdir, "build")
56
57
def shortDescription(self):
58
return "ABI: %s, TOOLCHAIN: %s, LIBSET: %s" % (self.abi, self.toolchain, self.libset)
59
60
def gen_cmakelists(self):
61
return CMAKE_TEMPLATE % {"libset": self.libset}
62
63
def gen_code(self):
64
return CPP_TEMPLATE
65
66
def write_src_file(self, fname, content):
67
with open(os.path.join(self.srcdir, fname), "w") as f:
68
f.write(content)
69
70
def setUp(self):
71
if os.path.exists(self.workdir):
72
shutil.rmtree(self.workdir)
73
os.mkdir(self.workdir)
74
os.mkdir(self.srcdir)
75
os.mkdir(self.bindir)
76
self.write_src_file("CMakeLists.txt", self.gen_cmakelists())
77
self.write_src_file("main.cpp", self.gen_code())
78
os.chdir(self.bindir)
79
80
def tearDown(self):
81
if os.path.exists(self.workdir):
82
shutil.rmtree(self.workdir)
83
84
def runTest(self):
85
cmd = [
86
"cmake",
87
"-GNinja",
88
"-DOpenCV_DIR=%s" % self.opencv_cmake_path,
89
"-DANDROID_ABI=%s" % self.abi,
90
"-DCMAKE_TOOLCHAIN_FILE=%s" % os.path.join(self.opencv_cmake_path, "android.toolchain.cmake"),
91
"-DANDROID_TOOLCHAIN_NAME=%s" % self.toolchain,
92
self.srcdir
93
]
94
log.info("Executing: %s" % cmd)
95
retcode = subprocess.call(cmd)
96
self.assertEqual(retcode, 0, "cmake failed")
97
98
cmd = ["ninja"]
99
log.info("Executing: %s" % cmd)
100
retcode = subprocess.call(cmd)
101
self.assertEqual(retcode, 0, "make failed")
102
103
def suite(workdir, opencv_cmake_path):
104
abis = {
105
"armeabi":"arm-linux-androideabi-4.8",
106
"armeabi-v7a":"arm-linux-androideabi-4.8",
107
"arm64-v8a":"aarch64-linux-android-4.9",
108
"x86":"x86-4.8",
109
"x86_64":"x86_64-4.9",
110
"mips":"mipsel-linux-android-4.8",
111
"mips64":"mips64el-linux-android-4.9"
112
}
113
114
suite = unittest.TestSuite()
115
for libset in ["", "opencv_java"]:
116
for abi, toolchain in abis.items():
117
suite.addTest(TestCmakeBuild(libset, abi, toolchain, opencv_cmake_path, workdir))
118
return suite
119
120
121
if __name__ == '__main__':
122
parser = argparse.ArgumentParser(description='Test OpenCV for Android SDK with cmake')
123
parser.add_argument('--sdk_path', help="Path to Android SDK to use for build")
124
parser.add_argument('--ndk_path', help="Path to Android NDK to use for build")
125
parser.add_argument("--workdir", default="testspace", help="Working directory (and output)")
126
parser.add_argument("opencv_cmake_path", help="Path to folder with OpenCVConfig.cmake and android.toolchain.cmake (usually <SDK>/sdk/native/jni/")
127
128
args = parser.parse_args()
129
130
if args.sdk_path is not None:
131
os.environ["ANDROID_SDK"] = os.path.abspath(args.sdk_path)
132
if args.ndk_path is not None:
133
os.environ["ANDROID_NDK"] = os.path.abspath(args.ndk_path)
134
135
print("Using SDK: %s" % os.environ["ANDROID_SDK"])
136
print("Using NDK: %s" % os.environ["ANDROID_NDK"])
137
138
res = unittest.TextTestRunner(verbosity=3).run(suite(os.path.abspath(args.workdir), os.path.abspath(args.opencv_cmake_path)))
139
if not res.wasSuccessful():
140
sys.exit(res)
141
142