Заставить CMake использовать абсолютный путь включения - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть проект, макет каталога которого выглядит следующим образом:

- src/ #Contains main source code
- ext/ #Contains external libraries and headers from GitHub
- CMakeLists.txt

Проблема в том, что независимо от того, что я делаю, CMake всегда передает компилятору ext/ как относительный путь, например:

/usr/bin/c++ -I../ext mysrc.cpp

Я пытался сделать оба:

include_directories("${PROJECT_SOURCE_DIR}/ext")
include_directories("/home/user/project/ext")

Но, похоже, это не имеет значения.Каталог всегда передается в -I как ../ext.

Почему это важно?В конце моей сборки я вызываю gcov -r <source file>, который говорит gcov генерировать отчеты о покрытии из моего исходного файла и любых относительных путей, найденных внутри.В результате, gcov приступает к работе ext/ и генерирует отчеты по множеству вещей, которые мне не нужны, и это отнимает много времени.Если бы вместо этого CMake передавал -I/home/user/project/ext, gcov -r игнорировал бы все в ext/.

Насколько я могу судить по: https://cmake.org/cmake/help/v3.13/command/include_directories.html ... это невозможно,но, может быть, я просто что-то упустил?

Редактировать: Кажется, это проблема именно с генератором ninja.При использовании генератора Unix Makefiles, все передается по абсолютным путям.

https://gitlab.kitware.com/cmake/cmake/issues/18666

Edit2:

user@antimony:~/cmake_test$ ls
CMakeLists.txt  ext  src
user@antimony:~/cmake_test$ cat CMakeLists.txt 
project(Hello)

add_subdirectory(src)
user@antimony:~/cmake_test$ cat src/CMakeLists.txt 
include_directories(
    .
    ${PROJECT_SOURCE_DIR}/ext
)

add_executable(hello_world hello.cpp)
user@antimony:~/cmake_test$ cat src/hello.cpp 
#include <useless.h>

int main()
{
    hello h;
    return 0;
}
user@antimony:~/cmake_test$ cat ext/useless.h 
struct hello {
    int x;
};
user@antimony:~/cmake_test$ ~/Downloads/cmake-3.13.1-Linux-x86_64/bin/cmake --version
cmake version 3.13.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).
user@antimony:~/cmake_test$ mkdir build && cd build
user@antimony:~/cmake_test/build$ ~/Downloads/cmake-3.13.1-Linux-x86_64/bin/cmake .. -G Ninja
-- The C compiler identification is GNU 7.3.0
-- The CXX compiler identification is GNU 7.3.0
...
-- Build files have been written to: /home/user/cmake_test/build
user@antimony:~/cmake_test/build$ ninja -v
[1/2] /usr/bin/c++   -I../src/. -I../ext  -MD -MT src/CMakeFiles/hello_world.dir/hello.o -MF src/CMakeFiles/hello_world.dir/hello.o.d -o src/CMakeFiles/hello_world.dir/hello.o -c ../src/hello.cpp
[2/2] : && /usr/bin/c++    -rdynamic src/CMakeFiles/hello_world.dir/hello.o  -o src/hello_world   && :
user@antimony:~/cmake_test/build$ cat build.ninja
# CMAKE generated file: DO NOT EDIT!
# Generated by "Ninja" Generator, CMake Version 3.13

# This file contains all the build statements describing the
# compilation DAG.

...

#############################################
# Order-only phony target for hello_world

build cmake_object_order_depends_target_hello_world: phony || src/CMakeFiles/hello_world.dir
build src/CMakeFiles/hello_world.dir/hello.o: CXX_COMPILER__hello_world ../src/hello.cpp || cmake_object_order_depends_target_hello_world
  DEP_FILE = src/CMakeFiles/hello_world.dir/hello.o.d
  INCLUDES = -I../src/. -I../ext
  OBJECT_DIR = src/CMakeFiles/hello_world.dir
  OBJECT_FILE_DIR = src/CMakeFiles/hello_world.dir
  TARGET_COMPILE_PDB = src/CMakeFiles/hello_world.dir/
  TARGET_PDB = src/hello_world.pdb

# =============================================================================
# Link build statements for EXECUTABLE target hello_world

1 Ответ

0 голосов
/ 03 декабря 2018

В примере показано, что можно считать сборкой в ​​исходном коде.То есть, когда каталог сборки совпадает или является подкаталогом папки src (не то, что существует жесткое определение или что-то еще, но это вызывает проблему ниндзя при использовании относительных путей в командной строке).Попробуйте mkdir ~/cmake_build && cd ~/cmake_build && cmake ~/cmake_test, тогда он должен использовать абсолютные пути для всего.

В любом случае, на самом деле не существует определенного способа заставить один или другой.В общем, генераторы cmake будут использовать абсолютные пути для всего, что в конечном итоге используется в командной строке.Кажется, есть проблемы с Ninja, которые мешают генератору использовать абсолютные пути для сборок в исходном коде (https://github.com/ninja-build/ninja/issues/1251).

...