atilaneves / cmake-ide

Use Emacs as a C/C++ IDE
BSD 3-Clause "New" or "Revised" License
716 stars 92 forks source link

cmake-ide asks to find or create already present cpp file #212

Open eike-fokken opened 3 years ago

eike-fokken commented 3 years ago

Hi there!

cmake-ide keeps asking me to "find or create somefile.cpp" although it es alread there. E.g. when I open somefile.hpp, or when i use "find declarations" of clangd (via the c/c++ layer of spacemacs) from within somefile.cpp. If I then provide the correct folder it keeps asking me the same but usually opens the file, so I can then switch buffers.

I made a minimal example here: https://github.com/eike-fokken/c--layer-minimal-example.git

In the screenshot directory you can see, what I see right before and after I run "find declarations". There is also my .spacemacs. It seems to be a problem with packing the header files into the ./include directory as the problem goes away when I place the headers in the same directory as the sources.  I could solve the issue by removing the line cmake-enable-cmake-ide-support t from my configuration which I guess removes some features in dealing with CMake files, but I haven't touched many of them recently. So the workaround works for me for now.

In case this is not just some bungled configuration on my side, I'm happy to help debug this, although only starting in August. In case it is just the configuration, please also let me know.

atilaneves commented 3 years ago

I don't have spacemacs and have never used it - it's going to be hard for me to debug this.

eike-fokken commented 3 years ago

Do you have any pointers for me on how I should go about debugging this?

atilaneves commented 3 years ago

Do you have any pointers for me on how I should go about debugging this?

Adding princs or stepping through with a debugger - standard fare, really. Sorry that I don't have anything better.

TooBiased commented 2 years ago

Hi, I have had a similar problem and found a workaround that works for me.

I recently started getting the same open file dialogs whenever I open an .hpp file (I am not using spacemacs). Since, I am mostly working on header only libraries, the hpp files that I am working on actually do not have any cpp files connected to them. Instead I have benchmarks and correctness tests, that include the headers. This had not been a problem when using cmake-ide previously.

A few things I have found out when looking at a backtrace:

My guess is that ff-find-the-other-file should not be interactive. Thus I changed the variable ff-always-try-to-create to nil. This suppresses the dialog to find the .cpp file. In my case this leads to the third option mentioned in the documentation of cide--hdr-legacy (i.e., use all compiler flags), which is probably not the best, but I guess it works in my case.

I am sorry that this is a bit rambly but I was typing this while looking for the solution myself.

sfavazza commented 11 months ago

Hi @TooBiased , thanks for the proposed workaround, I can confirm it works!

For completeness I am attaching a backtrace I got while step-debugging the issue.

