У меня есть проект, макет каталога которого выглядит так:
- 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
Редактировать2:
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
build.ninja
всегда использует абсолютный путь для директивы -I. - person fdk1342   schedule 02.12.2018build
иsource
оба являются подкаталогами~/example
, и вы переименовываетеexample
вactual
, вы больше не сможете использовать проекты вbuild
. - person fdk1342   schedule 02.12.20183.13
. Какая у тебя версия ниндзя? - person Gillespie   schedule 02.12.2018ninja -v
показывает абсолютные пути для исходных файлов и для каталогов включения, как я и ожидал, основываясь на содержимом файла build.ninja, созданного cmake. - person fdk1342   schedule 02.12.2018build.ninja
неверно и имеет относительные пути, это проблемаcmake
. Вам нужно будет опубликовать минимальный пример, который воспроизводит проблему. Также опубликуйте, если возможно, что происходит, когда вы запускаетеninja -v
, чтобы продемонстрировать, что относительные пути используются в командной строке. Еслиninja
преобразует полные пути в относительные, это проблемаninja
. - person fdk1342   schedule 02.12.2018