2016-07-05 1 views
0

저는 리눅스 드라이버를 설치하기 위해 cmake를 사용합니다. 커널 버전을 얻으려면 CMAKE_SYSTEM_VERSION을 사용하여 uname -r의 출력을 산출해야합니다.새 커널에 대해 CMAKE_SYSTEM_VERSION이 업데이트되지 않았습니다.

그러나 새 커널을 설치 한 후 현재 커널의 디렉토리가 아닌 /lib/modules/<previous kernel>/...에 설치 중이라는 것을 알기 위해 cmake로 드라이버를 다시 설치하려고했습니다. uname- r 올바른 결과를 제공합니다.

나는 내 CMakeLists.txt에 다음 줄을 사용하십시오

install(PROGRAMS myDevice.ko DESTINATION "/lib/modules/${CMAKE_SYSTEM_VERSION}/kernel/drivers/myDevice" COMPONENT driver) 

나는 CMakeCache.txt에 CMAKE_SYSTEM_VERSION을 발견하고 단지 중 하나 트릭을하지 않았다 cmake ..을 다시 실행하지 못했습니다. 빌드 폴더 전체를 재생성해야했습니다.

빌드 폴더에 응용 프로그램이 포함되어 있기 때문에 더 좋은 방법이 있는지 알고 싶습니다. 새 커널이 있기 때문에 재구성 할 필요가 없습니다.

+1

CMake 버전은 무엇입니까? CMAKE_SYSTEM_VERSION의 최신 문서를 확인하십시오. https://cmake.org/cmake/help/v3.6/variable/CMAKE_SYSTEM_VERSION.html – usr1234567

+0

@ usr1234567 버전이 3.5.2입니다. 변수를 명시 적으로 설정하지 않았으므로 'uname -r'이어야하는'CMAKE_HOST_SYSTEM_VERSION'이되어야합니다. 그리고 나는 CMakeCache.txt에서'CMAKE_HOST_SYSTEM_VERSION'을 찾지 못하기 때문에 여전히 현재 커널 버전을 나타내야합니다, 맞습니까? – ted

+0

@ usr1234567 예 : 'CMAKE_SYSTEM_VERSION'의 기본값은 ['CMAKE_HOST_SYSTEM_VERSION'] (https://cmake.org/cmake/help/v3.5/variable/CMAKE_HOST_SYSTEM_VERSION.html#)입니다. 변수 : CMAKE_HOST_SYSTEM_VERSION)은'uname -r'입니다. – ted

답변

1

첫 번째 구성 이후 고정 된 CMake 변수가 있습니다. CMAKE_SYSTEM_VERSION이 그 중 하나입니다. CMAKE_C_COMPILER은 "고정 된"변수의 또 다른 예입니다. 변경하면 캐시가 완전히 무효화됩니다.

그래서 커널마다 다른 빌드를 만들어야합니다.

커널 모듈에서 사용자 공간 응용 프로그램의 구성과 건물을 분리 할 수 ​​있습니다. 따라서 커널 모듈을 다시 작성해도 응용 프로그램이 강제로 다시 빌드되지는 않습니다.

정확히 프로젝트에서 사용한 방법 : 하나의 옵션 (option() 명령으로 도입)을 설정하면 응용 프로그램 만 빌드되고 다른 옵션을 설정하면 커널 모듈 만 빌드됩니다. 기본적으로 아무 옵션도 설정되지 않고 커널 공간과 사용자 공간 구성 요소가 모두 빌드됩니다.

관련 문제