Ninja: μƒλŒ€ subninja κ²½λ‘œκ°€ ν™•μΈλ˜μ§€ μ•ŠμŒ

에 λ§Œλ“  2015λ…„ 06μ›” 21일  Β·  8μ½”λ©˜νŠΈ  Β·  좜처: ninja-build/ninja

λ‚˜λŠ” 이것을 μœ„ν•΄ PR을 μ‹œλ„ν•  κ²ƒμ΄μ§€λ§Œ 이것이 버그인지 λ˜λŠ” μ˜λ„λœ 것인지 μ™„μ „νžˆ ν™•μ‹ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ„œλΈŒλ‹Œμžλ₯Ό ν¬ν•¨ν•˜λ©΄

λ‹Œμž: 였λ₯˜: 'mod.c', 'mod.o'에 ν•„μš”, λˆ„λ½ 및 확인 κ·œμΉ™ μ—†μŒ

ν•΄λ‹Ή λ””λ ‰ν† λ¦¬μ—μ„œ ninjaλ₯Ό 직접 싀행해도 잘 μž‘λ™ν•©λ‹ˆλ‹€. μƒλŒ€ κ²½λ‘œκ°€ 원인일 수 μžˆλ‹€λŠ” μ˜μ‹¬ ν•˜μ— ν”„λ‘œμ νŠΈ ꡬ쑰λ₯Ό μƒˆ 디렉터리에 λ³΅μ‚¬ν•˜κ³  각 μž…λ ₯/좜λ ₯ μ•žμ— μ ˆλŒ€ 경둜λ₯Ό μΆ”κ°€ν•œ λ‹€μŒ μƒμœ„ λ””λ ‰ν„°λ¦¬μ—μ„œ ninjaλ₯Ό μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€( build.ninja 포함) subninja ' λͺ¨λ“ˆ). 잘 μ§€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

이것은 μ ˆλŒ€ 경둜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹Œμž ꡬ성을 생성해야 함을 μ˜λ―Έν•©λ‹ˆκΉŒ? 이것은 λ‚΄κ°€ λ³Έ λͺ¨λ“  λ°œμ „κΈ°κ°€ 이것을 ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 사싀과 ν•¨κ»˜ λ§Žμ€ 문제λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ λ¬Έμ„œλŠ” κ΅¬λ³„ν•˜μ§€ μ•ŠμœΌλ©° NinjaλŠ” 그렇지 μ•ŠμœΌλ©΄ 잘 μ‹€ν–‰λ©λ‹ˆλ‹€.

_그것은 λ²„κ·Έμž…λ‹ˆλ‹€_λΌλŠ” μΈ‘λ©΄μ—μ„œ μ‹€μˆ˜λ₯Ό ν•˜κ³  μ‹Άμ§€λ§Œ λŸ°νƒ€μž„ 경둜 μ •κ·œν™”λ₯Ό μˆ˜ν–‰ν•˜λŠ” PR이 μ„±λŠ₯ μ €ν•˜λ₯Ό μΌμœΌν‚¬ 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€(비둝 κ·Έ μ˜μ‹¬μ„ λ’·λ°›μΉ¨ν•˜κΈ° μœ„ν•΄ 벀치마크 없이 μ—¬κΈ°μ—μ„œ 손을 흔듀고 μžˆμ§€λ§Œ).

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이해가 잘 μ•ˆλ˜λ„€μš”. λ‚΄κ°€ 특히 μ„€λͺ…ν•œ μ‚¬μš© μ‚¬λ‘€μ—μ„œ SubninjasλŠ” 일반적으둜 λΆ€λͺ¨ ninja의 ꡬ쑰에 λŒ€ν•΄ μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€(적어도 μ•Œ ν•„μš”λŠ” μ—†μŒ). κ·Έλž˜λ„ λˆ„κ΅°κ°€κ°€ μΌ€μ΄μŠ€λ₯Ό 찾을 수 μžˆμ„ 거라고 ν™•μ‹ ν•©λ‹ˆλ‹€.

