
рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрд░реЛрдорд┐рдпрдо рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЖрдзрд╛рд░ рд╣реИред рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рддрдХ, рдореИрдВрдиреЗ рднреА рдРрд╕рд╛ рд╕реЛрдЪрд╛ рдерд╛, рд▓реЗрдХрд┐рди, рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрдХ рдФрд░ рдЕрджреНрднреБрдд рджреБрдирд┐рдпрд╛ рдХреА рдЦреЛрдЬ рд╢реБрд░реВ рд╣реБрдИред рдХреНрд░реЛрдорд┐рдпрдо рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рд╣реИ: рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдгрд╛рд▓реА, рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо рдФрд░ рд▓рдЧрднрдЧ рд╕рднреА рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдШрдЯрдХред рддреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЗрд╕ рд╕рд╛рд░реА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ?
рдХреИрд╕реЗ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЧрд╛рдЗрдб рдХреЗрдд рдХреЗ рддрд╣рддред
рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рддреИрдпрд╛рд░реА
рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЙрдмрдВрдЯреВ 18.04 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдЕрдиреНрдп рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ:
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░рдгреЛрдВ рдореЗрдВ Git рдФрд░ Python рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рд╡реЗ рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
sudo apt install git python
рдбрд┐рдкреЛ_рдЯреВрд▓ рд╕реЗрдЯ рдХрд░рдирд╛
depot_tools
рдХреНрд░реЛрдорд┐рдпрдо рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдЯреВрд▓рдХрд┐рдЯ рд╣реИред рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
рдФрд░ рдкрде рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рдкрде рдЬреЛрдбрд╝реЗрдВ:
export PATH="$PATH:/path/to/depot_tools"
рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдЕрдЧрд░ рдЖрдкрдХреЗ рдШрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ
depot_tools
рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдереЗ, рддреЛ
PATH
рдЪрд░ рдореЗрдВ
~
рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЖрдкрдХреЛ
$HOME
рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
export PATH="$PATH:${HOME}/depot_tools"
рдХреЛрдб рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣реЛрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ (рд▓рдЧрднрдЧ 30 рдЬреАрдмреА рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ):
mkdir ~/chromium && cd ~/chromium
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк
depot_tools
рд╕реЗ
depot_tools
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
fetch --nohooks --no-history chromium
рдЕрдм рдЖрдк рдЪрд╛рдп / рдХреЙрдлреА рдХреЗ рд▓рд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддреЗрдЬ рдирд╣реАрдВ рд╣реИред рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдЗрддрд┐рд╣рд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП
--no-history
рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд╣рд╛рдиреА рдФрд░ рднреА рд▓рдВрдмреА рд╣реЛрдЧреАред
рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрдирд╛
рд╕рднреА рд╕реНрд░реЛрдд
src
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдЬрд╛рдПрдВ:
cd src
рдЕрдм рдЖрдкрдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдбрд╛рд▓рдиреА рд╣реЛрдВрдЧреА:
./build/install-build-deps.sh
рдФрд░ рд╣реБрдХ рдЪрд▓рд╛рдПрдВ:
gclient runhooks
рдЗрд╕рд╕реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рддреИрдпрд╛рд░реА рдкреВрд░реА рд╣реЛрддреА рд╣реИред
рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдПрдВ
рдХреНрд░реЛрдорд┐рдпрдо рдХреЗ рд▓рд┐рдП
рдирд┐рдВрдЬрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░
GN рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ
.ninja
рдлрд╛рдЗрд▓реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрди рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
src
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ
example
рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ:
mkdir example
рдлрд┐рд░,
src/example
folder рдореЗрдВ,
BUILD.gn
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
executable("example") { sources = [ "example.cc", ] }
BUILD.gn
рдореЗрдВ рдПрдХ рд▓рдХреНрд╖реНрдп (
example
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп) рдФрд░ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд▓рдХреНрд╖реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛ рдХрджрдо
example.cc
рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрд╡рдпрдВ рдмрдирд╛рдирд╛ рд╣реИред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ:
#include <iostream> int main(int argc, char **argv) { std::cout << "Hello world" << std::endl; return 0; }
рд╕реНрд░реЛрдд рдХреЛрдб
GitHub рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП GN,
src
рдореЗрдВ рд╕реНрдерд┐рдд
BUILD.gn
рдлрд╛рдЗрд▓ рдореЗрдВ,
BUILD.gn
рд╕реЗрдХреНрд╢рди рдореЗрдВ рд▓рд╛рдЗрди
"//example"
рдЬреЛрдбрд╝реЗрдВ:
... group("gn_all") { testonly = true deps = [ ":gn_visibility", "//base:base_perftests", "//base:base_unittests", "//base/util:base_util_unittests", "//chrome/installer", "//chrome/updater", "//net:net_unittests", "//services:services_unittests", "//services/service_manager/public/cpp", "//skia:skia_unittests", "//sql:sql_unittests", "//third_party/flatbuffers:flatbuffers_unittests", "//tools/binary_size:binary_size_trybot_py", "//tools/ipc_fuzzer:ipc_fuzzer_all", "//tools/metrics:metrics_metadata", "//ui/base:ui_base_unittests", "//ui/gfx:gfx_unittests", "//url:url_unittests", # тЖУтЖУтЖУтЖУтЖУтЖУтЖУтЖУ "//example", ] ...
рдЕрдм рдЖрдкрдХреЛ
src
рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓реМрдЯрдиреЗ рдФрд░ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
gn gen out/Default
GN рдЖрдкрдХреЛ рд╕рдорд░реНрдерд┐рдд рдЖрдИрдбреАрдИ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
- рдЧреНрд░рд╣рдг
- рдмрдирд╛рдо
- vs2013
- vs2015
- vs2017
- vs2019
- xcode
- qtcreator
- json
рдЖрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
gn help gen
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
QtCreator рдореЗрдВ
example
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ
example
, рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
gn gen --ide=qtcreator --root-target=example out/Default
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк QtCreator рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
qtcreator out/Default/qtcreator_project/all.creator
рдЕрдВрддрд┐рдо рдХрджрдо рдирд┐рдВрдЬрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реИ:
autoninja -C out/Default example
рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп рдкреВрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
./out/Default/example
рдФрд░ рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛ рдХреЛ рджреЗрдЦреЗрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдХреНрд░реЛрдорд┐рдпрдо рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдПрдХ рднреА рдирд╣реАрдВред
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдХреНрд░реЛрдорд┐рдпрдо рдХреЛрдб рдмреЗрд╕ рдХреЛ рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред
рдХрд╛рд░реНрдп:
рдХреНрд░реЛрдорд┐рдпрдо рд╢реИрд▓реА рдореЗрдВ рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рд╕рднреА рддрд░реНрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВредрдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ example.cc рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
рдФрд░ рд╣рдореЗрдВ
BUILD.gn
рдореЗрдВ
base
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝рдирд╛ рднреА рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
BUILD.gn
рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
executable("example") { sources = [ "example.cc", ] deps = [ "//base", ] }
рдЕрдм рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬрд╝
example
рдЬреБрдбрд╝реА рд╣реЛрдЧреАред
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд░реЛрдорд┐рдпрдо рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди
base::CommandLine
рдХрдорд╛рдВрдбрд▓рд╛рдЗрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд▓рд┐рдВрдХ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдереИрддрд┐рдХ
base::CommandLine::ForCurrentProcess
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
base::CommandLine::ForCurrentProcess
, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЖрдкрдХреЛ
base::CommandLine::Init
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
base::CommandLine::Init
рд╡рд┐рдзрд┐:
base::CommandLine::Init(argc, argv); auto *cmd_line = base::CommandLine::ForCurrentProcess();
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рддрд░реНрдХ
base::SwitchMap
рд░реВрдк
-
рд▓реМрдЯрд╛рдП
-
base::SwitchMap
GetSwitches
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
GetSwitches
(рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ
map<string, string>
)ред рдЕрдиреНрдп рд╕рднреА рддрд░реНрдХ
base::StringVector
рд░реВрдк рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ
base::StringVector
(рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ
vectr<strig>
)ред рдпрд╣ рдЬреНрдЮрд╛рди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
for (const auto &sw : cmd_line->GetSwitches()) { std::cout << "Switch " << sw.first << ": " << sw.second << std::endl; } for (const auto &arg: cmd_line->GetArgs()) { std::cout << "Arg " << arg << std::endl; }
рдкреВрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг
GitHub рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
autoninja -C out/Default example ./out/Default/example arg1 --sw1=val1 --sw2 arg2
рд╕реНрдХреНрд░реАрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛:
Switch sw1: val1 Switch sw2: Arg arg1 Arg arg2
рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ
рдЖрдЬ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рдФрд░ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдХреНрд░реЛрдорд┐рдпрдо рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рднрд╛рдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред
рдХрд╛рд░реНрдп:
рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдпреВрдЖрд░рдПрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ ред
рдХреНрд░реЛрдорд┐рдпрдо рдиреЗрдЯрд╡рд░реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо
рдиреЗрдЯрд╡рд░реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХрд╛рдлреА рдмрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рд╣реИред HTTP, HTTPS, FTP рдФрд░ рдЕрдиреНрдп рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ
URLRequest
, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдПрдХ рд╕рд░рд▓ рдЖрд░реЗрдЦ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредURLRequest
рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
URLRequest
рдЖрдкрдХреЛ
URLRequestContext
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╕рдВрджрд░реНрдн рдмрдирд╛рдирд╛ рдПрдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП
URLRequestContextBuilder
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЪрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
net::URLRequestContextBuilder context_builder; context_builder.DisableHttpCache(); context_builder.SetSpdyAndQuicEnabled(true , false ); context_builder.SetCookieStore(nullptr);
рдмрд╣реБ рд╕реВрддреНрд░рдг
рдХреНрд░реЛрдорд┐рдпрдо рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдЯреИрдХ рдХреЛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдЫреЛрдбрд╝ рдирд╣реАрдВ рд╕рдХрддреЗред рдХреНрд░реЛрдорд┐рдпрдо рдореЗрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдореВрд▓ рд╡рд╕реНрддреБрдПрдБ рд╣реИрдВ:
- рдЯрд╛рд╕реНрдХ - рдХреНрд░реЛрдорд┐рдпрдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп, рдпрд╣
base::Callback
рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ base::Callback
, рдЬреЛ base::Bind
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рдХрд╛рд░реНрдп рдХрддрд╛рд░ - рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрддрд╛рд░ред
- рднреМрддрд┐рдХ рдзрд╛рдЧрд╛ - рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдереНрд░реЗрдб рдкрд░ рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЖрд╡рд░рдг (
pthread
рдкрд░ POSIX рдпрд╛ CreateThread()
рдкрд░ pthread
)ред base::PlatformThread
рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ base::PlatformThread
рдХреНрд▓рд╛рд╕, рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред
- рдЖрдзрд╛рд░ :: рдереНрд░реЗрдб - рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдзрд╛рдЧрд╛ рдЬреЛ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдХрд╛рд░реНрдп рдХрддрд╛рд░ рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЕрдВрддрд╣реАрди рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ; рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред
- рдереНрд░реЗрдб рдкреВрд▓ - рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рдереНрд░реЗрдб рдкреВрд▓ред
base::ThreadPool
рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ base::ThreadPool
рд╡рд░реНрдЧред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВред base/task/post_task.h
рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХрд╛рд░реНрдп рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЕрдиреБрдХреНрд░рдо рдпрд╛ рдЖрднрд╛рд╕реА рдзрд╛рдЧрд╛ - рдПрдХ рдЖрднрд╛рд╕реА рдзрд╛рдЧрд╛ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдзрд╛рдЧреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
- рдЯрд╛рд╕реНрдХ рд░рдирд░ - рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕,
base::TaskRunner
рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ base::TaskRunner
ред
- рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд╛рд░реНрдп рдзрд╛рд╡рдХ - рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдЬреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдкрд╣реБрдВрдЪреЗ рдереЗред
base::SequencedTaskRunner
рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ base::SequencedTaskRunner
рд╡рд░реНрдЧред
- рд╕рд┐рдВрдЧрд▓-рдереНрд░реЗрдб рдЯрд╛рд╕реНрдХ рд░рдирд░ - рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдХрд╛рд░реНрдп рдПрдХ рдУрдПрд╕ рдереНрд░реЗрдб рдореЗрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
base::SingleThreadTaskRunner
рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ base::SingleThreadTaskRunner
ред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдХреБрдЫ рдХреНрд░реЛрдорд┐рдпрдо рдШрдЯрдХреЛрдВ рдХреЛ
base::AtExitManager
рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
base::AtExitManager
- рдпрд╣ рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрд╡реЗрджрди рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЖрдкрдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
base::AtExitManager exit_manager;
рдЬрдм
exit_manager
рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рдкрдВрдЬреАрдХреГрдд рдХреЙрд▓рдмреИрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред
рдЕрдм рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдШрдЯрдХреЛрдВ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдЯрд╛рдЗрдк рдХрд░реЗрдВ
Message loop
рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВ
TYPE_IO
рдФрд░ рдореБрдЦреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реВрдк -
Run loop
рд▓реВрдк:
base::ThreadPool::CreateAndStartWithDefaultParams("downloader"); base::MessageLoop msg_loop(base::MessageLoop::TYPE_IO); base::RunLoop run_loop;
рдЕрдЧрд▓рд╛,
Context builder
рд▓рд┐рдП
Context builder
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
auto ctx = net::URLRequestContextBuilder().Build();
рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
ctx
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА
CreateRequest
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
CreateRequest
рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
- рдпреВрдЖрд░рдПрд▓, рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░рд┐рдВрдЧ GURL;
- рдкреНрд░рд╛рдердорд┐рдХрддрд╛;
- рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЬреЛ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред
рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ
net::URLRequest::Delegate
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ
net::URLRequest::Delegate
рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
class MyDelegate : public net::URLRequest::Delegate { public: explicit MyDelegate(base::Closure quit_closure) : quit_closure_(std::move(quit_closure)), buf_(base::MakeRefCounted<net::IOBuffer>(BUF_SZ)) {} void OnReceivedRedirect(net::URLRequest *request, const net::RedirectInfo &redirect_info, bool *defer_redirect) override { std::cerr << "redirect to " << redirect_info.new_url << std::endl; } void OnAuthRequired(net::URLRequest* request, const net::AuthChallengeInfo& auth_info) override { std::cerr << "auth req" << std::endl; } void OnCertificateRequested(net::URLRequest *request, net::SSLCertRequestInfo *cert_request_info) override { std::cerr << "cert req" << std::endl; } void OnSSLCertificateError(net::URLRequest* request, int net_error, const net::SSLInfo& ssl_info, bool fatal) override { std::cerr << "cert err" << std::endl; } void OnResponseStarted(net::URLRequest *request, int net_error) override { std::cerr << "resp started" << std::endl; while (true) { auto n = request->Read(buf_.get(), BUF_SZ); std::cerr << "resp read " << n << std::endl; if (n == net::ERR_IO_PENDING) return; if (n <= 0) { OnReadCompleted(request, n); return; } std::cout << std::string(buf_->data(), n) << std::endl; } } void OnReadCompleted(net::URLRequest *request, int bytes_read) override { std::cerr << "completed" << std::endl; quit_closure_.Run(); } private: base::Closure quit_closure_; scoped_refptr<net::IOBuffer> buf_; };
рд╕рднреА рдореБрдЦреНрдп рддрд░реНрдХ
OnResponseStarted
рдИрд╡реЗрдВрдЯ
OnResponseStarted
: рдЬрдм рддрдХ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдпрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рддрдм рддрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдЖрд╡реЗрджрди рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рдкрд╛рд╕ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдореБрдЦреНрдп
Run loop
рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ
base::Closure
рдХрд╛ рдПрдХ рдХреЙрд▓
base::Closure
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рд╕рдм рдХреБрдЫ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ:
MyDelegate delegate(run_loop.QuitClosure()); auto req = ctx->CreateRequest(GURL(args[0]), net::RequestPriority::DEFAULT_PRIORITY, &delegate); req->Start();
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
Run loop
рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
run_loop.Run();
рдкреВрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг
GitHub рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
autoninja -C out/Default example out/Default/example "https://example.com/"
рдЕрдиреНрдд
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрд░реЛрдорд┐рдпрдо рдореЗрдВ рдЖрдк рдХрдИ рдЙрдкрдпреЛрдЧреА рдХреНрдпреВрдмреНрд╕ рдФрд░ рдИрдВрдЯреЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдПрдХ рддрд░рдл, рдПрдХ рдкреНрд▓рд╕ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рддрд░рдл, рдПрдкреАрдЖрдИ рдореЗрдВ рдирд┐рдпрдорд┐рдд рдмрджрд▓рд╛рд╡ рдЖрдкрдХреЛ рдЖрд░рд╛рдо рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд╡реАрдирддрдо рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ,
base::TaskScheduler
рдХреЛ
base::ThreadPool
рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛
base::TaskScheduler
, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдкреАрдЖрдИ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ред
рдкреБрдирд╢реНрдЪ рд╣рдо рдЕрдкрдиреА рдЯреАрдо рдореЗрдВ рдПрдХ рдкреНрд░рдореБрдЦ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ! рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рддрд╛рдХрдд рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реА рдЗрдЪреНрдЫрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
team.mail.ru/vacancy/4641/ ред рдПрдХ "рдЙрддреНрддрд░" рдмрдЯрди рднреА рд╣реИред