Dr. Ehsan Ali
Dr. Ehsan Ali

Reputation: 4884

CMake install directory permission

I have built a project using cmake (LLVM project) and tried to install it by issuing the following command:

$ cmake3 --build . --target install

If I run it using root then there is no problem and the files will be installed under the directory /usr/local/.

My problem is when I want to install the project using normal user.

I get the following error:

CMake Error at cmake_install.cmake:36 (file):
  file INSTALL cannot set permissions on "/usr/local/include/llvm"

I have changed the permission of directory /usr/local/ to 777 recursively, and their ownership to root:wheel and I added my normal user to group wheel. But I still cannot install the files into the /usr/local/ directory.

The main issue is about building project in Eclipse which fails at "Build Install" command.

Upvotes: 1

Views: 4650

Answers (2)

We should use USE_SOURCE_PERMISSIONS in our install function.

Example:

install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Release/" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}" USE_SOURCE_PERMISSIONS)

Upvotes: 0

Stewart
Stewart

Reputation: 5012

chmod 777 -R / is a very scary command. I've destroyed a system once by doing that.

The philosophy I use for this is:

  • If I need to deploy something through my IDE to debug or test before packaging, I deploy it locally within my home directory.
  • I only install stuff to my system (outside of home) if it has been packaged first (*.deb, *.rpm, *.tar.gz) so that I can remove it without problems.

For me, I do this with:

cmake $src
cmake --build . --target install -- DESTDIR=stage

This will configure my project, make it, then install it locally in a folder called ./stage which resides in my build directory. I can then run my executable from ./stage/usr/bin. Note that this only works if make is your generator.

Once I've tested it and I'm happy, I package it and deploy to my system or upload to a repository:

cpack
sudo dpkg -i <package>.deb

Upvotes: 1

Related Questions