facebook/fbthrift

Cannot build the chatroom example (the headers are not installed in one place)

ybesh opened this issue · 0 comments

ybesh commented

Hello,
I tried to build the chatroom example in C++ on M1 MacOS and got into a problem with resolving include paths.

How I built fbthrift

Following the top-level README, I built fbthrift with a custom --scratch-path.

./build/fbcode_builder/getdeps.py install-system-deps --recursive fbthrift
./build/fbcode_builder/getdeps.py --allow-system-packages build --scratch-path=/my/custom/path

What I tried to build

I created CMakeLists.txt based off the one in the repo (some changes made to fix minor errors which probably should be discussed in a separate issue), and still it won't build because of unresolved include paths.

# Changes I made are marked with <<<.

include(ThriftLibrary.cmake) # <<< ThriftLibrary.cmake copied to the same dir

set(EXAMPLE_IF_HOME ${CMAKE_CURRENT_SOURCE_DIR}) 

# Example to test linking
thrift_library(
  "chatroom" #file_name
  "ChatRoomService;Echo" #services
  "cpp2" #language
  "" #options
  "${EXAMPLE_IF_HOME}" #file_path
  "${CMAKE_CURRENT_BINARY_DIR}" #output_path # <<<
  ".." #include_prefix # <<<
)

Invoking cmake with the above file, I got an error complaining:

In file included from /path/to/fbthrift/thrift/example/build/if/gen-cpp2/chatroom_data.cpp:8:
/path/to/fbthrift/thrift/example/build/if/gen-cpp2/../gen-cpp2/chatroom_data.h:9:10: fatal error: 'thrift/lib/cpp2/gen/module_data_h.h' file not found
#include <thrift/lib/cpp2/gen/module_data_h.h>
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
make[2]: *** [if/CMakeFiles/chatroom-cpp2-obj.dir/gen-cpp2/chatroom_data.o] Error 1
make[1]: *** [if/CMakeFiles/chatroom-cpp2-obj.dir/all] Error 2
make: *** [all] Error 2

This could be resolved by adding lines of include_directories(), but this is a significant amount of manual work (which I have not tried), because the include/ directories in /my/custom/path/installed/ are installed like:

installed/fbthrift/include/
installed/folly/include/
installed/another_dep/include/
...

rather than

installed/include/fbthrift/
installed/include/folly/
installed/include/another_dep/
...

which I was expecting (in which case only one include_directories() is needed).

Have I done anything wrong in the build process?