ããããããå
¬åŒããã¥ã¡ã³ãïŒ
Chromium Wiki ïŒã«å ããŠããœãŒã¹ã³ãŒããååŸããŠChromiumãããžã§ã¯ãããã«ãããæ¹æ³ã«é¢ããèšäºããããŸãïŒ
äŸ ïŒã
ãã®ã³ãŒãã«åºã¥ããŠãè€æ°ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšã¢ãŒããã¯ãã£ã§ã³ã³ãã€ã«ããã³å®è¡ã§ããC ++ã¢ããªã±ãŒã·ã§ã³ãäœæããæ¹æ³ã«ã€ããŠã話ããããã£ãã®ã§ãã ãã¡ããããã®ç®çã®ããã«
Qtã
boostãªã©ã®ã©ã€ãã©ãªãæ¢ã«ååšããŸãã ãããããã®èšäºã§ãç°åžžãªããã°ã©ãã³ã°ããšããã»ã¯ã·ã§ã³ãåç
§ããŠããã®ã¯ãã¯ãã¹ãã©ãããã©ãŒã ã¢ããªã±ãŒã·ã§ã³ã®åºç€ãšããŠChromiumã³ãŒããçå£ã«èããŠãã人ãããªãããã§ãã
ãã ããèããŠã¿ããšãããã¯éåžžã«å¯èœã§ãããéåžžã«é£ããããšã§ããªãããšãæããã«ãªããŸãã
çµå±ã®ãšãããChromiumãããžã§ã¯ãã«ã¯ãã«ãã·ã¹ãã ãããããã®å©ãã«ãããããžã§ã¯ãèªäœãšãã¹ãŠãçµã¿ç«ãŠãããŸãã
å¿
èŠãªäŸåé¢ä¿ã
boringssl ã
ffmpeg ã
freetype2 ã
hunspell ã
ICU ã
jsoncpp ã
libjpeg ãlibxmlã
openh264 ã
protobuf ã
gtest ã
sqliteãªã©ã®
ã©ã€ãã©ãª ããããŠãã¡ãã
v8㯠ã䜿çšã®ããã«é
ä¿¡ãæŽæ°ãããç°¡åã«æ¥ç¶ãããŸãã
ChromiumããŒã ã¯ããã®ã³ã°ãæååãåœéåãã¢ããªã±ãŒã·ã§ã³ãªãœãŒã¹ïŒæååãç»åããã€ããªããŒã¿ïŒã®æäœããããã¯ãŒã¯ãšãã¡ã€ã«ã®æäœã3Dãå«ãã°ã©ãã£ãã¯ãIPCãããã€ãã®ãã©ãããã©ãŒã ã®UIãã¬ãŒã ã¯ãŒã¯ãªã©ã®ã³ã³ããŒãã³ããäœæããŸãããŸã ã ããã¯ãã¹ãŠãããã©ãŒãã³ã¹ãã¹ããå«ãå€æ°ã®ïŒ100ããŒã»ã³ãã§ã¯ãªããïŒãã¹ãã«ãã£ãŠã«ããŒãããŠããŸãã
ç§ã¯ããããããªããç¥ã£ãŠããã©ã®ã©ã€ãã©ãªãããåªããŠããããšãããéãããã䟿å©ã§ããããšããŸãã¯åã«ããªãã®ã«ã«ãããããã«ããããšã蚌æããããšããŠããã®ã§ã¯ãªãããšã«æ³šæããŸãã ããããããã¯åãªãå®éšã§ãããããçšåºŠãçŸä»£ã®ãã©ãŠã¶ã®ãããªè€éã§å€§èŠæš¡ãªãããžã§ã¯ãã®æ§æã«é¢ããã¹ããŒãªãŒã§ãã
ããã§
ãChromiumããŒã¹ã©ã€ãã©ãªã®äžéšã®ãšã³ãã£ãã£ã®æäœã瀺ãå°ããªã¢ããªã±ãŒã·ã§ã³ãäœæããæ¹æ³ã瀺ãããšã«ããŸããã
ãã®è³æãèå³æ·±ããšæãããå Žåã¯ããããã¯ãŒã¯ãã°ã©ãã£ãã¯ã¹ãUIãªã©ã䜿çšããäœæ¥ããã詳现ã«åæããããšãã§ããŸãã ããã¯Chromiumã®æ¢åã®APIãžã®åç
§ã§ã¯ãªããã»ãšãã©ãã¹ãŠã®ããã°ã©ã ã§å¿
èŠãªåºæ¬çãªãã®ãæäœããæ¹æ³ã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã§ãã
ã³ãŒãããŒã¹ã¯çµ¶ããå€åããŠãããäžéšã®éšåã¯ããå€åãããããäžéšã®å€åã¯å°ãªãããšãèæ
®ããå¿
èŠããããŸãã ããã¯ãŸã åºå®ãããªãã¯APIã§ã¯ãããŸããã
ã³ãŒããããŠã³ããŒãããŠç°å¢ãæ§æããæ¹æ³ã«ã€ããŠã¯è©³ãã説æããŸãããããã«ã€ããŠã¯ãæäŸãããŠãããªã³ã¯ã®èšäºã§è©³ãã説æããŠããŸãã $ PATHã«depot_toolsããã§ã«ããïŒgnããã³ninjaãŠãŒãã£ãªãã£ãå¿
èŠïŒããœãŒã¹ã³ãŒããåä¿¡ãããchromium /ãã£ã¬ã¯ããªã§ã®ã¢ã»ã³ããªã®æºåãã§ããŠãããšä»®å®ããŸãã å°ãªããšãæåã®æ®µéã§ã¯ãChromiumãããžã§ã¯ãå
šäœãæ§ç¯ããå¿
èŠã¯ãããŸããã
Chromium / srcã«ã¢ããªã±ãŒã·ã§ã³ã®ãã£ã¬ã¯ããªsample_appãšsample_app / srcãäœæããŸãã
ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯sample_app / srcã«é
眮ãããçŸåšã®ãã£ã¬ã¯ããªchromium / src / sample_appã«é¢é£ãããã¹ãŠã®ã³ãã³ããæäŸããŸãã
èšäºãããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒããäžåºŠã«ååŸããã«ã¯ããªããžããª
https://github.com/dreamer-dead/chromium-sample-app.gitãè€è£œã§ã
ãŸã$ pwd /Users/username/chromium/src $ git clone https://github.com/dreamer-dead/chromium-sample-app.git sample_app $ cd sample_app/
ã¢ããªã±ãŒã·ã§ã³ã®ãšã³ããªãã€ã³ããšãã«ãã·ã¹ãã ã®åºæ¬æ§æããå§ããŸãããã
src / sample_app.cc int main() { return 0; }
src / BUILD.gn # SampleApp executable("sample_app") { output_name = "sample_app" sources = [ "sample_app.cc", ] }
Chromiumã¯
GYPã
GNãªã©ã®ããŒã«ã䜿çšããŠããããžã§ã¯ãã®æ§ç¯ã«å¿
èŠãªæé ã説æãã
å¿è
ãã¡ã€ã«ãçæããŸãã GNã¯ãå¿è
ãã¡ã€ã«ãžã§ãã¬ãŒã¿ãŒã®éçºã«ããã次ã®æ®µéã§ãããPythonã®ä»£ããã«C ++ã§èšè¿°ãããGYPãããã¯ããã«é«éã§ããããã®æ§æã¯ãã人éã«åªãããã®ã§ãã çŸæç¹ã§ã¯Chromiumã¯GYPã䜿çšããã¢ã»ã³ããªããµããŒãããŠããŸãããããã䜿çšããŸãã
build config sample_app / src / BUILD.gnã§ãã¿ãŒã²ããã®ååãå®è¡å¯èœãã¡ã€ã«ã®æçµåãèšå®ãããœãŒã¹ã³ãŒããšãšãã«ãã¡ã€ã«ããªã¹ãããŸãã ããªãæ確ã«èŠããŸãããïŒ
ãã¹ãŠã®å°ããªæ§æãã¡ã€ã«ã¯æ確ã«èŠããŸãããå°ãªããšãCMakeãå°ãªããšãMakefileã§ãã
GNããããžã§ã¯ãã®æ§æã確èªããã«ã¯ãã«ãŒããã¡ã€ã«chrome / src / BUILD.gnã§åç
§ãããã®ãããªããããé©çšããå¿
èŠããããŸã
ã«ãŒããããBUILD.gnã®å·®åsrc / root_BUILD_gn.patch diff --git a/BUILD.gn b/BUILD.gn index 0fa2013..729157d 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -906,3 +906,7 @@ template("assert_valid_out_dir") { assert_valid_out_dir("_unused") { actual_sources = [ "$root_build_dir/foo" ] } + +group("sample_app") { + deps = [ "//sample_app/src:sample_app" ] +}
ãªããžããªã®ãã§ãã¯ã¢ãŠããè¡ãããå Žåãã³ãã³ããå®è¡ã§ããŸã
$ (cd .. && git apply sample_app/src/root_BUILD_gn.patch)
ã¿ãŒã²ãããäžè¬çãªãã«ãæ§æã«è¿œå ããåŸãã¢ããªã±ãŒã·ã§ã³ããã«ãã§ããŸãã
$ gn gen --args=is_debug=true --root=../ ../out/gn $ ninja -C ../out/gn sample_app
ãããã£ãŠããããã°ã¢ã»ã³ããªãæ§ç¯ããCroom / src / out / gn /ãã£ã¬ã¯ããªã«ninjaã¢ã»ã³ããªãã¡ã€ã«ãçæããroot build configãchroma / src /ã«ããããšã瀺ããŸããã
ã³ã³ãœãŒã«åºåãã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããŠãå°ãªããšãC ++æšæºã©ã€ãã©ãªãå©çšã§ããããšã瀺ããŸãããã
src / sample_app.cc #include <iostream> #include <string> int main(int argc, const char* argv[]) { std::cout << "Hello from SampleApp!" << std::endl; return 0; }
ãã«ãã³ãã³ããç¹°ãè¿ããŠã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãæšæ¶ã衚瀺ãããŸãã
$ ninja -C ../out/gn sample_app $ ../out/gn/sample_app Hello from SampleApp!
ã¢ããªã±ãŒã·ã§ã³ã®åºæ¬ã¯ã©ã¹ã®1ã€ã¯æååã§ãã Chromiumã¯ãC ++ã©ã€ãã©ãªã®æååã¯ã©ã¹std :: basic_string <>ã䜿çšããUTF16æååïŒ
base :: string16 ãããã¯std :: basic_stringã®typedefã§ãïŒããã³è»œéæååãã¥ãŒã¯ã©ã¹
base :: StringPieceã䜿çšããŸãã
æååãšç°ãªããšã³ã³ãŒãã£ã³ã°éã®å€æã䜿çšããŠã¿ãŸãããã
src / sample_app.cc #include <iostream> #include <string> #include "base/strings/utf_string_conversions.h" namespace { void StringsSample() { std::cout << base::WideToUTF8(L"This is a wide string.") << std::endl; std::wcout << base::UTF8ToWide("This is an UTF8 string.") << std::endl; std::cout << base::UTF16ToUTF8(base::UTF8ToUTF16( "This is an UTF8 string converted to UTF16 and back.")) << std::endl; } }
src / BUILD.gn executable("sample_app") { output_name = "sample_app" sources = [ "sample_app.cc", ] deps = [ "//base" ] }
BUILD.gnã«å¿
èŠãª
//base
ã¿ãŒã²ãããžã®äŸåé¢ä¿ãè¿œå ããå¿
èŠãªæ©èœã䜿çšããããšãã§ããŸããã
ã芧ã®ãšãããè€éãªããšã¯äœããããŸãããã
ICUã©ã€ãã©ãªãŒã¯ãè¿œå ã®ã¢ã¯ã·ã§ã³ãªãã§å©çšã§ããå
éšã®ãã¹ãŠã®äœæ¥ãæ
åœããŸãã
ãã«ãã³ãã³ãã¯å€æŽãããŸãããã
$ ninja -C ../out/gn sample_app
Ngnjaã¯ã.gnæ§æãå€æŽãããšãã¡ã€ã«ãèªåçã«åæ§ç¯ããŸãã
è¡ãããã¢ããªã±ãŒã·ã§ã³ãšãã®åæã®ã³ãã³ãã©ã€ã³ã«ç§»åã§ããŸãã
src / baseã®ãã¹ãŠã®ã¯ã©ã¹ã³ãŒãã¯ãChromiumããŒã ã®ããŒãºã«åãããŠäœæãããŠããããšã«æ³šæããŠãã ããã æ©èœããŸã£ãããªãããŸãã¯ãã®éã§ãéå°ãªã³ãŒããèšè¿°ãããŠããããšãå¥åŠã«æããå Žåã¯ããããèæ
®ããŠãã ããã
src / sample_app.cc #include "base/command_line.h" #include "base/files/file_path.h" #include "base/logging.h" void CommandLineSample() { using base::CommandLine; DCHECK(CommandLine::ForCurrentProcess()) << "Command line for process wasn't initialized."; const CommandLine& command_line = *CommandLine::ForCurrentProcess(); std::cout << "Application program name is " << command_line.GetProgram().AsUTF8Unsafe() << std::endl; if (command_line.HasSwitch("bool-switch")) { std::cout << "Detected a boolean switch!" << std::endl; } std::string string_switch = command_line.GetSwitchValueASCII("string-switch"); if (!string_switch.empty()) { std::cout << "Got a string switch value: " << string_switch << std::endl; } } int main(int argc, const char* argv[]) { CHECK(base::CommandLine::Init(argc, argv)) << "Failed to parse a command line argument."; std::cout << "Hello from SampleApp!" << std::endl; StringsSample(); CommandLineSample(); return 0; }
ããŒã䜿çšããŠã¢ã»ã³ãã«ãããããã°ã©ã ãå®è¡ããåºåã確èªã§ããŸãã
ç°ãªãã³ãã³ãã©ã€ã³ã¹ã€ããã§å®è¡ãã $ ninja -C ../out/gn sample_app $ ../out/gn/sample_app --bool-switch --string-switch=SOME_VALUE Hello from SampleApp! This is a wide string. This is an UTF8 string. This is an UTF8 string converted to UTF16 and back. Application program name is ../out/gn/sample_app Detected a boolean switch! Got a string switch value: SOME_VALUE
ããã§ã¯ãã³ãã³ãã©ã€ã³ãæäœããããã®ã¯ã©ã¹ããã¡ã€ã«ãã¹ã®æœè±¡åãããã³ãã®ã³ã°ã©ã€ãã©ãªã䜿çšããããã®ã¯ã©ã¹ãåæã«ç€ºããŸãã ãã®ããã
CHECKïŒïŒãåŒã³åºããšã
CommandLine :: Initã®åŒã³åºãçµæããã§ãã¯ããã
倱æããå Žåã¯ããã³ãã³ãã©ã€ã³åŒæ°ã®è§£æã«å€±æããŸããããšããæååãåºåãããŸãã ã¢ããªã±ãŒã·ã§ã³ãå®äºããŸãã ããã«ãæåããå Žåã
operator <<
ã¯ãã°ãããŒã«å¯ŸããŠåŒã³åºããããå°å·ã®ãªãŒããŒãããã¯ãããŸããã ãã®ãããªãã®ã³ã°ãéèŠãªæ©èœã®åŒã³åºãã䌎ãå Žåãããã¯éèŠã§ãã
ãã§ãã¯
DCHECKïŒãããã°ãã§ãã¯ïŒã¯ããããã°ãã«ãã§ã®ã¿å®è¡ããããªãªãŒã¹å
ã®ããã°ã©ã ã®å®è¡ã«ã¯åœ±é¿ããŸããã
ããã°ã©ã ãã°ã«ã€ããŠåŒãç¶ã説æãããã®ã³ã°ãå«ããŠäœ¿çšãã次ã®ã³ãŒããæ€èšããŸãã
src / sample_app.cc void LoggingSample() { logging::LoggingSettings settings; // Set log to STDERR on POSIX or to OutputDebugString on Windows. settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; CHECK(logging::InitLogging(settings)); // Log messages visible by default. LOG(INFO) << "This is INFO log message."; LOG(WARNING) << "This is WARNING log message."; // Verbose log messages, disabled by default. VLOG(1) << "This is a log message with verbosity == 1"; VLOG(2) << "This is a log message with verbosity == 2"; // Verbose messages, can be enabled only in debug build. DVLOG(1) << "This is a DEBUG log message with verbosity == 1"; DVLOG(2) << "This is a DEBUG log message with verbosity == 2"; // FATAL log message will terminate our app. if (base::CommandLine::ForCurrentProcess()->HasSwitch("log-fatal")) { LOG(FATAL) << "Program will terminate now!"; } }
ããã§ã¯ããŸãSTDERRã«æžã蟌ãããã«ãã®ã³ã°ãµãã·ã¹ãã ãåæåãã次ã«ããŸããŸãªã¬ãã«ã§ã¡ãã»ãŒãžããã°ã«åºåããŸãã
FATALã¬ãã«ã®æåŸã®ã¡ãã»ãŒãžã¯ãããã°ã©ã ã®å®è¡ãå®äºããå¯èœã§ããã°ã¹ã¿ãã¯ãã¬ãŒã¹ã衚瀺ããŸãã
LoggingSample()
ã®
LoggingSample()
é¢æ°ãžã®åŒã³åºããè¿œå ããæå®ããããã°ã¬ãã«ã§ããã°ã©ã ã®åäœã確èªããŸãïŒMac OS Xã§ã®åºåã衚瀺ãããŸãïŒã
ããŸããŸãªã¬ãã«ã®ãã°ã§å®è¡ãã $ ninja -C ../out/gn sample_app $ ../out/gn/sample_app --v=2 --log-fatal Hello from SampleApp! This is a wide string. This is an UTF8 string. This is an UTF8 string converted to UTF16 and back. Application program name is ../out/gn/sample_app [0303/202541:INFO:sample_app.cc(51)] This is INFO log message. [0303/202541:WARNING:sample_app.cc(52)] This is WARNING log message. [0303/202541:VERBOSE1:sample_app.cc(55)] This is a log message with verbosity == 1 [0303/202541:VERBOSE2:sample_app.cc(56)] This is a log message with verbosity == 2 [0303/202541:VERBOSE1:sample_app.cc(59)] This is a DEBUG log message with verbosity == 1 [0303/202541:VERBOSE2:sample_app.cc(60)] This is a DEBUG log message with verbosity == 2 [0303/202541:FATAL:sample_app.cc(64)] Program will terminate now! 0 sample_app 0x000000010f276def _ZN4base5debug10StackTraceC2Ev + 47 1 sample_app 0x000000010f276f93 _ZN4base5debug10StackTraceC1Ev + 35 2 sample_app 0x000000010f2b53a0 _ZN7logging10LogMessageD2Ev + 80 3 sample_app 0x000000010f2b2c43 _ZN7logging10LogMessageD1Ev + 35 4 sample_app 0x000000010f235072 _ZN12_GLOBAL__N_113LoggingSampleEv + 1346 5 sample_app 0x000000010f2342e0 main + 288 6 sample_app 0x000000010f2341b4 start + 52 7 ??? 0x0000000000000003 0x0 + 3 Trace/BPT trap: 5 $ ../out/gn/sample_app Hello from SampleApp! This is a wide string. This is an UTF8 string. This is an UTF8 string converted to UTF16 and back. Application program name is ../out/gn/sample_app [0303/203145:INFO:sample_app.cc(51)] This is INFO log message. [0303/203145:WARNING:sample_app.cc(52)] This is WARNING log message.
ãŸããããªãé£ããã䟿å©ãªã«ãŒã«ãããããšãããããŸããåãšã³ãã£ãã£/ã¯ã©ã¹ã«ã¯ãã³ãŒããæã€ãã¡ã€ã«ã«å¯Ÿå¿ããååã®ãã¡ã€ã«ã1ã€ãããŸãã ãã®ãããFilePathã¯ã©ã¹ã¯ããããŒãã¡ã€ã«
base / files / file_path.hã§æ€çŽ¢ããå¿
èŠãããããã®å®è£
ã¯
base / files / file_path.ccã«ãããŸãã
ããã«ãããã³ãŒããããã²ãŒãããç®çã®ã¯ã©ã¹ãšé¢æ°ãç°¡åã«æ€çŽ¢ã§ããŸãã
ããšãã°ãçŸåšã®ãã£ã¬ã¯ããªã®å
容ããªã¹ãããããã«ãããè€éãªã³ãŒããèŠãŠã¿ãŸãããã
src / sample_app.cc #include "base/files/file_enumerator.h" #include "base/files/file_util.h" void FilesSample() { base::FilePath current_dir; CHECK(base::GetCurrentDirectory(¤t_dir)); std::cout << "Enumerating files and directories in path: " << current_dir.AsUTF8Unsafe() << std::endl; base::FileEnumerator file_enumerator( current_dir, false, base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES); for (base::FilePath name = file_enumerator.Next(); !name.empty(); name = file_enumerator.Next()) { std::cout << (file_enumerator.GetInfo().IsDirectory() ? "[dir ] " : "[file] ") << name.AsUTF8Unsafe() << std::endl; } }
ãããŠã
main()
è¿œå ããã ãã§ãã
ã芧ã®ãšããã
ããŒã¹:: FileEnumeratorã¯ã©ã¹ã䜿çšããããšã¯é£ãã
ãããŸããããã®çµæãçŸåšã®ãã£ã¬ã¯ããªã«ãããã¡ã€ã«ã®ãªã¹ããååŸã§ããŸããã
ã¢ããªã±ãŒã·ã§ã³åºå $ ninja -C ../out/gn sample_app $ (cd src/ && ../../out/gn/sample_app) Hello from SampleApp! This is a wide string. This is an UTF8 string. This is an UTF8 string converted to UTF16 and back. Application program name is ../../out/gn/sample_app [0303/203629:INFO:sample_app.cc(51)] This is INFO log message. [0303/203629:WARNING:sample_app.cc(52)] This is WARNING log message. Enumerating files and directories in path: /Users/username/chromium/src/sample_app/src [file] /Users/username/chromium/src/sample_app/src/BUILD.gn [file] /Users/username/chromium/src/sample_app/src/sample_app.cc
éåžžãããã°ã©ã ã¯main.ccãã¡ã€ã«ä»¥å€ã®ãã®ã§æ§æãããŠããããããããžã§ã¯ãã«APIã®ã¹ã¿ã³ãã¢ãã³ã¢ãžã¥ãŒã«ãè¿œå ããŸãããã æ°ããã¢ãžã¥ãŒã«ã®ã³ãŒãã®æ¬è³ªã¯ä»ã§ã¯ããã»ã©éèŠã§ã¯ãããŸãããããã¯ãã¢ã§ããããšãã°ããã€ã§ãtrueãè¿ãããšãã§ããŸãã
ããããŒãã¡ã€ã«ãšãæ°ããé¢æ°ã®å®è£
ãå«ããã¡ã€ã«ãäœæããŸãã
src / sample_api.h #ifndef SAMPLE_APP_SAMPLE_API_H_ #define SAMPLE_APP_SAMPLE_API_H_ namespace sample_api {
src / sample_api.cc #include "sample_app/src/sample_api.h" namespace sample_api { bool CallApiFunction() { return true; } }
ãã®åŸãé¢æ°ã®åäœãã¹ããäœæã§ããŸãã
ãããè¡ãããããžã§ã¯ãã«æ°ãããã¡ã€ã«ãè¿œå ããŸãã
ãã¹ãã®ã³ãŒãsrc / sample_api_unittest.cc #include "sample_app/src/sample_api.h" #include "testing/gtest/include/gtest/gtest.h" namespace sample_api { namespace { TEST(SampleApi, ApiFunctionTest) { EXPECT_TRUE(CallApiFunction()); } }
src / BUILD.gn import("//testing/test.gni") executable("sample_app") { output_name = "sample_app" sources = [ "sample_app.cc", "sample_api.cc", "sample_api.h", ] deps = [ "//base", ] } test("sample_app_unittests") { sources = [ # TODO: Extract these API files as a library. "sample_api.cc", "sample_api.h", "sample_api_unittest.cc", ] deps = [ "//base/test:run_all_unittests", "//testing/gtest", ] }
GTestã©ã€ãã©ãªã®äœ¿çšã¯éåžžã«ç°¡åã§ããããããžã§ã¯ãã«äŸåé¢ä¿ã// testing / gtestããè¿œå ããå¿
èŠããããŸãããŸãã䟿å®äž// // base / testïŒrun_all_unittestsã ããã«ããããããžã§ã¯ããã¹ããå®è¡ããããã®ã³ãŒããèšè¿°ããå¿
èŠããªããªããŸããsrc/ base / test / run_all_unittests.ccã®ã³ãŒãããããæ
åœããŸãã
ãããžã§ã¯ãã®ninjaãã¡ã€ã«ãåçæãããã¹ããåéããŸãã
$ ninja -C ../out/gn sample_app_unittests
ãã¹ããå®è¡ããŸãã $ ../out/gn/sample_app_unittests IMPORTANT DEBUGGING NOTE: batches of tests are run inside their own process. For debugging a test inside a debugger, use the --gtest_filter=<your_test_name> flag along with --single-process-tests. Using sharding settings from environment. This is shard 0/1 Using 8 parallel jobs. [1/1] SampleApi.ApiFunctionTest (0 ms) SUCCESS: all tests passed. Tests took 0 seconds.
ãã¹ãŠã®ãã¹ãã«åæ ŒããŸããïŒ
ãã¹ããäœæãããAPIã®ã³ãŒãããããžã§ã¯ãã«è¿œå ãããããããã䜿çšã§ããŸãã
src / sample_app.cc #include "sample_app/src/sample_api.h" void UseSampleAPI() { if (sample_api::CallApiFunction()) { std::cout << "Magick!" << std::endl; } }
ãšãŠãç°¡åã§ãã
ãã®çµæãããã°ã©ã ã¯ããŸããŸãªãšã³ã³ãŒãã£ã³ã°ã§åäœãããã¡ã€ã«ã·ã¹ãã ã§ã³ãã³ãã©ã€ã³ã解æãããã°ã«ãšã©ãŒãå ±åãããã¹ãã«ãã¬ããžã100ïŒ
ã«è¿ã¥ãæ°ããã³ãŒãã䜿çšããŸãã
åæã«ããããžã§ã¯ãã®ãã«ãæ§æã¯éåžžã«å°ãããŠèªã¿ããããã³ã³ãã€ã«ããŠå®è¡ãããŸã
ã³ãŒãã¯ããŸããŸãªãã©ãããã©ãŒã ã§äœ¿çšã§ããã³ãŒãã«ã¯åäžã®#ifdefããããŸããã
ããã¯çŽ æŽãããããšã§ã¯ãããŸãããïŒ
ãã¡ããããããžã§ã¯ãã§å©çšå¯èœãªã¯ã©ã¹ã®å
µåšåº«å
šäœã䜿çšããã«ã¯ãå€ããèªãå¿
èŠããããŸã
ã³ãŒããšããã¥ã¡ã³ããŒã·ã§ã³ïŒæã«ã¯åããã®ã§ãïŒããŸãã¯ãã¥ãŒã¹ã¬ã¿ãŒã§å°ããŸãã
ãã¬ãŒãã³ã°è³æãAPIãªãã¡ã¬ã³ã¹ããã¯ãæ¢è£œã®ãµã³ãã«ã¯ãããŸããã
ããã«ãã³ãŒãããŒã¹ã¯ããè¯ããšã¯ããã掻çºã§åžžã«å€åããŠããŸãã
ç¹°ãè¿ããŸãããããªããèªããã¹ãŠã®ãã®ã¯ããªãèªèº«ã®å±éºãšãªã¹ã¯ã§äœ¿çšãããã¹ãã§ã=ïŒ
ãã®èšäºã¯ç§ãäºæ³ããŠããããããã£ãšé·ããªã£ãã®ã§ãä»ã®ãšããã¯ããã§ãã¹ãŠã§ãã
èªãã§ãããŠããããšãïŒ
åç
§è³æ