Unix

WAF 예제 (WAF build system)

ForceCore 2017. 7. 21. 10:55

CMakeLists.txt 는 매우 고통스럽다. 뭐랄까... autotools의 약점을 보완하기 위해 나온 것이나 자체적인 스크립트 언어가 매우 개떡인 고로 되니까 쓰는거지 즐겨쓰지 않는다는 듯. 나도 별로 쓰기 싫다.


WAF는 스크립트가 파이썬이란 장점이 있어서 C++ 프로젝트가 아닌 것으로 이상한 짓 하려면 추천한다. 물론 인기는 없다...;; 구글에서 Bazel도 내놓고 어디선 뭐 내놓고 난리를 치고 있는데 딱히 앞으로도 인기가 있어질 것 같지는 않다. 사용 설명서가 좀 개떡같다는 평인 듯 하다. 그래도 난 맘에 들긴 했다. 하지만 다른 게 더 맘에 드는 고로 일단은 패스.


#!/usr/bin/python3

import os


APPNAME = 'libplacer'

VERSION = '001'


top = '.'


# Special variable. Dir to hold outputs.

out = 'bld'


def options(opt):

    opt.load('compiler_cxx')


def configure(cnf):

    print('configuring project in ' + cnf.path.abspath())

    cnf.load('compiler_cxx')

    cnf.check_cxx(cxxflags='-O2 -g -Wall -std=c++14')

    cnf.check_cxx(lib='z')

    cnf.env.append_unique('CXXFLAGS', ['-g', '-O2', '-Wall', '-std=c++14'])


def build(bld):

    zipper_path = os.path.join(bld.path.abspath(), '../zipper/bld')

    eastl_path = os.path.join(bld.path.abspath(), '../bld.eastl')

    eastl_include_path = os.path.join(bld.path.abspath(), '../EASTL/include')

    eabase_path = os.path.join(bld.path.abspath(), '../EASTL/test/packages/EABase/include/Com

mon')


    bld.stlib(

        includes=[eastl_include_path, eabase_path],

        target='graph',

        source='eastl_new.cpp graph.cpp ucla_reader.cpp')


    # For all available properties,

    # look at the WAF book, Table 1: Use variables and task generator attributes for C/C++

    bld.program(

        source=['test.cpp'],

        target='test',

        use=['graph'],

        includes=[eastl_include_path, eabase_path],

        stlibpath=[zipper_path, eastl_path],

        stlib=['Zipper-static', 'EASTL'],

        lib=['z'])


요렇다... 외부 라이브러리와, 내가 직접 컴파일 해서 만든 static library에 링크하는 법, 다른데서 컴파일 미리 해둔 static library에 링크하는 법이 다 들어가 있다.


컴파일 하는 법:


waf configure (한번만)

waf


하면 컴파일 됨.

out= 에 지정한 폴더가 생기면서 거기에 컴파일 결과물이 생길 것이다.


그런데 뭐가 맘에 안드는고 하니. gcc에 너무 특화되어서 내가 플래그를 다 설정해주고 있다는 점. clang이라든지 아니면 다른 운영체제용 빌드를 한다든지 한다면 고생길이 훤해보인다. 그래서 일단은 소규모 혼자 가지고 놀기 위한 것이 아니라면 일단은 피하고 싶다. 아니면 아예 리눅스에서 할 것이 뻔한 LaTeX 라면 또 괜찮은 것 같은데 그건 waf를 굳이 써야 하나... Makefile이면 되지.