[CMake] RPM package %config noreplace causes conflict

jupiter jupiter.hce at gmail.com
Sat Aug 25 07:52:28 EDT 2012


Thanks Eric. Please see following embedded comments.

On 8/24/12, Eric Noulard <eric.noulard at gmail.com> wrote:
> 2012/8/24 hce <jupiter.hce at gmail.com>:
>> Hi,
>>
>> i use install(FILE ..) to install a configuration file config.txt by both
>> RPM packages A.rpm and B.rpm, due to the name and version in config.txt,
>> the
>> config.txt is not exactly the same in A.rpm and B.rpm. Now I've got an
>> file
>> conflict error when A.rpm was installed, B.rpm failed the installation. I
>> actually don't mind if the config.txt can be overriten or not as long as
>> it
>> is there.
>>
>> The install(FILE ...) actually generates "%config config.txt" in the spec
>> for not overwriting the file if the file exists.
>
> It generates such %config directive because the file is installed with
> an absolute
> destination like:
>
> install(FILE config.txt DESTINATION /etc/mysoftware)
>
> if it was installed with relative path you don't (automatically)  get
> the %config,
> anyway the %config is not really the issue here.

If the file without %config can automatically override the file, the
problem is resolved. What did you mean the relative path for
DESTINATION? If I use  install(FILE config.txt DESTINATION
mysoftware), what will be  the prefix for "mysoftware" in the
destination? I guess it will be the installation directory, right?

>> I guess because those two config.txt are different which causing conflic
>> error.
>
> Nope, probably  not. The conflict is because two differents packages (A and
> B)
> wan't to install a file at the very same place in the filesystem.
> RPM don't care about the content.
>
>> But I actually don't
>> mind if the config.txt can be overriten or not as long as it is there. I
>> know I can use --force in rpm command to force installation, but don't
>> want
>> to tell every body to use extra parameter to install packages.
>>
>> Is there any function in cmake I can use to force overwriting the
>> configuration file if it exists?
>
> The problem is not really with CMake but with RPM.
> I can see 2 solutions to this problem:
>
> 1) Create 3 packages A,B and common-config.
>     common-config containing the "shared" config file
>      and make A and B depends on common-config.
>     see
>    cpack --help-variable CPACK_RPM_PACKAGE_REQUIRES
>    for specifying the dependency.
>
> 2) Install the config file in a separate location for each package
>     install(FILE config.txt config/A) for package A
>     install(FILE config.txt config/B) for package B
>
>     then use a post-install script that put the config file at the wanted
>     "shared" location. The post-install script shall do appropriate
>     action if another file is already there (replace, do nothing , merge
> ....)
>      see: cpack --help-variable CPACK_RPM_POST_INSTALL_SCRIPT_FILE
>
> Hope this helps.
> --
> Erk
> Le gouvernement représentatif n'est pas la démocratie --
> http://www.le-message.org
>


More information about the CMake mailing list