λ‚΄κ°€ μ§€κΈˆ μ§λ©΄ν•˜κ³  μžˆλŠ” λ¬Έμ œλŠ” λ‚΄ 생성기λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 쒅속성(타사 라이브러리 λ“±)(κ·Έ 쀑 100%)이 ν˜„μž¬ λΆ€νŠΈμŠ€νŠΈλž˜νΌλ₯Ό μ‚¬μš©ν•˜μ—¬ λΉŒλ“œν•΄μ•Ό ν•˜κ³  맀번 λΆ€νŠΈμŠ€νŠΈλž©λ˜μ–΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ‚΄κ°€ μž‘μ—…ν•˜λŠ” λŒ€λΆ€λΆ„μ˜ μƒμ„±κΈ°μ—λŠ” λ‹Œμž κ΅¬μ„±μœΌλ‘œ 좜λ ₯ν•˜λŠ” μ˜΅μ…˜μ΄ μžˆμ§€λ§Œ λͺ¨λ‘ ν•΄λ‹Ή 디렉터리(즉, ν•΄λ‹Ή 디렉터리에 μƒλŒ€μ )에 λŒ€ν•΄ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

ꡬ성과 κ·Έλž˜ν”„λ₯Ό μ‚¬μš©ν•˜μ—¬ 선택적 μž¬κ΅¬μΆ•μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€λŠ” 것은 μ—„μ²­λ‚œ 일이 될 κ²ƒμž…λ‹ˆλ‹€. ν˜„μž¬ subninja κ°€ λΉŒλ“œ 디렉토리에 μƒλŒ€μ μΈ 경둜λ₯Ό κ°€μ •ν•˜κΈ° λ•Œλ¬Έμ— 이 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  8 λŒ“κΈ€

λͺ¨λ“  κ²½λ‘œλŠ” subninja 라인이 ν¬ν•¨λœ 파일이 μ•„λ‹ˆλΌ λΉŒλ“œ 디렉토리에 μƒλŒ€μ μž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” 생성기가 파일 μ•žμ— 접두사λ₯Ό μΆ”κ°€ν•˜λŠ” μ–΄λ–€ 방법을 _all__ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 즉, μž‘μ—… 디렉토리 λͺ…령이 μ‹€ν–‰λ˜λŠ” 변경을 μ˜λ―Έν•©λ‹ˆλ‹€(생성기/λͺ…령이 μ‹€ν–‰λ˜λŠ” 방식에 따라 λΉŒλ“œ κ΅¬μ„±μ˜ μ›λž˜ μ˜λ„κ°€ 변경될 수 있음).

κ·Έλ ‡λ‹€λ©΄ subninja λŒ€ include 의 λŒ€μ‘° μ‚¬μš© μ‚¬λ‘€λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

λΉŒλ“œ 파일과 κ΄€λ ¨λœ κ²½λ‘œκ°€ μžˆλŠ” ν•˜μœ„ λ‹ŒμžλŠ” 자체 디렉터리 λ‚΄μ—μ„œ μ‹€ν–‰λ˜λ„λ‘ κ΅¬μ„±λœ 쒅속성이 경둜λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ μˆ˜ν–‰ν•  수 μžˆμ§€λ§Œ μƒμœ„ λ‹Œμž κ΅¬μ„±μ˜ 쒅속성 κ·Έλž˜ν”„μ— 계속 κΈ°μ—¬ν•  수 μžˆλ‹€λŠ” μ μ—μ„œ μœ μš©ν•©λ‹ˆλ‹€.

