atilaneves/cmake-ide

c/c++-gcc includes are ignored

Compro-Prasad opened this issue · 8 comments

I just installed cmake-ide and did the setup as mentioned. It only added clang include directories for flycheck. But I am using the c/c++-gcc checker.

Either the c/c++-gcc checker didn't exist when I wrote cmake-ide or I just didn't know about it. I added code to set the equivalent gcc flycheck variables. I don't know whether it works other than the unit tests pass - I don't have that checker installed.

Will try out the update but as far as I know you can see other checkers using C-c ! C-c. Press tab if not using a completion framework like helm. It might work.
There I have seen c/c++-cppcheck also. See if you can include that too.
And I am amused by the way it handles everything. Great software.

I knew about using cppcheck, that's been in cmake-ide for a while.

Thanks for the kind words!

ppp13 commented

I just tried this cmake-ide enhancement for c/c++-gcc, but I get the following message when the checker is run:

Suspicious state from syntax checker c/c++-gcc: Flycheck checker c/c++-gcc returned non-zero exit code 1, but its output contained no errors: cc1plus: error: output filename specified twice

I suppose the reason is that the flycheck is already defining the c/c++-gcc checker with an explicit output option -S -o /dev/null for gcc in the flycheck.el file (while it is not doing this for c/c++-clang):
(flycheck-define-checker c/c++-gcc
"A C/C++ syntax checker using GCC.
Requires GCC 4.4 or newer. See URL 'https://gcc.gnu.org/'."
:command ("gcc"
"-fshow-column"
"-iquote" (eval (flycheck-c/c++-quoted-include-directory))
(option "-std=" flycheck-gcc-language-standard concat)
(option-flag "-pedantic" flycheck-gcc-pedantic)
(option-flag "-pedantic-errors" flycheck-gcc-pedantic-errors)
(option-flag "-fno-exceptions" flycheck-gcc-no-exceptions)
(option-flag "-fno-rtti" flycheck-gcc-no-rtti)
(option-flag "-fopenmp" flycheck-gcc-openmp)
(option-list "-include" flycheck-gcc-includes)
(option-list "-W" flycheck-gcc-warnings concat)
(option-list "-D" flycheck-gcc-definitions concat)
(option-list "-I" flycheck-gcc-include-path)
(eval flycheck-gcc-args)
"-x" (eval
(pcase major-mode
(c++-mode "c++")
(c-mode "c")))
;; GCC performs full checking only when actually compiling, so
;; -fsyntax-only' is not enough. Just let it generate assembly
;; code.
"-S" "-o" null-device
;; Read from standard input
"-")
and cmake-ide is adding an additional -o through flycheck-gcc-args.
e.g. in my case the offending invocation is:
c/c++-gcc (-fshow-column -iquote /home/user/workspace/prob_ml/src/ -std=c++14 -Wall -Wextra -Dprob_ml_EXPORTS -I /usr/local/include -I /home/user/workspace/prob_ml/src -pipe -m64 -fsigned-char -fPIC -pthread -g -fPIC -o CMakeFiles/prob_ml.dir/src/readMNIST.cpp.o -c -x c++ -S -o /dev/null -)

I am not sure regarding the best approach should be to solve this, i.e. either filtering out -o CMakeFiles/prob_ml.dir/src/readMNIST.cpp.o from flycheck-gcc-args (cmake-ide self contained), or asking flycheck for a smarter definition of c/c++-gcc.

Filtering is probably the best idea.

ppp13 commented

Please find a possible quick patch attached. I just added a cmake-ide--filter-output-arg function.

0001-Remove-the-gcc-o-argument-for-the-flycheck-c-c-gcc-c.patch.gz

@ppp13 If you have a patch, please submit a PR.

ppp13 commented

Just done.