[CMake] order of includes seems wrong (or please help me understand)

Mario Emmenlauer mario at emmenlauer.de
Thu Aug 2 07:58:17 EDT 2018


Dear Robert,

On 31.07.2018 15:04, Robert Maynard wrote:
> The BEFORE keyword places the includes before any other paths such as
> ones from other target_include_directories statements or from
> transitive propagation from targets you linked too.
> 
> As to why `CMAKE_PREFIX_PATH` is being added, I expect that some find
> call is bring it in as an include directory.
> On Mon, Jul 30, 2018 at 5:43 PM Mario Emmenlauer <mario at emmenlauer.de> wrote:

I would like to understand why `CMAKE_PREFIX_PATH` is in second position
of includes. I add ${CMAKE_CURRENT_SOURCE_DIR}/include before. Are you
saying that find_package() is modifying the includes directly, like by
calling include_directories()? That would be pretty bad!

I am rather under the assumption that target_link_libraries() is changing
the order of includes.

All the best,

   Mario



>>
>> Should I report this as a bug or am I just doing something wrong?
>> Help would be greatly appreciated!
>>
>> All the best,
>>
>>     Mario
>>
>>
>> On 26.07.2018 11:58, Mario Emmenlauer wrote:
>>>
>>> Dear CMake users and developers,
>>>
>>> I've just discovered a build problem that comes from a wrong order of
>>> includes. I would know the correct order, but I am unable to instruct
>>> CMake to use the order I need.
>>>
>>> Here is a toy example that I tested with cmake 3.12.0:
>>>
>>>
>>> ----
>>> cmake_minimum_required(VERSION 3.8)
>>> project(MyLib VERSION 1.0.0)
>>> find_package(XXX REQUIRED)
>>> find_package(YYY REQUIRED)
>>> add_library(${PROJECT_NAME} include/MyLib.hh src/MyLib.cc)
>>> target_include_directories(${PROJECT_NAME}
>>>     PRIVATE
>>>         ${CMAKE_CURRENT_SOURCE_DIR}/src
>>>         ${CMAKE_CURRENT_BINARY_DIR}
>>>     PUBLIC
>>>         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
>>>         $<INSTALL_INTERFACE:include>
>>>         ${XXX_INCLUDE_DIRS} ${YYY_INCLUDE_DIRS})
>>> target_link_libraries(MyLib PUBLIC ${XXX_LIBRARIES} ${YYY_LIBRARIES})
>>> # here come more commands for build flags etc.
>>>
>>> enable_testing()
>>> add_executable(MyTest test/src/MyTest.cc test/src/MyTest.hh)
>>> target_include_directories(MyTest PRIVATE
>>>     ${CMAKE_CURRENT_SOURCE_DIR}/include
>>>     ${CMAKE_CURRENT_SOURCE_DIR}/test/src
>>>     ${CMAKE_CURRENT_SOURCE_DIR}/src
>>>     ${CMAKE_CURRENT_BINARY_DIR}
>>>     ${GTEST_INCLUDE_DIRS})
>>> target_link_libraries(MyTest PRIVATE MyLib ${GTEST_MAIN_LIBRARIES})
>>> # here come more commands for build flags etc.
>>> ----
>>>
>>>
>>> I configure cmake with -DCMAKE_PREFIX_PATH=${MY_PREFIX_PATH}. When
>>> I build the project, the order of includes for MyLib is fine. But
>>> for MyTest, the following are the first two includes:
>>>    -IMyTest_autogen/include
>>>    -I${MY_PREFIX_PATH}/include
>>>
>>> I think the second include should come much later, only *after*
>>> ${CMAKE_CURRENT_SOURCE_DIR}/include, but it comes before. Therefore,
>>> if older headers exists in ${MY_PREFIX_PATH}/include, they will be
>>> used instead of ${CMAKE_CURRENT_SOURCE_DIR}/include!
>>>
>>> I found that I can fix the problem by adding 'BEFORE' to all
>>> target_include_directories(). However I'm puzzled why this helps.
>>> Before anything I call target_include_directories(), and before other
>>> includes I have ${CMAKE_CURRENT_SOURCE_DIR}/src,
>>> ${CMAKE_CURRENT_BINARY_DIR} and ${CMAKE_CURRENT_SOURCE_DIR}/include.
>>> So what does 'BEFORE' mean in this case? Aren't these the first
>>> includes any ways?
>>>
>>> Thanks for any help, and Cheers,
>>>
>>>     Mario Emmenlauer
>>
>>
>>
>> Viele Gruesse,
>>
>>     Mario Emmenlauer
>>
>>
>> --
>> BioDataAnalysis GmbH, Mario Emmenlauer      Tel. Buero: +49-89-74677203
>> Balanstr. 43                   mailto: memmenlauer * biodataanalysis.de
>> D-81669 München                          http://www.biodataanalysis.de/
>> --
>>
>> 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:
>> https://cmake.org/mailman/listinfo/cmake
> 



Viele Gruesse,

    Mario Emmenlauer


--
BioDataAnalysis GmbH, Mario Emmenlauer      Tel. Buero: +49-89-74677203
Balanstr. 43                   mailto: memmenlauer * biodataanalysis.de
D-81669 München                          http://www.biodataanalysis.de/


More information about the CMake mailing list