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

비밀번호

댓글 작성자
 




... 136  137  138  139  140  141  142  143  144  145  [146]  147  148  149  150  ...
NoWriterDateCnt.TitleFile(s)
1403정성태1/14/201331977.NET Framework: 357. .NET 4.5의 2GB 힙 한계 극복
1402정성태1/14/201332549오류 유형: 166. SmtpClient.Send 오류 - net_io_connectionclosed
1401정성태1/11/201329874.NET Framework: 356. (공개키를 담은) 자바의 key 파일을 닷넷의 RSACryptoServiceProvider에서 사용하는 방법 [2]파일 다운로드1
1400정성태1/10/201329014Windows: 69. 작업표시줄의 터치 키보드(Touch Keyboard) 없애는 방법 [3]
1399정성태1/9/201324656.NET Framework: 355. 닷넷 환경이 왜 C/C++보다 느릴까요? [8]
1398정성태1/8/201325114오류 유형: 165. 새로 설치한 Visual Studio 2010의 Team Explorer 실행시 비정상 종료가 된다면?
1397정성태1/3/201328607Windows: 68. 윈도우 설치 ISO 이미지를 USB 하드에 적용하는 방법 [2]
1396정성태12/27/201229813사물인터넷: 2. 넷두이노 - 4.2.0 펌웨어 업데이트 방법 [1]파일 다운로드1
1395정성태12/26/201220674.NET Framework: 354. x64 - AspCompat과 STA COM 개체가 성능에 미치는 영향
1394정성태12/25/201222125.NET Framework: 353. x86 - AspCompat과 STA COM 개체가 성능에 미치는 영향
1393정성태12/25/201222482.NET Framework: 352. x64에서 필수로 지정하도록 바뀐 STAThread 특성 [2]
1392정성태12/21/201232500사물인터넷: 1. .NET Micro Framework - 넷두이노 플러스 [7]
1391정성태12/21/201225886.NET Framework: 351. JavaScriptSerializer, DataContractJsonSerializer, Json.NET [3]파일 다운로드1
1390정성태12/20/201223958.NET Framework: 350. String 데이터를 Stream으로 변환하는 방법 [2]
1389정성태12/12/201222283.NET Framework: 349. .NET Thread 인스턴스로부터 COM Apartment 유형 확인하는 방법파일 다운로드1
1388정성태12/12/201223339.NET Framework: 348. .NET x64 응용 프로그램에서 Teb 주소를 구하는 방법파일 다운로드1
1387정성태12/12/201228263VC++: 64. x64 Visual C++에서 TEB 주소 구하는 방법
1386정성태12/12/201229977디버깅 기술: 53. windbg - 덤프 파일로부터 네이티브 DLL을 추출하는 방법 [1]
1385정성태12/12/201225041디버깅 기술: 52. Windbg - The version of SOS does not match the version of CLR you are debugging.
1384정성태12/12/201229865개발 환경 구성: 178. System32 폴더의 64비트 DLL을 32비트 Depends.exe에서 보는 방법
1383정성태12/10/201225774개발 환경 구성: 177. 기업용 메신저를 위한 Office Communicator Server 2007 설치 [1]
1382정성태12/8/201228636개발 환경 구성: 176. WebPagetest 서버 - 설치 및 테스트
1381정성태12/5/201227143.NET Framework: 347. C# - 프로세스(EXE) 수준의 Singleton 개체 생성 [2]파일 다운로드1
1380정성태11/28/201237177.NET Framework: 346. 닷넷 개발자에게 Node.js의 의미 [17]
1379정성태11/26/201230317.NET Framework: 345. C# 부호(+, -)에 대한 비트 변환
1378정성태11/22/201231637Java: 14. 안드로이드 - Hello World 실습 [7]
... 136  137  138  139  140  141  142  143  144  145  [146]  147  148  149  150  ...