
рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрд░реЛрдорд┐рдпрдо рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЖрдзрд╛рд░ рд╣реИред рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рддрдХ, рдореИрдВрдиреЗ рднреА рдРрд╕рд╛ рд╕реЛрдЪрд╛ рдерд╛, рд▓реЗрдХрд┐рди, рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрдХ рдФрд░ рдЕрджреНрднреБрдд рджреБрдирд┐рдпрд╛ рдХреА рдЦреЛрдЬ рд╢реБрд░реВ рд╣реБрдИред рдХреНрд░реЛрдорд┐рдпрдо рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рд╣реИ: рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдгрд╛рд▓реА, рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо рдФрд░ рд▓рдЧрднрдЧ рд╕рднреА рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдШрдЯрдХред рддреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЗрд╕ рд╕рд╛рд░реА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ?
рдХреИрд╕реЗ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЧрд╛рдЗрдб рдХреЗрдд рдХреЗ рддрд╣рддред
рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рддреИрдпрд╛рд░реА
рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЙрдмрдВрдЯреВ 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/ ред рдПрдХ "рдЙрддреНрддрд░" рдмрдЯрди рднреА рд╣реИред