wooksong / contributon2019-nns

7 stars 6 forks source link

[Android/Api] Windows Build #25

Open Lee-WonJun opened 5 years ago

Lee-WonJun commented 5 years ago

리눅스 배시 스크립트를 윈도우 배치스크립트로 바꾸는 과정을 진행중입니다.

관련이슈는 다음과 같습니다.

  1. git apply non-tizen 빌드이기때문에 non_tizen_build.patch 파일을 적용시켜야합니다. 배시 스크립에서는 patch 를 사용하는데 git에서 기본적으로 apply 라는 diff 적용 도구가 존재하여 이를 사용하고자합니다.

다만 문제로 non_tizen_build.patch 의 개행문자가 Windows버전이면 git apply에서 오류를 발생시켜서 개행 문자를 LF 로 변경해주어야합니다.

  1. svn sh 스크립트에서 svn을 이용해서 필요한 파일 을 가져옵니다. git으로 가져와도 될꺼같은데 git svn 명령어가 있어서 그냥 git svn사용해서 받아와도 될것 같습니다.

  2. tar.xz 이 부분이 고민이 많은 부분입니다. 윈도우 지원 tar로는 xz 파일압축을 풀수가 없습니다. 따라서 7zip의 커멘드 라인파일 (7z.exe)을 이용하서 풀고 있습니다. 근데 7z.exe 파일을 그냥 폴더에 포함시켜도 괜찮은 것인가요?

4.심볼릭 링크 텐서플로우 라이트 1.13/1.9 를 선택할수있습니다. 근데 여기서 1.13의 경우 압축에 심볼릭 링크가 포함되어있습니다. \tensorflow\contrib\lite 가 tensorflow\lite 로 연결되어있습니다. 근데 이게 압축파일을 해재하면 그냥 *.symbollink 로 되어있는데 윈도우에서 사용하는 심볼릭 링크가 아니여서 gradle에서 빌드할때 인식하지 않습니다.

1.13 버전인경우에는 직접 명령어로 심볼릭링크를 만들면 될까요?

  1. 빌드오류 5-1. error 87이 발생할때가 있습니다. gsteamer,nnsteamer, sdk, ndk 등의 폴더명이 길어지면 윈도우 최대범위를 넘어서 오류가 발생합니다.

5-2 이전에는 빌드가 됬는데 다시 프로젝트를 만들어서하는 도중에 error 3 가 발생합니다. 원인을 확인해보는 중입니다.

wooksong commented 5 years ago
  1. 바이너리는 포함될 수 없습니다.
wooksong commented 5 years ago

그리고 현재까지 작업한 코드를 올려주세요.

