cmake-qt: controlling includes order

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

cmake-qt: controlling includes order

Bill Somerville
Hi All,

I have an issue with cmake-qt where i need to ensure an include path set
by the include_directories() command is after include paths that are
added by the target_link_libraries() command or by the qt5_use_modules()
command. In both cases the AFTER option on the include_directories()
command doesn't seem to help me. Most of the Qt include paths get added
to the end of the list, for some reason QtCore doesn't, and I can't find
a way to force the ordering I need.

I don't know if this an issue with the Qt CMake files or a generic issue
with target properties vs. using the include_directories() command.

Any ideas how I can control the ordering or reorder the
TARGET_INCLUDE_DIRECTORIES property?

TIA
Bill.
--

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:
http://public.kitware.com/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: cmake-qt: controlling includes order

Stephen Kelly-2
Bill Somerville wrote:

> Any ideas how I can control the ordering or reorder the
> TARGET_INCLUDE_DIRECTORIES property?


 add_executable(hello main.cpp)
 target_link_libraries(hello Qt5::Widgets)
 target_include_directories(
   $<TARGET_PROPERTY:Qt5::Widgets,INTERFACE_INCLUDE_DIRECTORIES>
   ${otherIncludes}
 )

Thanks,

Steve.

--

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:
http://public.kitware.com/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: cmake-qt: controlling includes order

Bill Somerville
On 30/06/2015 22:28, Stephen Kelly wrote:

Hi Steve,

thanks for looking at this.

> Bill Somerville wrote:
>
>> Any ideas how I can control the ordering or reorder the
>> TARGET_INCLUDE_DIRECTORIES property?
>
>   add_executable(hello main.cpp)
>   target_link_libraries(hello Qt5::Widgets)
>   target_include_directories(
>     $<TARGET_PROPERTY:Qt5::Widgets,INTERFACE_INCLUDE_DIRECTORIES>
>     ${otherIncludes}
>   )
OK, so that doesn't work but the following does:

add_executable(hello main.cpp)
target_link_libraries(hello Qt5::Widgets Qt5::Network ${other_LIBRARIES})
target_include_directories( hello PRIVATE
$<TARGET_PROPERTY:Qt5::Widgets,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:Qt5::Network,INTERFACE_INCLUDE_DIRECTORIES>
     ${other_INCLUDE_DIRS}
)

Note that every top level Qt5 include directory property used has to be
mentioned. This is pretty painful given the intent is simply to put
${other_INCLUDE_DIRS} at the end of the list. Also this is all due to a
Mac issue where having MacPorts Qt4 installed causes it to be pulled in
when some other MacPorts library is used, in this case FFTW3. Most of
our developers work on Windows and Linux and are not going to know that
this abomination is required to stop the Mac build breaking.

I see target_include_directories() has a BEFORE option but no AFTER
option, I would have thought that is necessary to be the equivalent of
he directory level include_directories() command.

It would also help to understand how the Qt5 include directories get
added when they are not specified at all, i.e. when something like:

add_executable(hello main.cpp)
target_link_libraries(hello Qt5::Widgets)

is used alone.
>
> Thanks,
>
> Steve.
>
Regards
Bill.
--

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:
http://public.kitware.com/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: cmake-qt: controlling includes order

Stephen Kelly-2
Bill Somerville wrote:

> Also this is all due to a
> Mac issue where having MacPorts Qt4 installed causes it to be pulled in
> when some other MacPorts library is used, in this case FFTW3. Most of
> our developers work on Windows and Linux and are not going to know that
> this abomination is required to stop the Mac build breaking.

Yes, I've hit this issue before too. I filed

 http://public.kitware.com/Bug/view.php?id=15643
 
to track it.

> I see target_include_directories() has a BEFORE option but no AFTER
> option, I would have thought that is necessary to be the equivalent of
> the directory level include_directories() command.
>
> It would also help to understand how the Qt5 include directories get
> added when they are not specified at all, i.e. when something like:
>
> add_executable(hello main.cpp)
> target_link_libraries(hello Qt5::Widgets)
>
> is used alone.

In this case:

 add_executable(hello main.cpp)
 target_include_directories(hello PRIVATE /opt/foo)
 target_link_libraries(hello Qt5::Widgets)
 target_include_directories(hello PRIVATE /opt/bar)

the order will be

 -I/opt/foo -I/opt/bar -I/opt/qt5/include/Qt5Widgets etc...

When generating the list of directories to include, the ordered contents of
the INCLUDE_DIRECTORIES property is processed first, and after that, the
include directories of any ordered linked targets are appended. The ordering
is the order of each different set of commands.

Hope that helps. If you think the documentation can be clarified here,
please contribute a patch, possibly to the cmake-buildsystem manual.

Thanks,

Steve.


--

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:
http://public.kitware.com/mailman/listinfo/cmake