On Linux for item Exec
of .desktop
, it needs the path of the executable?
Is there any better way than manully constructing as below?
set(Item_Exec ${CMAKE_INSTALL_FULL_BINDIR}>/<target_name>)
On Linux for item Exec
of .desktop
, it needs the path of the executable?
Is there any better way than manully constructing as below?
set(Item_Exec ${CMAKE_INSTALL_FULL_BINDIR}>/<target_name>)
You can use file(GENERATE ...)
and use a generator expression.
file(GENERATE ...)
generates a file, but I want to save it to a variable instead.
You won’t be able to save it to a variable, because the output path is not known until generate-time, after CMakeLists.txt
has already been processed.
So the best way is
set(Item_Exec ${CMAKE_INSTALL_FULL_BINDIR}>/<target_name>)
right?
In general you can’t deduce the install location of binaries/libraries from CMake. As Kyle mentioned above that variable could hold generator expressions which have to be evaluated after CMake script execution to resolve to a valid path. In addition the cmake --install
command offers the --prefix
flag that allows changing the install location without re-executing CMake.
Under certain conditions ( GNUInstallDirs being used ) your solution might be sufficient, but it won’t be robust.
As far as .desktop files are considered ( Desktop Entry Specification ) you can just provide the name of the executable and allow the OS to search the environments PATH variable to find the program.
But the executable is in /opt/myapp/bin/
, the default environment variable PATH doesn’t help.
I don’t have enough information to be definitive here, but one of two scenarios seems likely.
Scenario: You have standards or control over the destination system
In that case, maybe you just hardcode /opt/myapp/bin/
into *.desktop
files in your package and move on.
Scenario: You have inconsistent or incomplete information about how the package is installed
Have you considered using a template file instead of a proper *.desktop
file and use your packaging systems package-install-time hooks to generate (via sed
perhaps?) a *.desktop
file that knows the actual path as installed on the actual system? As stated above, CMake
doesn’t actually know about even /opt/myapp
necessarily. Many packaging systems don’t even manipulate a directory like /opt/myapp
when CMake is in the picture, instead they install into a staging directory and then package that up. To be sure you’d know about the /opt/myapp
path, you might need to inject that info into your *.desktop
file much later in the process… for instance when the actual package installation is in progress.