Alter.Org.UA
 << Back Home EN en   Donate Donate

MSVC vcxproj with relative path using CMake

П:

CMake може генерувати проекти для Visual Studio, що ╓ чудово! Проте, зда╓ться, ╖х не сл╕д включати до репозитор╕ю з вих╕дним кодом. ╤нод╕ мен╕ потр╕бно сп╕впрацювати з людьми, як╕ не знайом╕ з CMake та звикли до р╕шень/проект╕в VS або це старий проект, де використову╓ться CLR/C++ для вза╓мод╕╖ м╕ж C# та C++. Чи ╓ спос╕б згенерувати д╕йсно працююч╕ проекти C++ для VS, як╕ можна включити разом ╕з вих╕дним кодом?

В (оф╕ц╕йний):

Дерева зб╕рки (включаючи файли .vcxproj) не призначен╕ для перенесення ╕ специф╕чн╕ для машини, на як╕й ви знаходитесь. Вони повинн╕ генеруватись кожним користувачем.
Генерац╕я файл╕в .vcxproj з проекту CMake не ╓ складною, особливо з використанням граф╕чного ╕нтерфейсу CMake.

В (практичний):

Хоча, у cmake нема╓ опц╕╖ для побудови vcxproj з в╕дносним шляхом, але це не занадто складно. ╤ ╕нод╕ д╕йсно набагато зручн╕ше створювати проекти з командного рядка (CLI), н╕ж за допомогою граф╕чного ╕нтерфейсу. Рекоменду╓ться додати наступне до CMakeLists.txt, щоб уникнути подальших проблем з╕ зб╕ркою.

CMakeLists.txt
...
set(CMAKE_SUPPRESS_REGENERATION ON)
set(CMAKE_USE_RELATIVE_PATHS ON)
...
_prebuild.cmd
rem (re)build .sln and .vcxproj files for both platforms in different subdirectories
cmake -S . -B build64 -A x64
cmake -S . -B build32 -A Win32

rem used-specified path to project hierarchy root, leave empty 
rem if CMakeLists.txt is located in your project root dir
rem e.g. ..\..
set root_rel_path=%1

rem remember cmake directory (absolute path) to return to
cd > _.tmp
set /p cmake_dir= < _.tmp
del _.tmp

rem get absolute path of root directory (cmake directory + relative root) 
rem and return back to cmake dir
cd %root_rel_path%
cd > _.tmp
set /p cur_dir= < _.tmp
del _.tmp
rem construct full paths with inverted slashes (template for replacement)
SET cur_dir2=%cur_dir:\=/%
cd %cmake_dir%

rem replace absolute paths with relative to $(SolutionDir), 
rem we always add extra '..\' since solution in built in directory 1 level deeper 
rem than cmake directory (see two 1st lines of script)
rem you can use any other search-replace tool, I use my own old one

cd build32
srchrep.exe -src "%cur_dir%" -dest "$(SolutionDir)\%root_rel_path%\..\" *.vcxproj.*
srchrep.EXE -src "%cur_dir2%" -dest "$(SolutionDir)\%root_rel_path%\..\" *.vcxproj.*
cd ..

cd build64
srchrep.EXE -src "%cur_dir%" -dest "$(SolutionDir)\%root_rel_path%\..\" *.vcxproj.*
srchrep.EXE -src "%cur_dir2%" -dest "$(SolutionDir)\%root_rel_path%\..\" *.vcxproj.*
cd ..

Example

c:\
  work\
    my_proj\ (project root)
      inc
      windows (here we have CMakeLists)
        build32 (here we have .sln, .vcxproj for Win32)
        build64 (here we have .sln, .vcxproj for x64)
      linux

> cd c:\work\my_proj\windows
> _prebuild.cmd ..

$(SolutionDir) = c:\work\my_proj\windows\build64
project root = c:\work\my_proj = $(SolutionDir)\..\..
c:\work\my_proj\windows -> $(SolutionDir)\..\..\windows
c:\work\my_proj\inc -> $(SolutionDir)\..\..\inc
c:\work\my_proj\windows\build64 -> $(SolutionDir)\..\..\windows\build64
...

Download

cmake_vcxproj_rel_path.rar
cmake_vcxproj_rel_path.zip




2023.05.29


FB or mail alterX@alter.org.ua (remove X)   Share
Автор: Alter (Александр А. Телятников) Сервер: Apache+PHP под FBSD © 2002-2024