[CMake] Packaging a directory with CPack RPM

Ashish Sadanandan ashish.sadanandan at gmail.com
Mon Sep 16 12:11:54 EDT 2019


On Thu, Sep 12, 2019 at 4:57 AM Eric Noulard <eric.noulard at gmail.com> wrote:
>
>
>
> Le jeu. 12 sept. 2019 à 02:27, Ashish Sadanandan <ashish.sadanandan at gmail.com> a écrit :
>>
>> Hello,
>> I'm using CPack to create RPMs for an application. I have this working but the CPack step is quite slow. While investigating this, I noticed that all files in a directory I'm packaging, which contains a large number of small files, is being listed in the spec file.
>>
>> For instance, say I have
>>
>>     set(CPACK_PACKAGING_INSTALL_PREFIX /opt/myapp)
>>     install(DIRECTORY ${CMAKE_BINARY_DIR}/myapp/foo
>>             DESTINATION foo
>>             COMPONENT myapp
>>     )
>>
>> In the %files section I see
>>
>>     %files
>>     %dir /opt/myapp/foo
>>     " /opt/myapp/foo/file1"
>>     " /opt/myapp/foo/file2"
>>     ...
>>     " /opt/myapp/foo/file60000"
>>
>> If I were writing the spec file by hand, this entire section could be replaced by a single line
>>
>>     %files
>>     /opt/myapp/foo
>
>
> CPack has no idea that the list of files are coming from an installed *directory*, because CPack is not doing the install CMake is.
> Thus CPackRPM and other CPack generators collect all installed bits inside a given [temporary] prefix directory.
>
> Now may be you can tell CPack to ignore some of you installed files/directory by using: CPACK_RPM_USER_FILELIST
>  https://cmake.org/cmake/help/v3.15/cpack_gen/rpm.html#cpack_gen:CPack%20RPM%20Generator
>

Sorry, I should've mentioned in the original email that the files are
required, so ignoring is not what I want.

>
>>
>> RPM will package all files within the directory if you specify the directory under %files (http://ftp.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html - the "The %dir Directive" section)
>> Is there an option to list just the directory instead of recursively listing all contained files within the directory?
>
>
> AFAIK, No there is not.
>
>
>> I'm not claiming this is the reason for CPack being slow, I came across this while investigating performance and if nothing else, this will result in a cleaner looking spec file.
>
>
> For performance sake you can try CPACK_RPM_USER_BINARY_SPECFILE, CPACK_RPM_GENERATE_USER_BINARY_SPECFILE_TEMPLATE
> and handcraft your "user" spec file in order to see if it helps the packaging performance.
> and/or you can set CPACK_RPM_PACKAGE_DEBUG to 1 in order to get more timed traces of CPackRPM execution.
>

Thanks, this looks promising but I'm having trouble getting CPack to
use my custom spec file. This is what I've added to my CMakeLists.txt
so far (using cmake 3.6.3)

    # We're already using component install
    set(CPACK_RPM_COMPONENT_INSTALL ON)
    set(CPACK_RPM_TESTS_FILE_NAME
        "${CPACK_PACKAGE_NAME}-tests-${CPACK_PACKAGE_VERSION}-${CPACK_RPM_PACKAGE_RELEASE}.${CMAKE_SYSTEM_PROCESSOR}.rpm"
    )
    install(DIRECTORY ${CMAKE_BINARY_DIR}/tests
            DESTINATION tests
            COMPONENT tests
    )
    set(CPACK_RPM_TESTS_USER_BINARY_SPECFILE
        "${CMAKE_CURRENT_SOURCE_DIR}/tests.spec"
    )

But CPack is still generating a spec file for the tests RPM instead of
using my spec file. I've even tried using an absolute path to the spec
file but still the same behavior. What am I doing wrong?


>
> --
> Eric

Thanks so much for your help,
Ashish.


More information about the CMake mailing list