Есть ли инструмент, помогающий перейти с make на waf? - PullRequest
5 голосов
/ 30 января 2012

Я хочу перенести большой проект с использования make на использование waf.Существуют ли какие-либо инструменты, которые могут помочь автоматизировать процесс в некоторой степени?

1 Ответ

4 голосов
/ 05 февраля 2012

Нет, нет, но миграция не так сложна.

Если вы никогда раньше не использовали waf, посмотрите на пример из папки demos/ (c - типичный) и переварите waf book .

Затем, от make до waf:

  • на этапе конфигурирования, материализованного функцией configure(), создайте экземпляры необходимых высокоуровневых инструментов и определите отношения с внешними библиотеками с помощью высокоуровневых инструментов, если это возможно (например, check_cfg() handles pkg-config(1)) или упадите назад в определении {DEFINES,INCLUDE,LIB,...}_$LIBNAME, например:
def configure(cfg):
    # I want to do C with any available compiler
    cfg.load("compiler_c") # will detect MSVC, GCC, or other common compilers

    # always include cwd
    cfg.env.INCLUDES += ['.']

    # I want to link all my programs with pthread
    cfg.env.LIB += ['pthread']

    # I want to link with static zlib
    cfg.env.STLIB_Z += ['z']

    # I want to use pkg-config to tell me how to link with pjsip
    # and avoid typing the risky -DPJ_AUTOCONF=1 -pipe -O2 -march=k8-sse3 -mcx16 -msahf -mno-movbe -mno-aes -mno-pclmul -mno-popcnt -mno-abm -mno-lwp -mno-fma -mno-fma4 -mno-xop -mno-bmi -mno-tbm -mno-avx -mno-sse4.2 -mno-sse4.1 --param l1-cache-size=64 l1-cache-line-size=64 l2-cache-size=512 -mtune=k8 -DPJ_IS_BIG_ENDIAN=0 -DPJ_IS_LITTLE_ENDIAN=1 -I/home/portage/tmp/net-libs-pjsip-1.12/image//usr/include  -L/home/portage/tmp/net-libs-pjsip-1.12/image//usr/lib -lpjsua -lpjsip-ua -lpjsip-simple -lpjsip -lpjmedia-codec -lpjmedia -lpjmedia-audiodev -lpjnath -lpjlib-util -lresample -lmilenage -lsrtp -lg7221codec -lpj -lm -luuid -lnsl -lrt -lpthread -lasound -lcrypto -lssl -lopencore-amrnb
    # the *_PJSIP variables will be created
    cfg.check_cfg(package='libpjproject',
                  uselib_store='PJSIP',
                  args='--libs --cflags',)

по возможности избегайте использования *FLAGS, так как они зависят от компилятора.

  • заменить стандартные правила makefile правилами высокого уровня (с использованием инструментов, инстанцированных в configure()), например.
bld(target='mylib',
    features='c', # see note
    source=['a.c', 'b.c'],
    use=['Z', 'PJSIP'],
    )

bld(target='name',
    features='c cprogram',
    source=['main.c'],
    use=['mylib'],
    )
  • При необходимости можно создать нестандартные правила и инструменты высокого уровня, см. Ваф. Книгу

В целом, сценарии сборки будут короче и проще для чтения, чем make-файлы. Они более линейные, а их содержание более семантическое.

Обратите внимание, что не требуется для создания статических библиотек, если вы не планируете их экспортировать. waf tools не использует оболочку для вызова программ, поэтому ограничение длины командной строки (основная причина создания внутренних статических библиотек) не является проблемой.

...