Lee-WonJun commented 5 years ago
@REM Set target ABI (default 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64')
@SET nnstreamer_target_abi='armeabi-v7a', 'arm64-v8a'

@REM Set tensorflow-lite version (available: 1.9 and 1.13)
@SET nnstreamer_tf_lite_ver=1.9

@IF "%ANDROID_HOME%" == "" (
   @ECHO "Need to set ANDROID_HOME."
   EXIT
)

@ECHO "Android SDK: "%ANDROID_HOME%""

@IF "%GSTREAMER_ROOT_ANDROID%" == "" (
   @ECHO "Need to set GSTREAMER_ROOT_ANDROID."
   EXIT
)

@ECHO "GStreamer binaries: "%GSTREAMER_ROOT_ANDROID%""

@IF "%NNSTREAMER_ROOT%" == "" (
   @ECHO "Need to set NNSTREAMER_ROOT."
   EXIT
)

@ECHO "NNStreamer root directory: "%NNSTREAMER_ROOT%""

@ECHO "Start to build NNStreamer library for Android."

PUSHD "%NNSTREAMER_ROOT%"

git apply %NNSTREAMER_ROOT%/packaging/non_tizen_build.patch

@IF NOT EXIST build_android_lib (
   MKDIR  build_android_lib
) 

XCOPY  /E .\api\android\* .\build_android_lib

git svn clone https://github.com/nnsuite/nnstreamer-android-resource/trunk/android_api ./build_android_lib -r HEAD

PUSHD .\build_android_lib

7z.exe x .\ext-files\tensorflow-lite-%nnstreamer_tf_lite_ver%.tar.xz -o.\api\src\main\jni
7z.exe x .\api\src\main\jni\tensorflow-lite-%nnstreamer_tf_lite_ver%.tar -o.\api\src\main\jni

SET old_target="abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'"

SET new_target="abiFilters %nnstreamer_target_abi%"

ECHO %new_target%

PAUSE 

IF EXIST .\api\build_temp.gradle DEL .\api\build_temp.gradle
FOR /f %%f in (.\api\build.gradle) do (
IF %old_target% equ "%%f" (
ECHO %new_target% >>.\api\build_temp.gradle 
) ELSE (
ECHO %%f >>.\api\build_temp.gradle 
)
)

PAUSE 

./gradlew.bat api:build

POPD
RMDIR /s .\build_android_lib

git apply -R %NNSTREAMER_ROOT%/packaging/non_tizen_build.patch

POPD
Lee-WonJun commented 5 years ago

파일 내용 변경하는 부분은 현재 정상적으로 동작하고 있지않습니다.

wooksong commented 5 years ago

파일 내용 변경하는 부분은 현재 정상적으로 동작하고 있지않습니다.

패치 적용 말씀이시죠?

Lee-WonJun commented 5 years ago

파일 내용 변경하는 부분은 현재 정상적으로 동작하고 있지않습니다.

패치 적용 말씀이시죠?

아뇨 .\api\build.gradle 파일을 변경하는 부분입니다.

Lee-WonJun commented 5 years ago
1. 바이너리는 포함될 수 없습니다.

바이너리파일을 포함 할 수 없으면 그 순간에 다운로드 하고 사용한뒤 삭제하는 방식을 이용하는건가요?

wooksong commented 5 years ago
1. 바이너리는 포함될 수 없습니다.

바이너리파일을 포함 할 수 없으면 그 순간에 다운로드 하고 사용한뒤 삭제하는 방식을 이용하는건가요?

바이너리는 보통 requirements로 요구하죠. 그래서 그런 프로그램이 없으면 그냥 실행이 안되게 합니다. check_dependency 처럼

Lee-WonJun commented 5 years ago
SET old_target="                abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'"

SET new_target=                "abiFilters %nnstreamer_target_abi%"

ECHO %new_target%

PAUSE 

@IF EXIST .\api\build_temp.gradle DEL .\api\build_temp.gradle
@FOR /f "delims=" %%f in (.\api\build.gradle) do (
@IF %old_target% equ "%%f" (
@ECHO %new_target% >>.\api\build_temp.gradle 
) ELSE (
@ECHO %%f >>.\api\build_temp.gradle 
)
)

타켓을 바꾸는 파일을 만드려고하는데 bat파일에서 한줄씩 읽어서 치환을 하려고 하는데 한줄씩 읽고 이를 비교 스트링과 비교하는 것때문에 비교 스트링을

SET old_target="                abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'"

SET new_target=                "abiFilters %nnstreamer_target_abi%"

와 같이 띄어쓰기를 포함한상태로 변수명에 집어 넣어도 상관없나요

wooksong commented 5 years ago
SET old_target="                abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'"

SET new_target=                "abiFilters %nnstreamer_target_abi%"

ECHO %new_target%

PAUSE 

@IF EXIST .\api\build_temp.gradle DEL .\api\build_temp.gradle
@FOR /f "delims=" %%f in (.\api\build.gradle) do (
@IF %old_target% equ "%%f" (
@ECHO %new_target% >>.\api\build_temp.gradle 
) ELSE (
@ECHO %%f >>.\api\build_temp.gradle 
)
)

타켓을 바꾸는 파일을 만드려고하는데 bat파일에서 한줄씩 읽어서 치환을 하려고 하는데 한줄씩 읽고 이를 비교 스트링과 비교하는 것때문에 비교 스트링을

SET old_target="                abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'"

SET new_target=                "abiFilters %nnstreamer_target_abi%"

와 같이 띄어쓰기를 포함한상태로 변수명에 집어 넣어도 상관없나요

해보고 동작하지 않으면 디버깅하셔요.