[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cmake
Subject:    Re: [CMake] order of includes seems wrong (or please help me understand)
From:       Robert Maynard <robert.maynard () kitware ! com>
Date:       2018-07-31 13:04:26
Message-ID: CAFzjYVpTodzxoQ0R4_F3xAmcqH43UWx2yZBKD3+Wu4GNZDw8Qw () mail ! gmail ! com
[Download RAW message or body]

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@emmenlauer.de> wrote:
> 
> 
> 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
-- 

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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic