[CMake] Debug problem with component install

Eric Noulard eric.noulard at gmail.com
Wed Jul 31 16:52:45 EDT 2013


2013/7/31 Andreas Pakulat <apaku at gmx.de>:
> Hi,
>
> On Sat, Jul 27, 2013 at 12:39 AM, Andreas Pakulat <apaku at gmx.de> wrote:
>>
>> Hi,
>>
>> I'm having a project here where cmake refuses to recognize the "COMPONENT"
>> option for the install() command for certain targets.
>>
>> Within the project there are several subdirs, the top-level CMakeLists.txt
>> has a component-install rule like this:
>>
>> INSTALL(DIRECTORY ${PROJECT_BINARY_DIR}/doc/html DESTINATION
>> share/doc/myapp COMPONENT documentation)
>>
>> which generates the expected output in the cmake_install.cmake file.
>> However several subdirectories contain executable targets for which the
>> cmake_install.cmake file uses the "Unspecified" component. The executable
>> target files look like this:
>>
>> SET(SOURCES
>>         main.cpp object.cpp)
>>
>> SET(MOCABLES
>>         object.h)
>>
>> QT4_WRAP_CPP(MOC_SOURCES ${MOCABLES})
>>
>> ADD_EXECUTABLE(myapp ${SOURCES} ${MOC_SOURCES})
>> TARGET_LINK_LIBRARIES(myapp ${QT_LIBRARIES})
>>
>> # Installation
>> INSTALL(TARGETS myapp RUNTIME DESTINATION bin
>>                        ARCHIVE DESTINATION lib
>>                        LIBRARY DESTINATION lib
>>                        COMPONENT applications)
>>
>> I can't seem to find a reason for this misbehaviour using cmake --trace or
>> cmake --debug-output. Are there any other ways (short of patching +
>> compiling cmake) to find out what goes wrong here? And if not, can someone
>> give me a hint where to start patching?
>>
>> I'm using cmake 2.8.11.2 on Debian/GNU Linux.
>>
>> In a very small example with just an executable target in a single cmake
>> file everything works fine, but minimizing the real codebase is quite a bit
>> harder than I thought.
>
>
> It seems that the issue is that I'm listing 'COMPONENT' after the various
> destinations. This seems to confuse the parsing of the arguments in
> cmInstallCommand, as the genericArgs in ::HandleTargetsMode always yields
> 'Unspecified' unless I move COMPONENT before the DESTINATIONS.

I'm not sure to fully understand your testcase but
the keywords specified after ARCHIVE|LIBRARY|RUNTIME|FRAMEWORK|BUNDLE|
                   PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE

should be repeated for each of them.

i.e. one shall not write
INSTALL(TARGETS myapp
                        RUNTIME DESTINATION bin
                        ARCHIVE DESTINATION lib
                        LIBRARY DESTINATION lib
                        COMPONENT applications)

but
INSTALL(TARGETS myapp
                        RUNTIME DESTINATION bin COMPONENT applications
                        ARCHIVE DESTINATION lib COMPONENT applications
                        LIBRARY DESTINATION lib COMPONENT applications)

I.e COMPONENT should be repeated just as "DESTINATION" is.

> The cmake docs do not indicate any importance on the order, but I finally
> have a minimal testcase and can file a bugreport.

I don't think the doc is wrong but the nested bracket level [[[ ]]]
makes it confusing to understand.


-- 
Erk
L'élection n'est pas la démocratie -- http://www.le-message.org


More information about the CMake mailing list