Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)
(시리즈 글이 7개 있습니다.)
사물인터넷: 9. Visual Studio 2017에서 Raspberry Pi C++ 응용 프로그램 제작
; https://www.sysnet.pe.kr/2/0/11358

개발 환경 구성: 339. WSL을 이용해 윈도우 PC 1대에서 Linux 응용 프로그램을 Visual Studio로 개발하는 방법
; https://www.sysnet.pe.kr/2/0/11390

개발 환경 구성: 340. WSL을 이용해 윈도우 PC 1대에서 openSUSE 응용 프로그램을 Visual Studio로 개발하는 방법
; https://www.sysnet.pe.kr/2/0/11391

개발 환경 구성: 428. Visual Studio 2019 - CMake를 이용한 리눅스 빌드 환경 설정
; https://www.sysnet.pe.kr/2/0/11825

개발 환경 구성: 431. Visual Studio 2019 - CMake를 이용한 공유/실행(so/out) 리눅스 프로젝트 설정
; https://www.sysnet.pe.kr/2/0/11833

개발 환경 구성: 434. Visual Studio 2019 - 리눅스 프로젝트를 이용한 공유/실행(so/out) 프로그램 개발 환경 설정
; https://www.sysnet.pe.kr/2/0/11844

개발 환경 구성: 727. Visual C++ - 리눅스 프로젝트를 위한 빌드 서버의 msbuild 구성
; https://www.sysnet.pe.kr/2/0/13737




Visual C++ - 리눅스 프로젝트를 위한 빌드 서버의 msbuild 구성

리눅스 프로젝트의 경우,

Visual Studio 2019 - 리눅스 프로젝트를 이용한 공유/실행(so/out) 프로그램 개발 환경 설정
; https://www.sysnet.pe.kr/2/0/11844

빌드를 위해 반드시 리눅스 서버 또는 WSL을 필요로 합니다. 비주얼 스튜디오에서는 이런 연결을 개별 프로젝트에서 관리하지 않고 "Tools" / "Options" 메뉴로 뜨는 "Cross Platform" / "Connection Manager"에서 관리하는데요,

[그림 1: Connection Manager]
vs_remote_ssh_1.png

이렇게 구성한 설정은 %LOCALAPPDATA%\Microsoft\Linux\User Data\3.0\store.xml에 별도로 저장됩니다.

사실 개발자 1명이 프로젝트를 관리하는 상황이라면 위와 같은 방식이 문제가 되진 않지만, 여러 개발자가 하나의 프로젝트를 함께 참여하는 상황이라면 다소 불편한 점이 있습니다. 또는, 빌드 서버를 구성한 경우에도 저건 문제가 됩니다. 가령, github에 올린 프로젝트를 빌드 서버에서 받아 컴파일하려고 할 때, 개발자 PC와는 달리 원격 리눅스 서버에 대한 정보가 없어 당연히 빌드가 실패하게 됩니다.

어쩔 수 없이 빌드 서버에서도 리눅스 서버에 대한 정보를 등록해야 하고, 이럴 때 ConnectionManager.exe를 이용할 수 있습니다.

// 아래는 키 파일 경로를 %USERPROFILE%에 설정했으므로 빌드 스크립트를 실행하는 계정이 다르다면 주의해야 합니다.

C:\temp> ConnectionManager.exe add testusr@192.168.100.50 --privatekey "%USERPROFILE%\.ssh\test_rsa"

일단 저렇게 전역적으로 (store.xml에) 등록했어도 빌드에 문제가 발생할 여지가 여전히 남아 있습니다. 왜냐하면, vcxproj 프로젝트 파일에는 그것을 빌드하기 위한 리눅스 서버 정보를 포함하지 않기 때문입니다.

그래서, "그림 1"처럼 구성된 환경에서 msbuild를 이용해 vcxproj 파일을 빌드하면,

c:\temp> msbuild ConsoleApplication1.vcxproj /p:Platform=ARM64 /t:rebuild

msbuild는 "그림 1"의 "Default" 칼럼에 선택된 "192.168.105.25" 서버를 자동으로 선택해 빌드를 수행합니다. 물론, 1개만 등록돼 있다면 문제가 없겠지만, 만약 빌드 서버에서 x64, ARM64 프로젝트를 빌드하도록 스크립트를 구성했다면,

