Stiffstream / restinio

Cross-platform, efficient, customizable, and robust asynchronous HTTP(S)/WebSocket server C++ library with the right balance between performance and ease of use
Other
1.15k stars 93 forks source link

Problems with external dependencies #86

Open guteksan opened 4 years ago

guteksan commented 4 years ago

Hi, I am trying to build restinio from sources, using mxx_ru for handling dependencies. So basically, I run these commands:

git clone https://github.com/stiffstream/restinio
cd restinio
mxxruexternals
cd dev
mkdir cmake_build
cd cmake_build
cmake -DCMAKE_INSTALL_PREFIX=target -DRESTINIO_FIND_DEPS=ON -DRESTINIO_SAMPLE=OFF -DRESTINIO_TEST=OFF -DCMAKE_BUILD_TYPE=Release ..
cmake --build . --config Release --target install

cmake failed having not found "unnoficial-http-parser". Shouldn't running this mxxruexternals ensure that all external dependencies for restinio are downloaded? If I run with default values of RESTINIO_SAMPLE and RESTINIO_TEST, cmake fails also on not finding Catch2. I know these are optional dependencies, but my understanding was that mxx_ru will handle them, if necessary.

eao197 commented 4 years ago

Hi!

Don't use -DRESTINIO_FIND_DEPS=ON if you use the acquisition of dependencies by mxxruexternals (or if you download archives like restinio-0.6.5-full.tar.bz2 with all dependencies inside).

The RESTINIO_FIND_DEPS option is for cases when you already have all dependencies installed via some other method (like usage of apt on Ubuntu or pacman on ArchLinux).

guteksan commented 4 years ago

I am planning to build Restinio and create a debian package from it for local distrubution using apt. The documentation says: If it is planned to install RESTinio it is better to build it with -DRESTINIO_FIND_DEPS=ON so that RESTinio dependencies are propagated nicely to targets which depend on RESTinio., and I believe it is what I need, as I want to enclose Restinio with all its dependencies in one debian package, so that upon installation using apt, people can easily use Restinio in their cmake projects with find_package.

eao197 commented 4 years ago

This phrase should tell that if someone is planned to install RESTinio and use it via INCLUDE path, then it's better to install RESTinio's dependencies separately and build RESTinio with -DRESTINIO_FIND_DEPS=ON. In that case, RESTinio will use already installed dependencies that are available via INCLUDE and LIB paths.

RESTinio by itself is a header-only library. The build command for your purposes is necessary only for copying RESTinio's files and making appropriate .cmake-files for find_package. And RESTinio by itself requires just libhttp-parser and libfmt

I think that for the creation of .deb package for RESTinio it's necessary to make a dependency of RESTinio's package from libhttp-parser-dev and libfmt-dev. Then RESTinio should be built with:

But note, that since v.0.6.3 RESTinio requires fmtlib 6.1 or newer.

eao197 commented 4 years ago

Sorry, I forgot about such dependency as Asio :(

guteksan commented 4 years ago

Ok, so I am right that in my case I should not use mxx_ru prior to building Restinio, but install all dependencies manually using apt?

eao197 commented 4 years ago

I am right that in my case I should not use mxx_ru prior to building Restinio, but install all dependencies manually using apt?

Yes.

guteksan commented 4 years ago

Sorry, but I still have problems with dependencies, it is most likely asio.

  1. I installed via apt libasio-dev and libhttp-parser-dev
  2. I built and installed fmt (I will prepare debian package for fmt-dev later)
  3. I built and installed restinio with flags:
    cmake -DRESTINIO_FIND_DEPS=ON -DRESTINIO_INSTALL=ON -DRESTINIO_SAMPLE=OFF -DRESTINIO_TEST=OFF -DRESTINIO_BENCH=OFF -DRESTINIO_USE_EXTERNAL_HTTP_PARSER=ON -DRESTINIO_ALLOW_SOBJECTIZER=OFF -DCMAKE_PREFIX_PATH=/home/guteksan/libs -DCMAKE_INSTALL_PREFIX=/home/guteksan/libs -DCMAKE_BUILD_TYPE=Release ..
  4. I have created a CMakeLists.txt for my project using restinio:
    
    project(restinio-test)
    find_package(fmt REQUIRED)
    find_package(restinio REQUIRED)
    ...
    add_executable(restinio-test ${SRC})

target_link_libraries(restinio-test PRIVATE restinio::restinio fmt::fmt-header-only )

5. Cmake configuration runs fine, but building produces many errors, like:

/home/guteksan/libs/include/restinio/http_headers.hpp: In function \u2018constexpr restinio::http_method_id_t restinio::http_method_bind()\u2019: /home/guteksan/libs/include/restinio/http_headers.hpp:1536:2: error: \u2018HTTP_BIND\u2019 was not declared in this scope RESTINIO_HTTP_METHOD_MAP( RESTINIO_HTTP_METHOD_FUNC_GEN )


Apparently, dependency to Asio should be added, but target ```asio``` is not available through ```find_package()``` - I thought that this is what ```-DRESTINIO_FIND_DEPS=ON``` is for. I noticed that installing ```libasio-dev``` does not install any cmake config file for it. How should I add dependency to asio then?
eao197 commented 4 years ago

@guteksan can you provide information about your environment (OS, compiler version, versions of libasio-dev and libhttp-parser-dev)? Or maybe you can provide a Dockerfile with your build commands inside so I can reproduce your steps in my Kubuntu?

guteksan commented 4 years ago

restinio-test-docker.zip Hi, I have prepared the dockerfile together with a minimalistic project to reproduce the problem. Please unzip these files and run `docker build .'

eao197 commented 4 years ago

It seems that libhttp-parser-dev for ubuntu-16.04 contains http-parser v.2.1. There are no many HTTP methods that were added to http-parser at v.2.6. Like HTTP_BIND, HTTP_REBIND, HTTP_UNBIND.

We have started the development of RESTinio with http-parser v.2.7.1.

So I don't know how to make RESTinio work with such old versions of http-parser as v.2.1, v.2.2 and so on.

raychaudhuri-amitava commented 1 year ago

Can someone tell me where is mxxruexternals command?

eao197 commented 1 year ago

If you install Mxx_ru gem via:

gem install Mxx_ru

then mxxruexternals has to be added to your PATH automatically. On some platforms (like Archlinux, IIRC) that isn't the case and you have to modify your PATH manually:

export GEM_HOME="$(ruby -e 'puts Gem.user_dir')"
export PATH="PATH:$GEM_HOME"

NOTE: Mxx_ru is a gem (package) for RubyGems and RubyGems is package manager for Ruby language.