λλ μ΄κ²μ μν΄ PRμ μλν κ²μ΄μ§λ§ μ΄κ²μ΄ λ²κ·ΈμΈμ§ λλ μλλ κ²μΈμ§ μμ ν νμ ν μ μμ΅λλ€.
μλΈλμλ₯Ό ν¬ν¨νλ©΄
λμ: μ€λ₯: 'mod.c', 'mod.o'μ νμ, λλ½ λ° νμΈ κ·μΉ μμ
ν΄λΉ λλ ν 리μμ ninjaλ₯Ό μ§μ μ€νν΄λ μ μλν©λλ€. μλ κ²½λ‘κ° μμΈμΌ μ μλ€λ μμ¬ νμ νλ‘μ νΈ κ΅¬μ‘°λ₯Ό μ λλ ν°λ¦¬μ 볡μ¬νκ³ κ° μ
λ ₯/μΆλ ₯ μμ μ λ κ²½λ‘λ₯Ό μΆκ°ν λ€μ μμ λλ ν°λ¦¬μμ ninjaλ₯Ό μ€ννμ΅λλ€( build.ninja
ν¬ν¨) subninja
' λͺ¨λ). μ μ§μ΄μ‘μ΅λλ€.
μ΄κ²μ μ λ κ²½λ‘λ₯Ό μ¬μ©νμ¬ λμ ꡬμ±μ μμ±ν΄μΌ ν¨μ μλ―Έν©λκΉ? μ΄κ²μ λ΄κ° λ³Έ λͺ¨λ λ°μ κΈ°κ° μ΄κ²μ νμ§ μλλ€λ μ¬μ€κ³Ό ν¨κ» λ§μ λ¬Έμ λ₯Ό κ°μ§κ³ μμ΅λλ€. λν λ¬Έμλ ꡬλ³νμ§ μμΌλ©° Ninjaλ κ·Έλ μ§ μμΌλ©΄ μ μ€νλ©λλ€.
_κ·Έκ²μ λ²κ·Έμ λλ€_λΌλ μΈ‘λ©΄μμ μ€μλ₯Ό νκ³ μΆμ§λ§ λ°νμ κ²½λ‘ μ κ·νλ₯Ό μννλ PRμ΄ μ±λ₯ μ νλ₯Ό μΌμΌν¬ μ μλ€κ³ μκ°ν©λλ€(λΉλ‘ κ·Έ μμ¬μ λ·λ°μΉ¨νκΈ° μν΄ λ²€μΉλ§ν¬ μμ΄ μ¬κΈ°μμ μμ νλ€κ³ μμ§λ§).
λͺ¨λ κ²½λ‘λ 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λ₯Ό μΈμλ‘ λ³κ²½ν΄μΌ ν©λλ€.
κ°μ₯ μ μ©ν λκΈ
μ΄ν΄κ° μ μλλ€μ. λ΄κ° νΉν μ€λͺ ν μ¬μ© μ¬λ‘μμ Subninjasλ μΌλ°μ μΌλ‘ λΆλͺ¨ ninjaμ ꡬ쑰μ λν΄ μμ§ λͺ»ν©λλ€(μ μ΄λ μ νμλ μμ). κ·Έλλ λκ΅°κ°κ° μΌμ΄μ€λ₯Ό μ°Ύμ μ μμ κ±°λΌκ³ νμ ν©λλ€.
λ΄κ° μ§κΈ μ§λ©΄νκ³ μλ λ¬Έμ λ λ΄ μμ±κΈ°λ₯Ό μ¬μ©νμ§ μλ μ’ μμ±(νμ¬ λΌμ΄λΈλ¬λ¦¬ λ±)(κ·Έ μ€ 100%)μ΄ νμ¬ λΆνΈμ€νΈλνΌλ₯Ό μ¬μ©νμ¬ λΉλν΄μΌ νκ³ λ§€λ² λΆνΈμ€νΈλ©λμ΄μΌ νλ€λ κ²μ λλ€. λ΄κ° μμ νλ λλΆλΆμ μμ±κΈ°μλ λμ ꡬμ±μΌλ‘ μΆλ ₯νλ μ΅μ μ΄ μμ§λ§ λͺ¨λ ν΄λΉ λλ ν°λ¦¬(μ¦, ν΄λΉ λλ ν°λ¦¬μ μλμ )μ λν΄ κ΅¬μ±λμ΄ μμ΅λλ€.
ꡬμ±κ³Ό κ·Έλνλ₯Ό μ¬μ©νμ¬ μ νμ μ¬κ΅¬μΆμ μνν μ μλ€λ κ²μ μμ²λ μΌμ΄ λ κ²μ λλ€. νμ¬
subninja
κ° λΉλ λλ ν 리μ μλμ μΈ κ²½λ‘λ₯Ό κ°μ νκΈ° λλ¬Έμ μ΄ μμ μ μνν μ μμ΅λλ€.