Dear Eric,

thanks a lot for this help! I think I have the pointers to move forward!
One more detail below:

On 23.11.18 11:36, Eric Noulard wrote:
> Le ven. 23 nov. 2018 à 11:10, Mario Emmenlauer <ma...@emmenlauer.de 
> <mailto:ma...@emmenlauer.de>> a écrit :
>     Dear Eric, thanks for the help! Below more:
> 
>     On 22.11.18 18:20, Eric Noulard wrote:
>     > Le jeu. 22 nov. 2018 à 16:16, Mario Emmenlauer <ma...@emmenlauer.de 
> <mailto:ma...@emmenlauer.de> <mailto:ma...@emmenlauer.de
>     <mailto:ma...@emmenlauer.de>>> a écri
>     >     I'm trying to build an RPM with CPack, and everything seems to work,
>     >     but the resulting package can not be installed. I get Transaction 
> check
>     >     error:
>     >       file / from install of <mypackage> conflicts with file from 
> package filesystem-3.2-25.el7.x86_64
>     >       file /opt from install of <mypackage> conflicts with file from 
> package filesystem-3.2-25.el7.x86_64
>     >       file /usr/bin from install of <mypackage> conflicts with file 
> from package filesystem-3.2-25.el7.x86_64
>     >       file /usr/share from install of <mypackage> conflicts with file 
> from package filesystem-3.2-25.el7.x86_64
>     >       file /usr from install of <mypackage> conflicts with file from 
> package filesystem-3.2-25.el7.x86_64
>     >
>     >     I've read in the CPackRPM source code about how to add excludes and
>     >     CPackRPM says that my "Final list of path to OMIT in RPM" would be
>     >     
> /etc;/etc/init.d;/usr;/usr/bin;/usr/include;/usr/lib;/usr/libx32;/usr/lib64;/usr/share;/usr/share/aclocal;/usr/share/doc;/opt;/usr/share/applications
>     >
>     >
>     > You can read the doc too:
>     > 
> https://cmake.org/cmake/help/v3.13/cpack_gen/rpm.html#variable:CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST
> 
>     Haha, done that! I've read everything I could find, including the
>     docs and the excellent but hard-to-find community wiki at
>     https://gitlab.kitware.com/cmake/community/wikis/home
> 
> 
> OK then you are up-to-doc then.
> 
>     >     Could someone shed some light? I believe that the problem may be
>     >     my install command: I call install only once for the full tree
>     >     of files that I'd like to package:
>     >       install(DIRECTORY "${INSTALL_TMP_ROOT}/" DESTINATION "/" 
> USE_SOURCE_PERMISSIONS)
>     >
>     > Yep this is looking for trouble.
>     > How did you build the "${INSTALL_TMP_ROOT}" in the first place?
>     >
>     > Can't you use relative path install DESTINATION ? For all files/target 
> you build?
> 
>     I'm not sure if I can use a relative path. I want to build a system 
> package
>     that installs to /opt/<package>/ with symlinks in /usr/bin/ and desktop
>     files in /usr/share/applications/. Since files go into different paths 
> below
>     system root (/opt, /usr, maybe /var) I assume I need to install into root?
>     Maybe I misunderstand?
> 
> 
> Not really. Usually you install in relative bin/ share/ man/ whatever other 
> subdir you need.
> Then you define CPACK_PACKAGING_INSTALL_PREFIX (see 
> https://cmake.org/cmake/help/v3.13/variable/CPACK_PACKAGING_INSTALL_PREFIX.html)
> to set up your "main" install prefix for your package. Every CPack generator 
> has a default **packaging install prefix** (not to be confused with
> CMAKE_INSTALL_PREFIX).
> In your case: 
> set(CPACK_PACKAGING_INSTALL_PREFIX "/opt") 
> which should even be (AFAIR) the default value for RPM and DEB.
> 
> Concerning the symlink in /usr/bin (or other places /usr/share etc...) this 
> usually done using post-install script
> https://cmake.org/cmake/help/v3.13/cpack_gen/rpm.html#variable:CPACK_RPM_SPEC_MORE_DEFINE
> 
> the script itself may call standard symlink creation like 
> https://linux.die.net/man/8/update-alternatives

Aha, now I see the recommended approach! Makes perfect sense! So I will
continue to bundle up everything, but try to avoid files outside my
man package directory (for me /opt/${PROJECT_NAME}). Then I will make
the system integration (to /usr/bin, /usr/share, etc) via symlinks
and update-alternatives in post-install scripts. This makes perfect
sense, I'm sorry I did not think of it myself!

All the best,

    Mario



> Sometimes you *really* need absolute prefix like when you install in 
> /etc/init...
> then for those (generally system) specific file you install them with 
> absolute destination.
> CPackRPM is able to handle those as "config" file automatically.
> 
>     >     I have a wild guess that this install somehow includes the
>     >     directories, and probably it would be better to just call install
>     >     on the individual files?
>     >
>     > CPack RPM tries its best to avoid shipping directories he does not need 
> to ship, but
>     > RPM requires that any new (non shared) directory should be specified in 
> the spec file,
>     > so CPackRPM tries to "discover that" automatically and make the package 
> relocatable.
>     >
>     > Installing a whole directory to an absolute DESTINATION (even "/" in 
> you case) is probably 
>     > giving tough time to CPackRPM.
> 
>     There is something I don't understand: I can see that CPackRPM removes
>     several things from CPACK_RPM_INSTALL_FILES, but later rpm complains
>     about several of the removed items nonetheless. For example /usr/bin.
>     Does that mean the filtering failed, or does the filter work but (somehow)
>     the directory still ends up being packaged?
> 
> 
> Evil usually hides in details.
> 
> Difficult to say without having the actual code and package to look into it.
> Is your project public? If so could you provide us with the source?
> 
> If not tries to setup a stripped down public project that exhibit the same 
> issue.
>  
> 
>     >     I would prefer not to call install on the
>     >     individual files because that overrides file permissions for every
>     >     file, and I carefully prepared my package upfront to have the
>     >     exact permissions for installation.
>     >
>     >
>     > How did you "carefully prepared my package upfront" ?
>     > And what do you mean by
>     > "because that overrides file permissions for every file"
> 
>     Currently I bundle my package in a temporary directory for three reasons:
>      - Its easier for me to grasp. I.e. I can nicely inspect the package and
>        see what will be bundled before the fact.
> 
> 
> make/ninja DESTDIR=/tmp/testinstall all
> 
> may be used equally for that.
>  
> 
>      - In the temporary copy, I can override RPATH on binaries and libraries
>        without changing them in their actual install location.
> 
> 
> If you have a "clean" prefix and relative install path for all binaries then 
> you can safely use $ORIGIN 
> see: https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling
> 
>  
> 
>      - I prefer file(COPY) over install(FILES) because the former can set
>        permissions with complex patterns. I appreciate that file(COPY) allows
>        me to set executable permissions on *.so and binaries with a single
>        invocation (in a loop over many directories).
> 
> 
> if you install(TARGET ..) any binaries or .so would have the appropriate 
> permissions precisely because cmake
> knows what they are and does not consider them as "file" which is the case 
> for install(FILES).
>  
> 
>     > one more question, could you tell us which version of CPack/CMake you 
> are using?
> 
>     I'm on the latest cmake 3.13 as of now, but I tested 3.12.4 as well.
> 
> 
> Then you have all bleeding edge feature with you.
> 
> I'm not trying to tell you what to do with your install, I'm just trying what 
> CPack expects.
> 
> install(DIRECTORY ...) is a kind of trap-them-all for things that are not 
> installed otherwise, this is usually used for things like
> generated documentation and not for "normally built artefact" like 
> executable, libraries etc...
> 
> 
> -- 
> Eric

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake

Reply via email to