LINUX.ORG.RU

[cmake][CMAKE_CXX_FLAGS] Флаги страбатывают только при повторной компиляции


0

1

Сейчас столкнулся с такой проблемой. Прописал в CMakeLists.txt опцию:

set(CMAKE_CXX_FLAGS "-O0")

Удаляю файл CMakeCache.txt и каталог CMakeFiles. Запускаю собрку с вербзом, и вижу, что сборка идет без опций -O0:

$ cmake .
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xi/work/loloswitcher

$ make VERBOSE=1
/usr/bin/cmake -H/home/xi/work/loloswitcher -B/home/xi/work/loloswitcher --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/xi/work/loloswitcher/CMakeFiles /home/xi/work/loloswitcher/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/home/xi/work/loloswitcher'
make -f CMakeFiles/loloswitcher.dir/build.make CMakeFiles/loloswitcher.dir/depend
make[2]: Entering directory `/home/xi/work/loloswitcher'
cd /home/xi/work/loloswitcher && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/xi/work/loloswitcher /home/xi/work/loloswitcher /home/xi/work/loloswitcher /home/xi/work/loloswitcher /home/xi/work/loloswitcher/CMakeFiles/loloswitcher.dir/DependInfo.cmake --color=
Dependee "/home/xi/work/loloswitcher/CMakeFiles/loloswitcher.dir/DependInfo.cmake" is newer than depender "/home/xi/work/loloswitcher/CMakeFiles/loloswitcher.dir/depend.internal".
Dependee "/home/xi/work/loloswitcher/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/home/xi/work/loloswitcher/CMakeFiles/loloswitcher.dir/depend.internal".
Scanning dependencies of target loloswitcher
make[2]: Leaving directory `/home/xi/work/loloswitcher'              
make -f CMakeFiles/loloswitcher.dir/build.make CMakeFiles/loloswitcher.dir/build
make[2]: Entering directory `/home/xi/work/loloswitcher'
/usr/bin/cmake -E cmake_progress_report /home/xi/work/loloswitcher/CMakeFiles 1
[ 20%] Building CXX object CMakeFiles/loloswitcher.dir/Main.cpp.o
/usr/bin/c++     -o CMakeFiles/loloswitcher.dir/Main.cpp.o -c /home/xi/work/loloswitcher/Main.cpp
/usr/bin/cmake -E cmake_progress_report /home/xi/work/loloswitcher/CMakeFiles 2
[ 40%] Building CXX object CMakeFiles/loloswitcher.dir/KeyLayout.cpp.o
/usr/bin/c++     -o CMakeFiles/loloswitcher.dir/KeyLayout.cpp.o -c /home/xi/work/loloswitcher/KeyLayout.cpp
/usr/bin/cmake -E cmake_progress_report /home/xi/work/loloswitcher/CMakeFiles 3
[ 60%] Building CXX object CMakeFiles/loloswitcher.dir/Config.cpp.o
/usr/bin/c++     -o CMakeFiles/loloswitcher.dir/Config.cpp.o -c /home/xi/work/loloswitcher/Config.cpp
/usr/bin/cmake -E cmake_progress_report /home/xi/work/loloswitcher/CMakeFiles 4
[ 80%] Building CXX object CMakeFiles/loloswitcher.dir/ParseHelper.cpp.o
/usr/bin/c++     -o CMakeFiles/loloswitcher.dir/ParseHelper.cpp.o -c /home/xi/work/loloswitcher/ParseHelper.cpp
/usr/bin/cmake -E cmake_progress_report /home/xi/work/loloswitcher/CMakeFiles 5
[100%] Building CXX object CMakeFiles/loloswitcher.dir/EventQueue.cpp.o
/usr/bin/c++     -o CMakeFiles/loloswitcher.dir/EventQueue.cpp.o -c /home/xi/work/loloswitcher/EventQueue.cpp
Linking CXX executable loloswitcher
/usr/bin/cmake -E cmake_link_script CMakeFiles/loloswitcher.dir/link.txt --verbose=1              
/usr/bin/c++      CMakeFiles/loloswitcher.dir/Main.cpp.o CMakeFiles/loloswitcher.dir/KeyLayout.cpp.o CMakeFiles/loloswitcher.dir/Config.cpp.o CMakeFiles/loloswitcher.dir/ParseHelper.cpp.o CMakeFiles/loloswitcher.dir/EventQueue.cpp.o  -o loloswitcher -rdynamic -lX11 -lpcre -lpthread 
make[2]: Leaving directory `/home/xi/work/loloswitcher'
/usr/bin/cmake -E cmake_progress_report /home/xi/work/loloswitcher/CMakeFiles  1 2 3 4 5
[100%] Built target loloswitcher
make[1]: Leaving directory `/home/xi/work/loloswitcher'
/usr/bin/cmake -E cmake_progress_start /home/xi/work/loloswitcher/CMakeFiles 0

Запускаю то же самое второй раз:

$ cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xi/work/loloswitcher

$ make VERBOSE=1
/usr/bin/cmake -H/home/xi/work/loloswitcher -B/home/xi/work/loloswitcher --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/xi/work/loloswitcher/CMakeFiles /home/xi/work/loloswitcher/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory `/home/xi/work/loloswitcher'
make -f CMakeFiles/loloswitcher.dir/build.make CMakeFiles/loloswitcher.dir/depend
make[2]: Entering directory `/home/xi/work/loloswitcher'
cd /home/xi/work/loloswitcher && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/xi/work/loloswitcher /home/xi/work/loloswitcher /home/xi/work/loloswitcher /home/xi/work/loloswitcher /home/xi/work/loloswitcher/CMakeFiles/loloswitcher.dir/DependInfo.cmake --color=
make[2]: Leaving directory `/home/xi/work/loloswitcher'
make -f CMakeFiles/loloswitcher.dir/build.make CMakeFiles/loloswitcher.dir/build
make[2]: Entering directory `/home/xi/work/loloswitcher'
/usr/bin/cmake -E cmake_progress_report /home/xi/work/loloswitcher/CMakeFiles 1
[ 20%] Building CXX object CMakeFiles/loloswitcher.dir/Main.cpp.o
/usr/bin/c++    -O0 -g   -o CMakeFiles/loloswitcher.dir/Main.cpp.o -c /home/xi/work/loloswitcher/Main.cpp
/usr/bin/cmake -E cmake_progress_report /home/xi/work/loloswitcher/CMakeFiles 2
[ 40%] Building CXX object CMakeFiles/loloswitcher.dir/KeyLayout.cpp.o
/usr/bin/c++    -O0 -g   -o CMakeFiles/loloswitcher.dir/KeyLayout.cpp.o -c /home/xi/work/loloswitcher/KeyLayout.cpp
/usr/bin/cmake -E cmake_progress_report /home/xi/work/loloswitcher/CMakeFiles 3
[ 60%] Building CXX object CMakeFiles/loloswitcher.dir/Config.cpp.o
/usr/bin/c++    -O0 -g   -o CMakeFiles/loloswitcher.dir/Config.cpp.o -c /home/xi/work/loloswitcher/Config.cpp
/usr/bin/cmake -E cmake_progress_report /home/xi/work/loloswitcher/CMakeFiles 4
[ 80%] Building CXX object CMakeFiles/loloswitcher.dir/ParseHelper.cpp.o
/usr/bin/c++    -O0 -g   -o CMakeFiles/loloswitcher.dir/ParseHelper.cpp.o -c /home/xi/work/loloswitcher/ParseHelper.cpp
/usr/bin/cmake -E cmake_progress_report /home/xi/work/loloswitcher/CMakeFiles 5
[100%] Building CXX object CMakeFiles/loloswitcher.dir/EventQueue.cpp.o
/usr/bin/c++    -O0 -g   -o CMakeFiles/loloswitcher.dir/EventQueue.cpp.o -c /home/xi/work/loloswitcher/EventQueue.cpp
Linking CXX executable loloswitcher
/usr/bin/cmake -E cmake_link_script CMakeFiles/loloswitcher.dir/link.txt --verbose=1              
/usr/bin/c++   -O0 -g   CMakeFiles/loloswitcher.dir/Main.cpp.o CMakeFiles/loloswitcher.dir/KeyLayout.cpp.o CMakeFiles/loloswitcher.dir/Config.cpp.o CMakeFiles/loloswitcher.dir/ParseHelper.cpp.o CMakeFiles/loloswitcher.dir/EventQueue.cpp.o  -o loloswitcher -rdynamic -lX11 -lpcre -lpthread 
make[2]: Leaving directory `/home/xi/work/loloswitcher'
/usr/bin/cmake -E cmake_progress_report /home/xi/work/loloswitcher/CMakeFiles  1 2 3 4 5
[100%] Built target loloswitcher
make[1]: Leaving directory `/home/xi/work/loloswitcher'
/usr/bin/cmake -E cmake_progress_start /home/xi/work/loloswitcher/CMakeFiles 0

На этот раз опция -O0 применяется.

Почему так? Как исправить?

может в этом дело: Dependee «/home/xi/work/loloswitcher/CMakeFiles/loloswitcher.dir/DependInfo.cmake» is newer than depender «/home/xi/work/loloswitcher/CMakeFiles/loloswitcher.dir/depend.internal». Dependee «/home/xi/work/loloswitcher/CMakeFiles/CMakeDirectoryInformation.cmake» is newer than depender «/home/xi/work/loloswitcher/CMakeFiles/loloswitcher.dir/depend.internal».

сам пользовался cmake'ом мало, да и то под вин.

Rubbiroid ()
Ответ на: комментарий от Rubbiroid

Не, это не то.

В англонете пишут что-то поро Cmake-кеш, который создается при первом запуске Cmake, и что в сборке не участвуют переменные, заданные в Cmake-файле, пока они не попадут в кеш.

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

Видимо, надо сначала закешировать, а потом выполнить сборку. Но что-то я не могу разобраться, как это делать. Пока на ум приходит только два раза запускать cmake. Но это как-то неправильно.

webhamster ()
Ответ на: комментарий от webhamster

Может расскажешь какую задачу решаешь и зачем тебе понадобилось править CMAKE_CXX_FLAGS ?

Reset ★★★★★ ()

ЧЯДНТ?

% ls
CMakeLists.txt
test.cc
% cat CMakeLists.txt 
SET(CMAKE_CXX_FLAGS "-O0")
ADD_EXECUTABLE(test test.cc)
% cat test.cc 
int main() { return 0; }
% cmake .
Re-run cmake no build system arguments
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/zz
% VERBOSE=1 make | grep O0
/usr/bin/c++    -O0 -o CMakeFiles/test.dir/test.cc.o -c /tmp/zz/test.cc
/usr/bin/c++   -O0   CMakeFiles/test.dir/test.cc.o  -o test  
slovazap ★★★★★ ()

в своем рабочем каталоге, да ещё и «cmake .» вы точно извращенец.
mkdir build && cmake ..

bhfq ★★★★★ ()
Ответ на: комментарий от bhfq

> в своем рабочем каталоге

А где надо, в чужом?

да ещё и «cmake .»

man git-clean

slovazap ★★★★★ ()
Ответ на: комментарий от Reset

> Может расскажешь какую задачу решаешь и зачем тебе понадобилось править CMAKE_CXX_FLAGS ?

По материалам вот этого бага:

Переключатель клавиатуры LoLo Switcher v.0.15 (комментарий)

У человека оказался AMD, и он решил проблему опцией -O0:

Переключатель клавиатуры LoLo Switcher v.0.15 (комментарий)
Переключатель клавиатуры LoLo Switcher v.0.15 (комментарий)

Я теперь хочу засунуть эту опцию в стандартную сборку, а то мало ли, gcc какой-нибудь версии может на ровном месте может и под Intel криво заоптимизировать.

webhamster ()
Ответ на: комментарий от webhamster

Это не так надо делать. Выстави на проблемных файлах свойства компиляции через set_source_properties или что типа того

Reset ★★★★★ ()
Ответ на: комментарий от Reset

Я пробовал добавлять до и после set(SOURCE ...) строку:

set_source_files_properties(EventQueue.cpp PROPERTIES CMAKE_CXX_FLAGS "-O0")

не помогает. Этот файл компилируется без опции -O0, хоть с первого, хоть со второго раза.

Никаких предупреждений что опция неправильная не выдается, то есть она принимается cmake, но не выполняется.

webhamster ()
Ответ на: комментарий от webhamster

set_source_files_properties(EventQueue.cpp PROPERTIES COMPILE_FLAGS "-O0")

Reset ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.