include κΈ°λŠ₯은 μˆ˜μ •λ˜μ§€ μ•Šκ³  사싀 κ·œμΉ™ 이름이 이제 κ²°ν•©λœ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— μžˆλŠ” 것 외에 μ„œλΈŒλ‹Œμžκ°€ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ μ •ν™•ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€(#921에 따름). ν˜„μž¬ subninja 및 include λŠ” λ²”μœ„ 지정 λ³€μˆ˜ 및 κ·œμΉ™ 이름을 μ œμ™Έν•˜κ³  본질적으둜 λ™μΌν•œ κ²°κ³Όλ₯Ό μ–»μŠ΅λ‹ˆλ‹€...

μ•„μ΄λ””μ–΄λŠ” 생성기가 λͺ¨λ“  .ninja νŒŒμΌμ„ μƒμ„±ν•˜λ―€λ‘œ λΉŒλ“œ 디렉토리에 μƒλŒ€μ μΈ 경둜λ₯Ό μž‘μ„±ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ„œλ‘œ λ‹€λ₯Έ μƒμ„±κΈ°μ—μ„œ μƒμ„±λœ λ‹Œμž νŒŒμΌμ„ κ²°ν•©ν•˜λŠ” 것은 ν₯미둜운 μ•„μ΄λ””μ–΄μ΄μ§€λ§Œ(이것이 당신이 μ›ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆκΉŒ?), ν˜„μž¬ μ§€μ›λ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.

λ§žμŠ΅λ‹ˆλ‹€. subninja 와 include 의 차이점은 μ „μžλŠ” λ²”μœ„λ₯Ό μΆ”κ°€ν•˜κ³  ν›„μžλŠ” μΆ”κ°€ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이에 λŒ€ν•œ μ‚¬μš© μ‚¬λ‘€λŠ” μ΅œμƒμœ„ λ‹Œμžκ°€ cflags 와 같은 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” cc와 같은 일반적인 λΉŒλ“œ κ·œμΉ™μ„ μ •μ˜ν•  수 있고 각 ν•˜μœ„ λ‹Œμžκ°€ ν•΄λ‹Ή λŒ€μƒμ— μ ν•©ν•œ κ²ƒμœΌλ‘œ cflags λ₯Ό μ„€μ •ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μΌνšŒμ„± μž‘μ—…μ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό 보렀면 python misc/write_fake_manifests.py /tmp/foo`λ₯Ό μ‹€ν–‰ν•˜μ—¬ 이 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λŠ” .ninja νŒŒμΌμ„ /tmp/foo에 μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.

그것은 μ˜λ―Έκ°€ μžˆμ§€λ§Œ (λ²”μœ„ μ œμ™Έ) μ—¬μ „νžˆ λ§Žμ€ 이점을 보지 λͺ»ν•©λ‹ˆλ‹€.

λ‹€λ₯Έ μƒμ„±κΈ°μ—μ„œ μƒμ„±λœ λ‹Œμž νŒŒμΌμ„ κ²°ν•©ν•˜λŠ” 것은 ν₯미둜운 μ•„μ΄λ””μ–΄μž…λ‹ˆλ‹€.

μ •ν™•νžˆ. Ninja 자체λ₯Ό λ‚΄ μƒμ„±κΈ°μ˜ ν•˜μœ„ λͺ¨λ“ˆλ‘œ ν¬ν•¨μ‹œν‚¨ λ‹€μŒ λ‹€λ₯Έ CMake ν”„λ‘œμ νŠΈ(Ninja λΉŒλ“œ νŒŒμΌμ„ 좜λ ₯ν•˜λ„λ‘ ꡬ성됨)λ₯Ό ν¬ν•¨ν•˜κ³  λ‘˜ 닀에 λŒ€ν•΄ Ninja ꡬ성 νŒŒμΌμ„ μƒμ„±ν•˜κ³  subninja 둜 포함할 수 μžˆμŠ΅λ‹ˆλ‹€. _my_ ν”„λ‘œμ νŠΈμ˜ build.ninja νŒŒμΌμ„ μ‚¬μš©ν•˜μ—¬ 마치 자체적으둜 λΉŒλ“œν•˜λŠ” κ²ƒμ²˜λŸΌ λ§Œλ“€ 수 μžˆμ§€λ§Œ 전체 ν”„λ‘œμ νŠΈλ₯Ό ν•œ λ²ˆμ— λΉŒλ“œν•˜κΈ° μœ„ν•΄ λ‚΄ ν”„λ‘œμ νŠΈμ—μ„œ 좜λ ₯(및 쒅속성 κ·Έλž˜ν”„)을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. .

그게 말이 λœλ‹€λ©΄. 특히 λ‚΄ 생성기λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³Ό 수 μžˆλŠ” 즉각적인 μ‚¬μš© μ‚¬λ‘€λŠ” Tup(IIRCκ°€ Ninja 자체 λ‚΄μ—μ„œ 일뢀 λ””μžμΈ 결정에 영ν–₯을 쀌)μ—μ„œ λͺ‡ 가지 κ°œλ…μ„ μ°¨μš©ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€ build.ninja νŒŒμΌμ„ κ°€μ Έμ˜¨ λ‹€μŒ κ·Έλž˜ν”„λ₯Ό νƒ­ν•˜μ—¬ 훨씬 더 큰 쒅속성 κ·Έλž˜ν”„λ₯Ό μžλ™μœΌλ‘œ ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

개인적으둜 subninja λ₯Ό 훨씬 더 μœ μš©ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ 잠재적으둜 획기적인 변경이라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 1) 패치둜 μ’…μ†μ„±μ˜ build.ninja νŒŒμΌμ„ μˆ˜μ •ν•˜κ±°λ‚˜ 2) μ’…μ†μ„±μ˜ 쒅속성 κ·Έλž˜ν”„λ₯Ό ν™œμš©ν•˜λŠ” κΈ°λŠ₯을 ν¬μƒν•˜μ§€ μ•ŠλŠ” ν•œ 이 문제λ₯Ό ν•΄κ²°ν•  방법이 μ—†μŠ΅λ‹ˆλ‹€.

생각?

μ–΄λ•Œμš”:

subninja path/to/build.ninja relative path/to

relative κ°€ μ—†μœΌλ©΄ 기본값은 ./ μž…λ‹ˆλ‹€. κ·Έλ ‡κ²Œ ν•˜λ©΄ μ†μƒλ˜μ§€ μ•Šμ§€λ§Œ μƒμ„±μžκ°€ μ›ν•˜λŠ” 경우 κΈ°λŠ₯을 계속 μ œκ³΅ν•©λ‹ˆλ‹€.

λ˜λŠ” λ‹€λ₯Έ Ninja κ΅¬μ„±μ˜ 단계λ₯Ό λ”°λ₯΄λ©΄

subninja path/to/build.ninja
  relative = path/to

.../foo에 ν”„λ‘œμ νŠΈκ°€ 있고 ν•˜μœ„ 디렉토리 ν‘œμ‹œμ€„μ΄ 있고 Ninja에 μ‚¬μš©μžκ°€ μ œμ•ˆν•œ μƒλŒ€ 경둜 논리가 μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

λΉŒλ“œ μ‹œμŠ€ν…œμ΄ /foo/obj에 λͺ¨λ“  λΉŒλ“œ 좜λ ₯을 κΈ°λ‘ν•˜λ €λŠ” 경우 디렉토리 μƒλŒ€ 경둜λ₯Ό μ‚¬μš©ν•˜λŠ” /foo/bar의 ν•˜μœ„ λ‹ŒμžλŠ” 좜λ ₯을 ../obj/bar에 μ“°λŠ” 방법을 μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€. ν•΄λ‹Ή ν•˜μœ„ λ””λ ‰ν† λ¦¬μ˜ νŒŒμΌμž…λ‹ˆλ‹€. λ”°λΌμ„œ build.ninja νŒŒμΌμ„ μƒμ„±ν•˜λŠ” 것은 무엇이든 이미 μ „μ—­ 경둜 계측 ꡬ쑰λ₯Ό μ•Œκ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 이 경우 λͺ¨λ“  경둜λ₯Ό μƒλŒ€μ μœΌλ‘œ λ§Œλ“œλŠ” 것은 bar/ λ””λ ‰ν† λ¦¬μ˜ 경둜 μ•žμ— bar/λ₯Ό μΆ”κ°€ν•˜λŠ” 것과 사싀상 λ™μΌν•œ λ¬Έμ œμž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μœ„μ˜ λ‚΄μš©μ€ μ€‘μš”ν•˜μ§€ μ•Šμ€ μ†ŒμŠ€ 디렉토리에 λΉŒλ“œ 좜λ ₯을 μž‘μ„±ν•˜λŠ” μ‚¬λžŒμ΄ μΆ©λΆ„νžˆ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 주둜 Ninjaμ—κ²Œ 패치λ₯Ό 보내 μ™„μ „νžˆ κ΄€λ ¨ μ—†λŠ” λ””λ ‰ν† λ¦¬μ—μ„œ λΉŒλ“œ 좜λ ₯으둜 Ninjaλ₯Ό λΉŒλ“œν•  수 μžˆλ„λ‘ ν•˜λŠ” 것과 같이 더 κ°•λ ₯ν•œ 뢄리λ₯Ό μ›ν•˜λŠ” μ‚¬λžŒλ“€μ˜ 이야기λ₯Ό λ“£μŠ΅λ‹ˆλ‹€.

이해가 잘 μ•ˆλ˜λ„€μš”. λ‚΄κ°€ 특히 μ„€λͺ…ν•œ μ‚¬μš© μ‚¬λ‘€μ—μ„œ SubninjasλŠ” 일반적으둜 λΆ€λͺ¨ ninja의 ꡬ쑰에 λŒ€ν•΄ μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€(적어도 μ•Œ ν•„μš”λŠ” μ—†μŒ). κ·Έλž˜λ„ λˆ„κ΅°κ°€κ°€ μΌ€μ΄μŠ€λ₯Ό 찾을 수 μžˆμ„ 거라고 ν™•μ‹ ν•©λ‹ˆλ‹€.

λ‚΄κ°€ μ§€κΈˆ μ§λ©΄ν•˜κ³  μžˆλŠ” λ¬Έμ œλŠ” λ‚΄ 생성기λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 쒅속성(타사 라이브러리 λ“±)(κ·Έ 쀑 100%)이 ν˜„μž¬ λΆ€νŠΈμŠ€νŠΈλž˜νΌλ₯Ό μ‚¬μš©ν•˜μ—¬ λΉŒλ“œν•΄μ•Ό ν•˜κ³  맀번 λΆ€νŠΈμŠ€νŠΈλž©λ˜μ–΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. λ‚΄κ°€ μž‘μ—…ν•˜λŠ” λŒ€λΆ€λΆ„μ˜ μƒμ„±κΈ°μ—λŠ” λ‹Œμž κ΅¬μ„±μœΌλ‘œ 좜λ ₯ν•˜λŠ” μ˜΅μ…˜μ΄ μžˆμ§€λ§Œ λͺ¨λ‘ ν•΄λ‹Ή 디렉터리(즉, ν•΄λ‹Ή 디렉터리에 μƒλŒ€μ )에 λŒ€ν•΄ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

ꡬ성과 κ·Έλž˜ν”„λ₯Ό μ‚¬μš©ν•˜μ—¬ 선택적 μž¬κ΅¬μΆ•μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€λŠ” 것은 μ—„μ²­λ‚œ 일이 될 κ²ƒμž…λ‹ˆλ‹€. ν˜„μž¬ subninja κ°€ λΉŒλ“œ 디렉토리에 μƒλŒ€μ μΈ 경둜λ₯Ό κ°€μ •ν•˜κΈ° λ•Œλ¬Έμ— 이 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

Evan: λ‚΄κ°€ μ΄ν•΄ν•œ 방법은 λ‹€μŒκ³Ό 같은 트리λ₯Ό μƒμ„±ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

  subbuild1
  subbuild2

그리고 μƒμ„±κΈ°λŠ” 일반적으둜 λΉŒλ“œ 디렉토리λ₯Ό μž„μ˜μ˜ μœ„μΉ˜μ— λ°°μΉ˜ν•˜λŠ” 것을 μ§€μ›ν•˜λ―€λ‘œ subbuild1μ—μ„œ ν”„λ‘œμ νŠΈ 1을 λΉŒλ“œν•˜κ³  subbuild 2μ—μ„œ ν”„λ‘œμ νŠΈ 2κ°€ μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ Qixκ°€ ν•˜μœ„ ν”„λ‘œμ νŠΈ λΉŒλ“œλ₯Ό κ΅¬λ™ν•˜λ €λŠ” builddir에 μ΅œμƒμœ„ ninja 파일이 μžˆμŠ΅λ‹ˆλ‹€.

κ΄€λ ¨ μ—†μŒ: 이 relative κΈ°λŠ₯은 λΉŒλ“œ 디렉토리와 λ™μΌν•œ ν˜„μž¬ 디렉토리에 μ’…μ†λœ κ·œμΉ™μ΄ μžˆλŠ” 경우(예: λΉŒλ“œλœ μ•„ν‹°νŒ©νŠΈ λ˜λŠ” 기타 ν•­λͺ©μ„ μ œκ±°ν•˜λŠ” 경우) cwdλ₯Ό 인수둜 λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