프로젝트의 경우 CMake와 함께 Android gradle 스크립트를 사용하고 있습니다. gradle 플러그인은 버전 3 : 0 : 0, CMake 버전 3.6입니다. gradle과 CMake 파일 모두 꽤 간단하고 흥미롭지 않습니다 (사용되는 파일을 정의하는 것입니다 - 필자는 필요에 따라 복사하여 붙여 넣을 수 있습니다).CMake 공유 프로젝트 하위 디렉토리 재구성 방지
다음 프로젝트 구조가 있습니다. 기본적으로 수십 개의 .so 파일 (apk에 패키징되어 '실행 파일'이라고 불리는 안드로이드 패키지의 네이티브 부분)을 생성하는 코드베이스이며, 모두 동일한 공유 라이브러리 코드 (정적 라이브러리, 따라서 '라이브러리 '). 라이브러리 코드는 여전히 (상대적으로) 휘발성이므로 실행 파일을 프로젝트 수준의 종속성으로 유지하여 실행 파일을 빌드 할 때마다 코드가 변경 될 때마다 라이브러리를 필요할 때 다시 빌드 할 수 있습니다. 라이브러리 'CMakeLists이
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY {CMAKE_CURRENT_SOURCE_DIR}/../Bin/${ANDROID_ABI}/${LibraryName})
실행 파일의 프로젝트
add_subdirectory(${PROJECTS_ROOT}/LibProjects/${LibraryName} ${PROJECTS_ROOT}/Framework/Bin/Android/${ANDROID_ABI}/${LibraryName})...
"정상적으로"라이브러리에 대한 종속성을 추가하여 Bin 폴더에 자신의 출력을 재
+ LibProjects/
---Bin/ (Originally empty)
---Lib1/CMakeLists.txt (+sources files, same level as the CMakeLists.txt)
...
---Lib10/CMakeLists.txt (same)
+ Executables/
---Executable1/CMakeLists.txt (source files here)
--------------/AndroidFiles/build.gradle (and other android project files)(points to the CMakeLists.txt)
...
---Executable40/CMakeLists.txt
: 같은 구조가 보인다
의미있는 실행 파일을 얻을 수 있다는 의미에서 모든 것이 거의 작동하며 실행 파일은 라이브러리 빌드를 트리거합니다.
문제는 실행 파일을 순차적으로 빌드 할 때 각 파일은 다른 파일의 라이브러리 프로젝트 출력을 재사용하지 않는다는 것입니다. Executable1을 빌드하면 모든 라이브러리 (정상)가 빌드 된 다음 빌드됩니다. 이후에 Executable2를 빌드하면 Executable1 용으로 이미 빌드 된 라이브러리가 재사용되지 않습니다. 이렇게하면 빌드 시간이 10 배 정도 증가합니다.
예상대로/Bin 폴더 안에 각 라이브러리의 빌드 결과가 있지만 실행 파일간에 다시 사용되지는 않습니다. - bin 폴더에 CMake "프로젝트 파일"(정확한 용어 임)이 없습니다. , 모두 실행 가능 빌드 디렉토리에 생성됩니다.
내가 해결하려고하는 문제는 각 라이브러리가 각 실행 파일에 대해 다시 빌드된다는 사실에서 기인하는 빌드 시간입니다.
현재 내가 고려하고있는 솔루션은 어떻게 든 CMake가 실행 파일 대신 자신의 폴더에있는 각 라이브러리의 작업 폴더로 Bin 폴더 (또는 다른 폴더)를 사용하도록 지시하고, gradle android plugin cmakefiles도 객체 파일도 재생성 할 필요가 없으며 재 구축을 피할만큼 현명합니다.
내가 가진 제한은 코드베이스 자체를 재구성 할 수없고 각각의 실행 파일이 다른 파일과 별도로 빌드 가능해야한다는 것입니다. 최상위 레벨 CMake의 가능성은 전혀 없습니다. 각 실행 파일이 트리거 될 수 있어야합니다. 그 자체로.
AndroidFiles는 실행 파일 1 이하입니까? 아니면이 중 40 개가 있습니까? –
종속성 문제처럼 보입니다. 대상이 모든 대상에 대한 종속성을 명시 적으로 나열하고 있는지 확인할 수 있습니까? 또한 라이브러리와 실행 파일에 대한'CMakeLists.txt'를 게시 할 수 있다면. – AmeyaVS
AndroidFiles 저는 40 개 있습니다. CMakeList를 게시 할 수는 있지만 아무 것도 말하지 않을 것입니다. 의존성은 말 그대로 게시 한 것입니다. 그 행동이 * 예상 * 그것이 단지 내가 원하는 바가 아니란 점에서 "의존성 문제"는 아닙니다. 아래의 Oliv의 대답을보십시오. –