마이크로소프트의 CoreCLR 프로파일러 예제를 Visual Studio CMake로 빌드하는 방법
지난 글에서,
마이크로소프트의 CoreCLR 프로파일러 예제 빌드 방법
; https://www.sysnet.pe.kr/2/0/11294
단순히 리눅스 운영체제 상에서 CoreCLR 프로파일러를 빌드해 봤습니다. 문제는, 제가 비주얼 스튜디오의 디버깅 환경에 익숙하다는 점입니다. ^^ 그래서 다음의 경험을 살려,
Visual Studio 2019 - CMake를 이용한 공유/실행(so/out) 리눅스 프로젝트 설정
; https://www.sysnet.pe.kr/2/0/11833
프로파일러 예제를 Visual Studio CMake 프로젝트로 옮겨 봤습니다.
이를 위해 우선 coreclr과 clr-samples repo를 clone해 두어야 합니다.
E:\git_clone\coreclr
E:\git_clone\clr-samples
사실 clr-samples에서는 coreclr의 헤더 파일만 필요하기 때문에 ./coreclr 하위에 있는 다음의 폴더를,
./src/pal/inc/rt
./src/pal/prebuilt/inc
./src/pal/inc
./src/inc
./src/md/inc
"E:\git_clone\clr-samples\ProfilingAPI\ReJITEnterLeaveHooks\cor" 폴더로 복사해 둡니다. (따라서 더 이상은 e:\git_clone\coreclr 폴더가 필요 없습니다.)
그다음, "E:\git_clone\clr-samples\ProfilingAPI\ReJITEnterLeaveHooks" 경로로 이동해 해당 폴더에 다음의 내용을 담은 CMakeLists.txt를 만듭니다.
cmake_minimum_required(VERSION 3.9)
project (CorProfiler)
set (SRC_FILES ClassFactory.cpp CorProfiler.cpp dllmain.cpp ILRewriter.cpp )
add_library( CorProfiler.so SHARED ${SRC_FILES} )
이제 원래의 clang++로 빌드하는 build.sh 파일의 내용을 반영해야 하는데요.
#!/bin/sh
[ -z "${CORECLR_PATH:-}" ] && CORECLR_PATH=~/coreclr
[ -z "${BuildOS:-}" ] && BuildOS=Linux
[ -z "${BuildArch:-}" ] && BuildArch=x64
[ -z "${BuildType:-}" ] && BuildType=Debug
[ -z "${Output:-}" ] && Output=CorProfiler.so
printf ' CORECLR_PATH : %s\n' "$CORECLR_PATH"
printf ' BuildOS : %s\n' "$BuildOS"
printf ' BuildArch : %s\n' "$BuildArch"
printf ' BuildType : %s\n' "$BuildType"
printf ' Building %s ... ' "$Output"
CXX_FLAGS="$CXX_FLAGS --no-undefined -Wno-invalid-noreturn -fPIC -fms-extensions -DBIT64 -DPAL_STDCPP_COMPAT -DPLATFORM_UNIX -std=c++11"
INCLUDES="-I $CORECLR_PATH/src/pal/inc/rt -I $CORECLR_PATH/src/pal/prebuilt/inc -I $CORECLR_PATH/src/pal/inc -I $CORECLR_PATH/src/inc -I$
clang++ -shared -o $Output $CXX_FLAGS $INCLUDES ClassFactory.cpp CorProfiler.cpp dllmain.cpp ILRewriter.cpp
printf 'Done.\n'
CMakefile.txt에는 다음과 같이 몇몇 환경 변수를 설정해 주고,
cmake_minimum_required(VERSION 3.9)
project (CorProfiler)
set (SRC_FILES ClassFactory.cpp CorProfiler.cpp dllmain.cpp ILRewriter.cpp)
set (ENV{BuildOS} Linux)
set (ENV{BuildArch} x64)
set (ENV{BuildType} Debug)
set (ENV{Output} CorProfiler.so)
SET ( CMAKE_CXX_FLAGS_DEBUG " -Wno-pragma-pack -Wno-undef -Wno-invalid-noreturn -fPIC -fms-extensions -DBIT64 -DPAL_STDCPP_COMPAT -DPLATFORM_UNIX -std=c++11" )
SET ( CMAKE_CXX_FLAGS_RELEASE " -Wno-pragma-pack -Wno-undef -Wno-invalid-noreturn -fPIC -fms-extensions -DBIT64 -DPAL_STDCPP_COMPAT -DPLATFORM_UNIX -std=c++11" )
INCLUDE_DIRECTORIES ( ./cor/src/pal/inc/rt ./cor/src/pal/prebuilt/inc ./cor/src/pal/inc ./cor/src/inc )
add_library( CorProfiler.so SHARED ${SRC_FILES} )
마지막으로 clang++로 변경하는 작업을 아래의 글에 따라
Visual Studio 2019 - CMake의 컴파일러를 기본 g++에서 clang++로 변경
; https://www.sysnet.pe.kr/2/0/11841
CMakeSettings.json에 설정하면 됩니다.
(
첨부한 프로젝트는 그렇게 구성한 것입니다. 첨부 파일로 CMake 빌드를 하고 싶다면 CMakeSettings.json의 remoteMachineName 인증 정보만 적절하게 구성하면 ReJITEnterLeaveHooks 프로젝트를 바로 빌드할 수 있습니다.)
그런데 아쉽게도, CMake로 변경한 당초의 취지에 맞지 않게 이 프로젝트에 대한 F5 디버깅을 할 수가 없습니다. 해보면 다음과 같은 식의 오류 메시지 창이 뜨는데요.
Unable to start debugging. The startup project could not be launched.
그러니까, so 공유 모듈이기 때문에 디버깅을 위해 원격 리눅스 머신의 시작 프로세스를 지정할 수 있어야 하지만 비주얼 스튜디오의 CMake 환경에서는 이게 안 되는 것입니다. ^^; 툴 바에 보면 "Select Startup Item..."이 있는 걸로 봐서 지원을 할 수도 있을 것 같은데... 암튼 제가 그 방법을 모르겠습니다. 음... 그러니까 일단 CMake 프로젝트로는 비주얼 스튜디오 상에서 CLR Profiler 같은 식의 공유 프로젝트를 F5 디버깅할 수는 없습니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]