// "Default"로 선택한 리눅스 서버에서 빌드
c:\temp> msbuild ConsoleApplication1.vcxproj /p:Platform=ARM64 /t:rebuild

// "Default"로 선택한 리눅스 서버에서 빌드
c:\temp> msbuild ConsoleApplication1.vcxproj /p:Platform=x64 /t:rebuild

당연히 둘 중의 하나는 플랫폼이 맞지 않는 결과를 가져옵니다.




비주얼 스튜디오 환경에서 각각의 개발자는 Visual C++ 프로젝트 속성 창에서 "Remote Build Machine"을 설정할 수 있습니다.

vs_remote_ssh_2.png

하지만, 이 정보는 (위의 예제에서) ConsoleApplication1.vcxproj 파일에 저장되지 않고 별도로 ConsoleApplication1.vcxproj.user 파일에 저장됩니다. 즉, 소스코드의 형상관리에서 제외되기 때문에 빌드 서버에서 소스 코드를 가져와도 저 파일은 공유되지 않는 것입니다.

대신 해당 설정은 msbuild를 따르기 때문에 원한다면 *.vcxproj.user 내용을 *.vcxproj 파일에 적용해도 됩니다. 예를 들어, user 파일은 다음의 내용을 담고 있는데,

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <RemoteTarget>1638701483;192.168.105.25 (username=, port=22, authentication=Password)</RemoteTarget>
  </PropertyGroup>
</Project>

이 설정을 vcxproj에 그대로 이식할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ...[생략]...

  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  ...[생략]...
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>Remote_GCC_1_0</PlatformToolset>
    <RemoteTarget>1365766831;169.254.238.200 (username=, port=22, authentication=Password)</RemoteTarget>
  </PropertyGroup>
  ...[생략]...
</Project>

이것을 이용하면, 빌드 서버를 위해 "'$(Configuration)|$(Platform)'=='Release|x64'"와 같이 Release 빌드의 경우 RemoteTarget으로 지정한 외부 서버에서 수행하도록 할 수 있습니다. 반면, 개발자 PC에서는 user 파일에 Debug 빌드를 둬 각자가 원하는 서버로 빌드하는 유연함을 가질 수 있습니다.




또 다른 방법으로는, msbuild 명령줄에서 /p:RemoteTarget=... 옵션을 직접 전달하는 것입니다. 이때의 인자는 ConnectionManager.exe를 통해 구한 "Connection ID"를 쓰면 됩니다.

C:\temp> ConnectionManager.exe list
Reading stored connections from 'C:\Users\testu\AppData\Local\Microsoft\Linux\User Data\3.0\store.xml'

Connection ID |            Host | Username | Port | Authentication Type
-----------------------------------------------------------------------
    567696872 |       127.0.0.1 |    testu |   22 | Password
   1365766831 | 169.254.238.200 |    testu |   22 | Password
   1638701483 |  192.168.105.25 |    testu |   22 | Password

아래는 그 예제입니다.

// 169.254.238.200 서버는 ARM64 서버로 가정,
c:\temp> msbuild ConsoleApplication1.vcxproj /p:RemoteTarget=1365766831 /p:Platform=ARM64;Configuration=Release / /t:rebuild

// 192.168.105.25 서버는 x64용 서버로 가정,
c:\temp> msbuild ConsoleApplication1.vcxproj /p:RemoteTarget=1638701483 /p:Platform=x64;Configuration=Release / /t:rebuild