@atilaneves , I also use spacemacs, but as you can see in the backtrace there is no special spacemacs-related function interfering with cmake-ide. Maybe ff-always-try-to-create could be set to nil in the cide--hdr-legacy scope? (not lisp expert, I don't know whether possible).

  read-file-name("Find or create calculator-server.h++ in: " #("/docker:setup-capnproto-dev-1:/data/example/c/" 1 7 (ws-butler-chg chg helm-ff-file t) 8 29 (ws-butler-chg chg helm-ff-file t)) "calculator-server.h++" nil nil file-directory-p)
  read-directory-name("Find or create calculator-server.h++ in: " #("/docker:setup-capnproto-dev-1:/data/example/c/" 1 7 (ws-butler-chg chg helm-ff-file t) 8 29 (ws-butler-chg chg helm-ff-file t)) "calculator-server.h++" nil)
  ff-find-the-other-file()
  cide--src-file-for-hdr(#<buffer calculator-server.c++>)
  cide--hdr-legacy(#<hash-table equal 4/65 0x158b7332e0e5> #<buffer calculator-server.c++> nil)
  cide--set-flags-for-hdr-file(#<hash-table equal 4/65 0x158b7332e0e5> #<buffer calculator-server.c++> nil)
  cide--set-flags-for-file(#<hash-table equal 4/65 0x158b7332e0e5> #<buffer calculator-server.c++>)
  (edebug-after (edebug-before 0) 3 (cide--set-flags-for-file (edebug-after 0 1 idb) (edebug-after 0 2 x)))
  (closure ((x . #<buffer calculator-server.c++>) (idb . #<hash-table equal 4/65 0x158b7332e0e5>) cide--semantic-system-include t) nil (edebug-after (edebug-before 0) 3 (cide--set-flags-for-file (edebug-after 0 1 idb) (edebug-after 0 2 x))))()
  edebug-default-enter(edebug-anon14 (#<buffer calculator-server.c++>) (closure ((x . #<buffer calculator-server.c++>) (idb . #<hash-table equal 4/65 0x158b7332e0e5>) cide--semantic-system-include t) nil (edebug-after (edebug-before 0) 3 (cide--set-flags-for-file (edebug-after 0 1 idb) (edebug-after 0 2 x)))))
  edebug-enter(edebug-anon14 (#<buffer calculator-server.c++>) (closure ((x . #<buffer calculator-server.c++>) (idb . #<hash-table equal 4/65 0x158b7332e0e5>) cide--semantic-system-include t) nil (edebug-after (edebug-before 0) 3 (cide--set-flags-for-file (edebug-after 0 1 idb) (edebug-after 0 2 x)))))
  (closure ((idb . #<hash-table equal 4/65 0x158b7332e0e5>) cide--semantic-system-include t) (x) (edebug-enter 'edebug-anon14 (list x) #'(lambda nil (edebug-after (edebug-before 0) 3 (cide--set-flags-for-file (edebug-after 0 1 idb) (edebug-after 0 2 x))))))(#<buffer calculator-server.c++>)
  mapc((closure ((idb . #<hash-table equal 4/65 0x158b7332e0e5>) cide--semantic-system-include t) (x) (edebug-enter 'edebug-anon14 (list x) #'(lambda nil (edebug-after (edebug-before 0) 3 (cide--set-flags-for-file (edebug-after 0 1 idb) (edebug-after 0 2 x)))))) (#<buffer calculator-server.c++> #<killed buffer>))
  (edebug-after (edebug-before 7) 10 (mapc (edebug-after 0 8 set-flags) (edebug-after 0 9 cide--hdr-buffers)))
  (let* ((idb (edebug-after (edebug-before 1) 2 (cide--cdb-json-file-to-idb))) (set-flags #'(lambda (x) (edebug-enter 'edebug-anon14 (list x) #'(lambda nil ...))))) (edebug-after (edebug-before 3) 6 (mapc (edebug-after 0 4 set-flags) (edebug-after 0 5 cide--src-buffers))) (edebug-after (edebug-before 7) 10 (mapc (edebug-after 0 8 set-flags) (edebug-after 0 9 cide--hdr-buffers))) (edebug-after (edebug-before 11) 12 (setq cide--src-buffers nil cide--hdr-buffers nil)) (edebug-after (edebug-before 13) 14 (cide--run-rc)))
  (edebug-after (edebug-before 0) 15 (let* ((idb (edebug-after (edebug-before 1) 2 (cide--cdb-json-file-to-idb))) (set-flags #'(lambda (x) (edebug-enter 'edebug-anon14 (list x) #'...)))) (edebug-after (edebug-before 3) 6 (mapc (edebug-after 0 4 set-flags) (edebug-after 0 5 cide--src-buffers))) (edebug-after (edebug-before 7) 10 (mapc (edebug-after 0 8 set-flags) (edebug-after 0 9 cide--hdr-buffers))) (edebug-after (edebug-before 11) 12 (setq cide--src-buffers nil cide--hdr-buffers nil)) (edebug-after (edebug-before 13) 14 (cide--run-rc))))
  (closure (cide--semantic-system-include t) nil (edebug-after (edebug-before 0) 15 (let* ((idb (edebug-after (edebug-before 1) 2 (cide--cdb-json-file-to-idb))) (set-flags #'(lambda (x) (edebug-enter ... ... ...)))) (edebug-after (edebug-before 3) 6 (mapc (edebug-after 0 4 set-flags) (edebug-after 0 5 cide--src-buffers))) (edebug-after (edebug-before 7) 10 (mapc (edebug-after 0 8 set-flags) (edebug-after 0 9 cide--hdr-buffers))) (edebug-after (edebug-before 11) 12 (setq cide--src-buffers nil cide--hdr-buffers nil)) (edebug-after (edebug-before 13) 14 (cide--run-rc)))))()
  edebug-default-enter(cide--on-cmake-finished nil (closure (cide--semantic-system-include t) nil (edebug-after (edebug-before 0) 15 (let* ((idb (edebug-after (edebug-before 1) 2 (cide--cdb-json-file-to-idb))) (set-flags #'(lambda ... ...))) (edebug-after (edebug-before 3) 6 (mapc (edebug-after 0 4 set-flags) (edebug-after 0 5 cide--src-buffers))) (edebug-after (edebug-before 7) 10 (mapc (edebug-after 0 8 set-flags) (edebug-after 0 9 cide--hdr-buffers))) (edebug-after (edebug-before 11) 12 (setq cide--src-buffers nil cide--hdr-buffers nil)) (edebug-after (edebug-before 13) 14 (cide--run-rc))))))
  edebug-enter(cide--on-cmake-finished nil (closure (cide--semantic-system-include t) nil (edebug-after (edebug-before 0) 15 (let* ((idb (edebug-after (edebug-before 1) 2 (cide--cdb-json-file-to-idb))) (set-flags #'(lambda ... ...))) (edebug-after (edebug-before 3) 6 (mapc (edebug-after 0 4 set-flags) (edebug-after 0 5 cide--src-buffers))) (edebug-after (edebug-before 7) 10 (mapc (edebug-after 0 8 set-flags) (edebug-after 0 9 cide--hdr-buffers))) (edebug-after (edebug-before 11) 12 (setq cide--src-buffers nil cide--hdr-buffers nil)) (edebug-after (edebug-before 13) 14 (cide--run-rc))))))
  cide--on-cmake-finished()