From 5f1168368f5753de621e7d113757dd71028eb466 Mon Sep 17 00:00:00 2001 From: John Zhao Date: Thu, 8 Mar 2018 15:54:14 +0800 Subject: [PATCH] First commit --- .gitignore | 3 + CommonDefs.mk | 221 ++++ LICENSE | 13 + Makefile | 23 + README.md | 9 + doc/build.sh | 36 + doc/langs.sh | 6 + doc/static/custom.css | 3 + doc/static/images/icon.png | Bin 0 -> 17927 bytes doc/zh-Hans/api.doxyfile | 2473 ++++++++++++++++++++++++++++++++++++ samples/README.md | 1 + scripts/common/detect.sh | 50 + scripts/common/echo.sh | 66 + scripts/common/host.sh | 62 + scripts/common/mkdir.sh | 25 + scripts/getfind.sh | 13 + scripts/open.sh | 19 + wrappers/README.md | 1 + 18 files changed, 3024 insertions(+) create mode 100644 .gitignore create mode 100644 CommonDefs.mk create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100755 doc/build.sh create mode 100644 doc/langs.sh create mode 100644 doc/static/custom.css create mode 100644 doc/static/images/icon.png create mode 100644 doc/zh-Hans/api.doxyfile create mode 100644 samples/README.md create mode 100644 scripts/common/detect.sh create mode 100644 scripts/common/echo.sh create mode 100755 scripts/common/host.sh create mode 100644 scripts/common/mkdir.sh create mode 100755 scripts/getfind.sh create mode 100755 scripts/open.sh create mode 100644 wrappers/README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..45753a8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store + +/doc/output/ diff --git a/CommonDefs.mk b/CommonDefs.mk new file mode 100644 index 0000000..fe9f60d --- /dev/null +++ b/CommonDefs.mk @@ -0,0 +1,221 @@ +ifndef _COMMON_DEFS_MAKE_ +_COMMON_DEFS_MAKE_ := 1 + +EMPTY := +SPACE := $(EMPTY) $(EMPTY) +COMMA := , +COLON := : +SEMICOLON := ; +QUOTE := " +SINGLE_QUOTE := ' +OPEN_PAREN := ( +CLOSE_PAREN := ) + +# Host detection + +ifeq ($(OS),Windows_NT) + +HOST_OS := Win + +ifeq ($(PROCESSOR_ARCHITEW6432),AMD64) + HOST_ARCH := x64 +else + ifeq ($(PROCESSOR_ARCHITECTURE),AMD64) + HOST_ARCH := x64 + else ifeq ($(PROCESSOR_ARCHITECTURE),x86) + HOST_ARCH := x86 + else + DUMMY := $(error "Can't detect host arch") + endif +endif + +UNAME_S := $(shell uname -s) +ifneq ($(UNAME_S),) +ifneq ($(findstring MINGW,$(UNAME_S)),) + HOST_OS := MinGW +endif +endif + +else + +UNAME_S := $(shell uname -s) +ifneq ($(findstring Linux,$(UNAME_S)),) + HOST_OS := Linux +else ifneq ($(findstring Darwin,$(UNAME_S)),) + HOST_OS := Mac +else ifneq ($(findstring MINGW,$(UNAME_S)),) + HOST_OS := MinGW +else ifneq ($(findstring MSYS,$(UNAME_S)),) + # Need MSYS on Windows + HOST_OS := Win +else + DUMMY := $(error "Can't detect host os") +endif + +UNAME_M = $(shell uname -m) +ifneq ($(findstring x86_64,$(UNAME_M)),) + HOST_ARCH := x64 +else ifneq ($(findstring x86,$(UNAME_M)),) + HOST_ARCH := x86 +else ifneq ($(findstring i686,$(UNAME_M)),) + HOST_ARCH := x86 +else ifneq ($(findstring i386,$(UNAME_M)),) + HOST_ARCH := x86 +else ifneq ($(findstring arm,$(UNAME_M)),) + HOST_ARCH := Arm +else ifneq ($(findstring aarch64,$(UNAME_M)),) + HOST_ARCH := AArch64 +else + DUMMY := $(error "Can't detect host arch") +endif + +endif + +HOST_NAME := $(HOST_OS) +ifeq ($(HOST_OS),Linux) + UNAME_A = $(shell uname -a) + ifneq ($(findstring tegra,$(UNAME_A)),) + HOST_NAME := Tegra + else ifneq ($(findstring jetsonbot,$(UNAME_A)),) + HOST_NAME := Tegra + #else ifneq ($(findstring firefly,$(UNAME_A)),) + # HOST_NAME := Firefly + endif +endif + +# Function + +mkinfo = $(info + $1) + +lower = $(shell echo $1 | tr '[:upper:]' '[:lower:]') + +# Command + +ifeq ($(HOST_OS),MinGW) + ECHO := echo -e + CC := x86_64-w64-mingw32-gcc + CXX := x86_64-w64-mingw32-g++ + MAKE := mingw32-make + BUILD := $(MAKE) +else ifeq ($(HOST_OS),Win) + ECHO := echo -e + CC := cl + CXX := cl + MAKE := make + BUILD := msbuild.exe ALL_BUILD.vcxproj /property:Configuration=Release +else + # mac & linux + ECHO := echo + # Set realpath for linux because of compiler not found with wrong path when cmake again + CC := /usr/bin/cc + CXX := /usr/bin/c++ + MAKE := make + BUILD := $(MAKE) +endif + +FIND := $(shell ./scripts/getfind.sh) + +ifeq ($(HOST_OS),Mac) + LDD := otool -L +else + LDD := ldd +endif + +# CMake + +CMAKE := cmake -DCMAKE_BUILD_TYPE=Release +ifneq ($(CC),) + CMAKE := $(CMAKE) -DCMAKE_C_COMPILER=$(CC) +endif +ifneq ($(CXX),) + CMAKE := $(CMAKE) -DCMAKE_CXX_COMPILER=$(CXX) +endif +ifneq ($(HOST_OS),Win) + ifneq ($(MAKE),) + CMAKE := $(CMAKE) -DCMAKE_MAKE_PROGRAM=$(MAKE) + endif +endif + +CMAKE_OPTIONS := +#CMAKE_OPTIONS += -DDEBUG=ON -DTIMECOST=ON +#CMAKE_OPTIONS += -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON +CMAKE_OPTIONS_AFTER := + +ifeq ($(HOST_OS),MinGW) + CMAKE += -G "MinGW Makefiles" +endif + +ifeq ($(HOST_OS),Win) +ifeq ($(HOST_ARCH),x64) + VS_VERSION = $(shell echo "$(shell which cl)" | sed -e "s/.*Visual\sStudio\s\([0-9]\+\).*/\1/g") + ifeq (15,$(VS_VERSION)) + CMAKE += -G "Visual Studio 15 2017 Win64" + else ifeq (14,$(VS_VERSION)) + CMAKE += -G "Visual Studio 14 2015 Win64" + else ifeq (12,$(VS_VERSION)) + CMAKE += -G "Visual Studio 12 2013 Win64" + else ifeq (11,$(VS_VERSION)) + CMAKE += -G "Visual Studio 11 2012 Win64" + else ifeq (10,$(VS_VERSION)) + CMAKE += -G "Visual Studio 10 2010 Win64" + else ifeq (9,$(VS_VERSION)) + CMAKE += -G "Visual Studio 9 2008 Win64" + else ifeq (8,$(VS_VERSION)) + CMAKE += -G "Visual Studio 8 2005 Win64" + else + $(call mkinfo,"Connot specify Visual Studio Win64") + endif +endif +endif + +# Shell + +# `sh` is not possible to export a function +# function __cp() {}; export -f __cp; + +define echo + text="$1"; options="$2"; \ + [ -z "$2" ] && options="1;33"; \ + $(ECHO) "\033[$${options}m$${text}\033[0m" +endef + +define rm + [ ! -e "$1" ] || (rm -rf "$1" && $(ECHO) "RM: $1") +endef + +define rm_f + dir="$2"; [ -e "$${dir}" ] || dir="."; \ + $(FIND) "$${dir}" -mindepth 1 -maxdepth 1 -name "$1" | while read -r p; do \ + $(call rm,$$p); \ + done +endef + +define mkdir + ([ -e "$1" ] || mkdir -p "$1") +endef + +define cd + $(call mkdir,$1) && cd "$1" && $(ECHO) "CD: $1" +endef + +define cp + (([ -d "$1" ] && $(call mkdir,$2) && cp -Rpv$3 "$1/." "$2") || \ + ([ -f "$1" ] && $(call mkdir,$$(dirname "$2")) && cp -Rpv$3 "$1" "$2")) +endef + +define cp_if + if [ -e "$2" ]; then \ + $(ECHO) "CP: $1 > $2 already done"; \ + else \ + $(ECHO) "CP: $1 > $2" && $(call cp,$1,$2); \ + fi +endef + +define cmake_build + work_dir="$1"; \ + build_dir="$2"; [ -z "$2" ] && build_dir=..; \ + build_options="$3"; \ + $(call cd,$${work_dir}) && $(CMAKE) $${build_options} $(CMAKE_OPTIONS) $${build_dir} $(CMAKE_OPTIONS_AFTER) && $(BUILD) +endef + +endif # _COMMON_DEFS_MAKE_ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a1a1b65 --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +Copyright 2018 Slightech Co., Ltd. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bc601a2 --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +include CommonDefs.mk + +.DEFAULT_GOAL := help + +.PHONY: help apidoc + +help: + @echo "Usage:" + @echo " make help show help message" + @echo " make apidoc make api doc" + @echo " make opendoc open api doc (html)" + +apidoc: + @$(call echo,Make $@) + @sh ./doc/build.sh + +opendoc: apidoc + @$(call echo,Make $@) + @$(shell sh ./doc/langs.sh 1); \ + for lang in "$${LANGS[@]}"; do \ + html=./doc/output/$$lang/html/index.html; \ + [ -f "$$html" ] && sh ./scripts/open.sh $$html; \ + done diff --git a/README.md b/README.md new file mode 100644 index 0000000..a81c925 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# MYNT® EYE SDK + +## Overview + +MYNT® EYE SDK 2.0 is a cross-platform library for MYNT® EYE cameras. + +## License + +This project is licensed under the Apache License, Version 2.0. Copyright 2018 Slightech Co., Ltd. diff --git a/doc/build.sh b/doc/build.sh new file mode 100755 index 0000000..de18baa --- /dev/null +++ b/doc/build.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env sh +# _VERBOSE_=1 +# _TEST_=1 + +BASE_DIR=$(cd "$(dirname "$0")" && pwd) +ROOT_DIR=$(realpath "$BASE_DIR/..") +SCRIPTS_DIR="$ROOT_DIR/scripts" + +source "$SCRIPTS_DIR/common/echo.sh" +source "$SCRIPTS_DIR/common/mkdir.sh" +source "$SCRIPTS_DIR/common/detect.sh" + +_detect "doxygen" +_detect "pdflatex" + +source "$BASE_DIR/langs.sh" +DOXYFILE="api.doxyfile" +OUTPUT="$BASE_DIR/output" + +for lang in "${LANGS[@]}"; do + _echo_s "Build doc $lang" + cd "$BASE_DIR/$lang" + if [ -f "$DOXYFILE" ]; then + _mkdir "$OUTPUT/$lang" + _echo_i "doxygen $DOXYFILE" + doxygen $DOXYFILE + if [ -f "$OUTPUT/$lang/latex/Makefile" ]; then + _echo_in "doxygen make latex" + cd "$OUTPUT/$lang/latex" && make + [ -f "refman.pdf" ] && mv "refman.pdf" "../mynteye-apidoc.pdf" + fi + _echo_d "doxygen completed" + else + _echo_e "$DOXYFILE not found" + fi +done diff --git a/doc/langs.sh b/doc/langs.sh new file mode 100644 index 0000000..a1e2af5 --- /dev/null +++ b/doc/langs.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env sh +LANGS=( + en + zh-Hans +) +[ $# -gt 0 ] && echo "LANGS=(${LANGS[@]})" diff --git a/doc/static/custom.css b/doc/static/custom.css new file mode 100644 index 0000000..f2c2edf --- /dev/null +++ b/doc/static/custom.css @@ -0,0 +1,3 @@ +#projectlogo img { + margin: 1em 0.5em 1em 1em; +} diff --git a/doc/static/images/icon.png b/doc/static/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..21d678ef3f377a404419d096b06c97e069f869bc GIT binary patch literal 17927 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%0A+AYP9vwe{ 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