Я не смог найти окончательный ответ, поэтому извиняюсь, если ответ есть.Создание проекта Xcode из Cmake содержит нежелательные флаги компилятора
Я использую cmake для создания файлов проекта, поскольку я склонен работать на кросс-платформенной платформе. В OSX/Xcode я вижу ненужные флаги компилятора, в частности, предупреждение/запрет. Мне нравится компилировать с максимально возможным количеством предупреждений и устанавливать предупреждения как ошибки.
Рассмотрим следующий пример:
Файл: CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(test)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++14)
add_compile_options("-Werror")
add_compile_options("-Weverything")
add_compile_options("-Wno-c++98-compat-pedantic")
add_compile_options("-Wno-padded")
add_executable(Test main.cpp)
target_link_libraries(Test libstdc++.dylib libc++.dylib)
Файл: main.cpp
#include <iostream>
int main(int argc, char * const argv[])
{
(void)argc;
(void)argv;
std::cout << "Kittens." << std::endl;
return 0;
}
Если я после этого запустить CMake:
cmake -G Xcode .
(обычно я бы использовал каталог для сборки, но не для простоты).
Затем построить (из командной строки):
cmake --build . --config Debug --target ALL_BUILD
Простой пример будет компилироваться. Если я теперь смотрю на команду, используемую для компиляции main.cpp я вижу следующее:
CompileC test.build/Debug/Test.build/Objects-normal/x86_64/main.o main.cpp normal x86_64 c++ com.apple.compilers.llvm.clang.1_0.compiler
cd /Users/username/Development/test
export LANG=en_US.US-ASCII
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x c++ -arch x86_64 -fmessage-length=101 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -fcolor-diagnostics -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-return-type -Wno-non-virtual-dtor -Wno-overloaded-virtual -Wno-exit-time-destructors -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wno-unused-variable -Wunused-value -Wno-empty-body -Wno-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-constant-conversion -Wno-int-conversion -Wno-bool-conversion -Wno-enum-conversion -Wno-shorten-64-to-32 -Wno-newline-eof -Wno-c++11-extensions -DCMAKE_INTDIR=\"Debug\" -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -fasm-blocks -fstrict-aliasing -Wdeprecated-declarations -Winvalid-offsetof -mmacosx-version-min=10.11 -g -Wno-sign-conversion -I/Users/username/Development/test/Debug/include -I/Users/username/Development/test/test.build/Debug/Test.build/DerivedSources/x86_64 -I/Users/username/Development/test/test.build/Debug/Test.build/DerivedSources -Wmost -Wno-four-char-constants -Wno-unknown-pragmas -F/Users/username/Development/test/Debug -std=c++14 -Werror -Weverything -Wno-c++98-compat-pedantic -Wno-padded -MMD -MT dependencies -MF /Users/username/Development/test/test.build/Debug/Test.build/Objects-normal/x86_64/main.d --serialize-diagnostics /Users/username/Development/test/test.build/Debug/Test.build/Objects-normal/x86_64/main.dia -c /Users/username/Development/test/main.cpp -o /Users/username/Development/test/test.build/Debug/Test.build/Objects-normal/x86_64/main.o
Действительно раздражает, что здесь какой-либо из вариантов -W. В моем CMakeLists.txt я четко сказал, что хочу, чтобы все предупреждения, предупреждения были обработаны как ошибки, и указали пару предупреждений.
Однако, если я вырезать все -W параметры в команде компиляции, я вижу (в дополнение к тому, что я просил):
-Wno-trigraphs
-Wno-missing-field-initializers
-Wno-missing-prototypes
-Wno-return-type
-Wno-non-virtual-dtor
-Wno-overloaded-virtual
-Wno-exit-time-destructors
-Wno-missing-braces
-Wparentheses
-Wswitch
-Wno-unused-function
-Wno-unused-label
-Wno-unused-parameter
-Wno-unused-variable
-Wunused-value
-Wno-empty-body
-Wno-uninitialized
-Wno-unknown-pragmas
-Wno-shadow
-Wno-four-char-constants
-Wno-conversion
-Wno-constant-conversion
-Wno-int-conversion
-Wno-bool-conversion
-Wno-enum-conversion
-Wno-shorten-64-to-32
-Wno-newline-eof
-Wno-c++11-extensions
-Winvalid-offsetof
-Wno-sign-conversion
-Wmost
-Wno-four-char-constants
-Wno-unknown-pragmas
Некоторые из этих вещей, перечисленных я действительно не хочу инвалидов , Мне действительно нужны только параметры -W, которые я указал в файле cmake, который используется для компиляции, но я не вижу, кто вводит все эти дополнительные вещи и откуда.
Есть ли способ, которым я могу получить cmake, чтобы сообщить xcode не включать все эти дополнительные опции -W из компиляции?
Примечание: с помощью:
CMake 3.5.2
компании Apple LLVM версии 7.3.0 (лязг-703.0.31)
Извинения за то, что вы недостаточно ясны, я уже проверял эту возможность. Добавление сообщения («CMAKE_CXX_FLAGS» «$ {CMAKE_CXX_FLAGS})' в рамках проектного вызова показывает, что в этой точке переменная cmake пуста. Поэтому заменить нечего. Аналогично, CMAKE_CXX_FLAGS_DEBUG содержит только в своем тесте '-g'. –
Хм, глядя в командную строку сборки, кажется, что все до '-g' на самом деле является компилятором *. Маловероятно, что вы хотите изменить его. Но если вы не хотите, чтобы некоторые предупреждения были отключены, почему бы не включить их в 'CMAKE_CXX_FLAGS'? Существует, например, опция «-Wall» для gcc, которая позволяет сразу много предупреждений. Модификация 'CMAKE_CXX_FLAGS' является обычным способом в CMake для включения функций, которые вы хотите. – Tsyvarev
В самом деле, если добавляется следующее скрипт: 'get_cmake_property (_variableNames ПЕРЕМЕННЫХ) Еогеасп (_variableName $ {_ variableNames}) сообщение (STATUS "$ {_ имяПеременной} = $ {$ {_ имяПеременной}}") endforeach () ' Ни один из дополнительных параметров предупреждения, которые я вижу в командной строке сборки, не включен в любую переменную cmake. В этом отношении ни те, что я добавил с помощью 'add_compile_options'. –