2016-05-31 6 views
1

Я не смог найти окончательный ответ, поэтому извиняюсь, если ответ есть.Создание проекта 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)

ответ

0

В project() вызова CMake обнаруживает компилятор (вы можете увидеть переписывались сообщения когда выполняется cmake) и устанавливает для него флаги по умолчанию. Эти флаги хранятся в переменных CMAKE_CXX_FLAGS (общий) и CMAKE_CXX_FLAGS_<CONFIG> (для конфигурации).

Вы можете изменять эти переменные, как вы хотите:

1) полностью переписать их

set(CMAKE_CXX_FLAGS "<desired-value>") 

2) добавить новые флаги к ним

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} <additional-flags>") 

3) удалить определенные значения из них

string(REPLACE "<unwanted-flag>" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) 
# or 
string(REGEX REPLACE "<unwanted-flag-regex>" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) 

и так далее.

+0

Извинения за то, что вы недостаточно ясны, я уже проверял эту возможность. Добавление сообщения («CMAKE_CXX_FLAGS» «$ {CMAKE_CXX_FLAGS})' в рамках проектного вызова показывает, что в этой точке переменная cmake пуста. Поэтому заменить нечего. Аналогично, CMAKE_CXX_FLAGS_DEBUG содержит только в своем тесте '-g'. –

+0

Хм, глядя в командную строку сборки, кажется, что все до '-g' на самом деле является компилятором *. Маловероятно, что вы хотите изменить его. Но если вы не хотите, чтобы некоторые предупреждения были отключены, почему бы не включить их в 'CMAKE_CXX_FLAGS'? Существует, например, опция «-Wall» для gcc, которая позволяет сразу много предупреждений. Модификация 'CMAKE_CXX_FLAGS' является обычным способом в CMake для включения функций, которые вы хотите. – Tsyvarev

+0

В самом деле, если добавляется следующее скрипт: 'get_cmake_property (_variableNames ПЕРЕМЕННЫХ) Еогеасп (_variableName $ {_ variableNames}) сообщение (STATUS "$ {_ имяПеременной} = $ {$ {_ имяПеременной}}") endforeach () ' Ни один из дополнительных параметров предупреждения, которые я вижу в командной строке сборки, не включен в любую переменную cmake. В этом отношении ни те, что я добавил с помощью 'add_compile_options'. –

Смежные вопросы