Path: blob/master/platforms/android/build-tests/test_cmake_build.py
16337 views
#!/usr/bin/env python12import unittest3import os, sys, subprocess, argparse, shutil, re4import logging as log56log.basicConfig(format='%(message)s', level=log.DEBUG)78CMAKE_TEMPLATE='''\9CMAKE_MINIMUM_REQUIRED(VERSION 2.8)1011# Enable C++1112set(CMAKE_CXX_STANDARD 11)13set(CMAKE_CXX_STANDARD_REQUIRED TRUE)1415SET(PROJECT_NAME hello-android)16PROJECT(${PROJECT_NAME})1718FIND_PACKAGE(OpenCV REQUIRED %(libset)s)19FILE(GLOB srcs "*.cpp")2021ADD_EXECUTABLE(${PROJECT_NAME} ${srcs})22TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenCV_LIBS} dl z)23'''2425CPP_TEMPLATE = '''\26#include <opencv2/core.hpp>27#include <opencv2/highgui.hpp>28#include <opencv2/imgproc.hpp>29using namespace cv;30const char* message = "Hello Android!";31int main(int argc, char* argv[])32{33(void)argc; (void)argv;34printf("%s\\n", message);35Size textsize = getTextSize(message, FONT_HERSHEY_COMPLEX, 3, 5, 0);36Mat img(textsize.height + 20, textsize.width + 20, CV_32FC1, Scalar(230,230,230));37putText(img, message, Point(10, img.rows - 10), FONT_HERSHEY_COMPLEX, 3, Scalar(0, 0, 0), 5);38imwrite("/mnt/sdcard/HelloAndroid.png", img);39return 0;40}41'''4243#===================================================================================================4445class TestCmakeBuild(unittest.TestCase):46def __init__(self, libset, abi, toolchain, opencv_cmake_path, workdir, *args, **kwargs):47unittest.TestCase.__init__(self, *args, **kwargs)48self.libset = libset49self.abi = abi50self.toolchain = toolchain51self.opencv_cmake_path = opencv_cmake_path52self.workdir = workdir53self.srcdir = os.path.join(self.workdir, "src")54self.bindir = os.path.join(self.workdir, "build")5556def shortDescription(self):57return "ABI: %s, TOOLCHAIN: %s, LIBSET: %s" % (self.abi, self.toolchain, self.libset)5859def gen_cmakelists(self):60return CMAKE_TEMPLATE % {"libset": self.libset}6162def gen_code(self):63return CPP_TEMPLATE6465def write_src_file(self, fname, content):66with open(os.path.join(self.srcdir, fname), "w") as f:67f.write(content)6869def setUp(self):70if os.path.exists(self.workdir):71shutil.rmtree(self.workdir)72os.mkdir(self.workdir)73os.mkdir(self.srcdir)74os.mkdir(self.bindir)75self.write_src_file("CMakeLists.txt", self.gen_cmakelists())76self.write_src_file("main.cpp", self.gen_code())77os.chdir(self.bindir)7879def tearDown(self):80if os.path.exists(self.workdir):81shutil.rmtree(self.workdir)8283def runTest(self):84cmd = [85"cmake",86"-GNinja",87"-DOpenCV_DIR=%s" % self.opencv_cmake_path,88"-DANDROID_ABI=%s" % self.abi,89"-DCMAKE_TOOLCHAIN_FILE=%s" % os.path.join(self.opencv_cmake_path, "android.toolchain.cmake"),90"-DANDROID_TOOLCHAIN_NAME=%s" % self.toolchain,91self.srcdir92]93log.info("Executing: %s" % cmd)94retcode = subprocess.call(cmd)95self.assertEqual(retcode, 0, "cmake failed")9697cmd = ["ninja"]98log.info("Executing: %s" % cmd)99retcode = subprocess.call(cmd)100self.assertEqual(retcode, 0, "make failed")101102def suite(workdir, opencv_cmake_path):103abis = {104"armeabi":"arm-linux-androideabi-4.8",105"armeabi-v7a":"arm-linux-androideabi-4.8",106"arm64-v8a":"aarch64-linux-android-4.9",107"x86":"x86-4.8",108"x86_64":"x86_64-4.9",109"mips":"mipsel-linux-android-4.8",110"mips64":"mips64el-linux-android-4.9"111}112113suite = unittest.TestSuite()114for libset in ["", "opencv_java"]:115for abi, toolchain in abis.items():116suite.addTest(TestCmakeBuild(libset, abi, toolchain, opencv_cmake_path, workdir))117return suite118119120if __name__ == '__main__':121parser = argparse.ArgumentParser(description='Test OpenCV for Android SDK with cmake')122parser.add_argument('--sdk_path', help="Path to Android SDK to use for build")123parser.add_argument('--ndk_path', help="Path to Android NDK to use for build")124parser.add_argument("--workdir", default="testspace", help="Working directory (and output)")125parser.add_argument("opencv_cmake_path", help="Path to folder with OpenCVConfig.cmake and android.toolchain.cmake (usually <SDK>/sdk/native/jni/")126127args = parser.parse_args()128129if args.sdk_path is not None:130os.environ["ANDROID_SDK"] = os.path.abspath(args.sdk_path)131if args.ndk_path is not None:132os.environ["ANDROID_NDK"] = os.path.abspath(args.ndk_path)133134print("Using SDK: %s" % os.environ["ANDROID_SDK"])135print("Using NDK: %s" % os.environ["ANDROID_NDK"])136137res = unittest.TextTestRunner(verbosity=3).run(suite(os.path.abspath(args.workdir), os.path.abspath(args.opencv_cmake_path)))138if not res.wasSuccessful():139sys.exit(res)140141142