아마도 대부분의 경우, 리눅스 빌드로는 x64, ARM64 2가지 정도를 지원하게 될 텐데요, 그렇다면 자연스럽게 컨테이너를 이용한 빌드를 하게 될 것이고, 결국 fingerprint에 대한 관리까지 고려해야 할 것입니다. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 9/21/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 76  77  78  79  80  81  82  83  84  [85]  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
11808정성태2/8/201921914디버깅 기술: 123. windbg - 닷넷 응용 프로그램의 메모리 누수 분석
11807정성태1/29/201919807Windows: 156. 가상 디스크의 용량을 복구 파티션으로 인해 늘리지 못하는 경우 [4]
11806정성태1/29/201919495디버깅 기술: 122. windbg - 덤프 파일로부터 PID와 환경 변수 등의 정보를 구하는 방법
11805정성태1/28/201921572.NET Framework: 806. C# - int []와 object []의 차이로 이해하는 제네릭의 필요성 [4]파일 다운로드1
11804정성태1/24/201919459Windows: 155. diskpart - remove letter 이후 재부팅 시 다시 드라이브 문자가 할당되는 경우
11803정성태1/10/201918330디버깅 기술: 121. windbg - 닷넷 Finalizer 스레드가 멈춰있는 현상
11802정성태1/7/201920075.NET Framework: 805. 두 개의 윈도우를 각각 실행하는 방법(Windows Forms, WPF)파일 다운로드1
11801정성태1/1/201921430개발 환경 구성: 427. Netsh의 네트워크 모니터링 기능 [3]
11800정성태12/28/201820467오류 유형: 509. WCF 호출 오류 메시지 - System.ServiceModel.CommunicationException: Internal Server Error
11799정성태12/19/201822195.NET Framework: 804. WPF(또는 WinForm)에서 UWP UI 구성 요소 사용하는 방법 [3]파일 다운로드1
11798정성태12/19/201821041개발 환경 구성: 426. vcpkg - "Building vcpkg.exe failed. Please ensure you have installed Visual Studio with the Desktop C++ workload and the Windows SDK for Desktop C++"
11797정성태12/19/201817048개발 환경 구성: 425. vcpkg - CMake Error: Problem with archive_write_header(): Can't create '' 빌드 오류
11796정성태12/19/201817251개발 환경 구성: 424. vcpkg - "File does not have expected hash" 오류를 무시하는 방법
11795정성태12/19/201820605Windows: 154. PowerShell - Zone 별로 DNS 레코드 유형 정보 조회 [1]
11794정성태12/16/201816669오류 유형: 508. Get-AzureWebsite : Request to a downlevel service failed.
11793정성태12/16/201819253개발 환경 구성: 423. NuGet 패키지 제작 - Native와 Managed DLL을 분리하는 방법 [1]
11792정성태12/11/201819033Graphics: 34. .NET으로 구현하는 OpenGL (11) - Per-Pixel Lighting파일 다운로드1
11791정성태12/11/201819057VS.NET IDE: 130. C/C++ 프로젝트의 시작 프로그램으로 .NET Core EXE를 지정하는 경우 닷넷 디버깅이 안 되는 문제 [1]
11790정성태12/11/201817557오류 유형: 507. Could not save daemon configuration to C:\ProgramData\Docker\config\daemon.json: Access to the path 'C:\ProgramData\Docker\config' is denied.
11789정성태12/10/201831163Windows: 153. C# - USB 장치의 연결 및 해제 알림을 위한 WM_DEVICECHANGE 메시지 처리 [2]파일 다운로드2
11788정성태12/4/201817410오류 유형: 506. SqlClient - Value was either too large or too small for an Int32.Couldn't store <2151292191> in ... Column
11787정성태11/29/201821570Graphics: 33. .NET으로 구현하는 OpenGL (9), (10) - OBJ File Format, Loading 3D Models파일 다운로드1
11786정성태11/29/201818521오류 유형: 505. OpenGL.NET 예제 실행 시 "Managed Debugging Assistant 'CallbackOnCollectedDelegate'" 예외 발생
11785정성태11/21/201820895디버깅 기술: 120. windbg 분석 사례 - ODP.NET 사용 시 Finalizer에서 System.AccessViolationException 예외 발생으로 인한 비정상 종료
11784정성태11/18/201820108Graphics: 32. .NET으로 구현하는 OpenGL (7), (8) - Matrices and Uniform Variables, Model, View & Projection Matrices파일 다운로드1
11783정성태11/18/201818248오류 유형: 504. 윈도우 환경에서 docker가 설치된 컴퓨터 간의 ping IP 주소 풀이 오류
... 76  77  78  79  80  81  82  83  84  [85]  86  87  88  89  90  ...