[CMake] CPACK_COMPONENT_<compName>_DEPENDS doesn't work

Jeremy Fix Jeremy.Fix at Supelec.fr
Wed Nov 20 04:09:35 EST 2013


On 11/20/2013 09:52 AM, Eric Noulard wrote:
> 2013/11/20 Jeremy Fix <Jeremy.Fix at supelec.fr>:
>> Hello,
>>
>> I'm surprised CPACK_RPM_gui_PACKAGE_REQUIRES works , I don't find any use of
>> CPACK_RPM_<compName>_REQUIRES in CPackRPM.cmake;
>
> Yes there is for all
>
> URL REQUIRES SUGGESTS PROVIDES OBSOLETES PREFIX CONFLICTS AUTOPROV
> AUTOREQ AUTOREQPROV
>
> see lines 555 and following we check for component specific value first:
>
> if(DEFINED CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_PACKAGE_${_RPM_SPEC_HEADER})
>
> then
> else()
>              if(DEFINED CPACK_RPM_PACKAGE_${_RPM_SPEC_HEADER})
>
> However we may have check the definition of
> "CPACK_COMPONENT_<compName>_DEPENDS" first
> in order to fill-in CPACK_RPM_<compName>_REQUIRES.
> This is not done.
>
> Moreover I'm not sure this could be easily factoired out since the
> syntax for dependency specification
> may well be package type specific (different name or syntax for DEB or
> RPM for example).
>
>> What I can suggest you for generating several packages with different
>> dependencies is to generate the different packages in multiple steps. If we
>> suppose you defined 2 components (in the INSTALL commands) called : binary
>> and devel ,you can then generate the packages (whether deb or rpm) as
>> follows:
>>
>>
>> SET(CPACK_INSTALL_CMAKE_PROJECTS "${CMAKE_BINARY_DIR};${CMAKE_PROJECT_NAME};
>> ${MYBUILDTYPE};/")
>>
>> then for the dependencies:
>>
>> IF(MYBUILDTYPE STREQUAL "binary")
>> SET(CPACK_RPM_PACKAGE_REQUIRES "gsl")
>> SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libgsl0-dev")
>> ELSE()
>> SET(CPACK_RPM_PACKAGE_REQUIRES "gsl-devel")
>> SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libgsl0-dev")
>> ENDIF()
>>
>>
>> Then the packages are generated with:
>>
>> cmake -DMYBUILDTYPE="binary" && make package
>> cmake -DMYBUILDTYPE="devel" && make package
>
> You should be able to do that with component packaging and a
> CPACK_PROJECT_CONFIG_FILE.
>

I'm not familiar with CPACK_PROJECT_CONFIG_FILE;

I had issues with the package names generated with component packaging 
as the component name is added at the end of the package name; I 
prefered to generate the components in two steps to tweak the 
CPACK_RPM_PACKAGE_NAME  and I use some commands a bit more complicated 
than the above;

IF(MYBUILDTYPE STREQUAL "binary")
SET(CPACK_RPM_PACKAGE_NAME ${CMAKE_PROJECT_NAME})
SET(CPACK_DEBIAN_PACKAGE_NAME ${CMAKE_PROJECT_NAME})
SET(CPACK_PACKAGE_FILE_NAME 
${CMAKE_PROJECT_NAME}-${PACKAGE_VERSION}-${CMAKE_SYSTEM_PROCESSOR})
SET(CPACK_INSTALL_CMAKE_PROJECTS 
"${CMAKE_BINARY_DIR};${CMAKE_PROJECT_NAME};binary;/")
ELSEIF(MYBUILDTYPE STREQUAL "devel")
SET(CPACK_RPM_PACKAGE_NAME ${CMAKE_PROJECT_NAME}-devel)
SET(CPACK_DEBIAN_PACKAGE_NAME ${CMAKE_PROJECT_NAME}-devel)
SET(CPACK_PACKAGE_FILE_NAME 
${CMAKE_PROJECT_NAME}-devel-${PACKAGE_VERSION}-${CMAKE_SYSTEM_PROCESSOR})
SET(CPACK_INSTALL_CMAKE_PROJECTS 
"${CMAKE_BINARY_DIR};${CMAKE_PROJECT_NAME}-devel;devel;/")
ENDIF()


This is just to ensure consistency between the field "Name:" in the 
autogenerated spec file is  :    pkg   and pkg-devel ;
and the generated RPM (or deb) filenames:   pkg-1.00-i686.rpm  and 
pkg-devel-1.00-i686.rpm


jeremy.





More information about the CMake mailing list