5

I'm using CMake-3.13.4 and KDevelop-5.2.1.

I have a topmost CMakeLists.txt that defines the version numbers of my target. It looks like:

set( PROJECT_VERSION_MAJOR 1 )
set( PROJECT_VERSION_MINOR 4 )
set( PROJECT_VERSION_PATCH 7 )
...
add_executable( mytarget main.cpp XXX.cpp ... )
target_link_libraries( mytarget "stdc++fs" ${CMAKE_THREAD_LIBS_INIT} ... )
install( TARGETS mytarget RUNTIME DESTINATION . )

I want CMake automatically append the version string to the file name of the target. So I code as following:

install( TARGETS mytarget RUNTIME DESTINATION . RENAME "mytarget-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" )

But it doesn't work.

Is there a way it can be done with CMake? The file name I finally want is "mytarget-1.4.7".

Leon
  • 1,489
  • 1
  • 12
  • 31

2 Answers2

8

You are looking for the property OUTPUT_NAME.

add_executable( mytarget main.cpp XXX.cpp ... )
target_link_libraries( mytarget "stdc++fs" ${CMAKE_THREAD_LIBS_INIT} ... )
set_target_properties( mytarget PROPERTIES OUTPUT_NAME "mytarget-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" ) 
install( TARGETS mytarget RUNTIME DESTINATION . )
serkan.tuerker
  • 1,681
  • 10
  • 20
  • `OUTPUT_NAME` has limited usage: you can't use it to specify same name as another target, otherwise `MSVC` build fails. `MSVC` creates `${OUTPUT_NAME}.lib` for each target and it may conflict. – puchu Apr 07 '21 at 23:55
0

I got it by modifying codes as following:

add_executable( mytarget-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} 
 main.cpp XXX.cpp ... )

target_link_libraries( mytarget-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} "stdc++fs" ${CMAKE_THREAD_LIBS_INIT} ... )

install( TARGETS mytarget-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} RUNTIME DESTINATION . )
Leon
  • 1,489
  • 1
  • 12
  • 31