• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Clear

            記憶中的閃光,總會(huì)蒙塵。
            隨筆 - 6, 文章 - 0, 評(píng)論 - 0, 引用 - 0
            數(shù)據(jù)加載中……

            讓Premake4支持protobuf的protoc生成源文件

            最近在使用Premake4進(jìn)行項(xiàng)目配置生成makefile之類(lèi)。

            比較而言,Premake4比cmake還是感覺(jué)簡(jiǎn)單一點(diǎn),至少lua語(yǔ)法簡(jiǎn)單,premake4的配置文件比較簡(jiǎn)單易讀,而cmake的配置文件就比較復(fù)雜,而且又是自己定義的一套東西,用起來(lái)實(shí)在比較煩。

            Premake4還有一個(gè)比較好用的特性,可以直接用 **/*.cpp 指定項(xiàng)目包含所有目錄下的cpp文件,而不用單個(gè)指定。這樣每次增加一個(gè)文件不用老等編譯了才想起來(lái)忘記了增加文件到配置中。算是給懶人的一個(gè)福利吧。

            當(dāng)然,Premake4也有自己的缺陷,目前還不支持自定義規(guī)則,所以如果項(xiàng)目中有用到什么自動(dòng)生成源文件的特性就比較麻煩了,比如這次說(shuō)到的protobuf要用protoc編譯.proto文件生成.pb.cc和.pb.h文件,另外QT也有類(lèi)似的需求,就我之前某項(xiàng)目中,也使用了tolua++生成過(guò)c++的lua接口文件。

            但是,Premake4雖然還不支持自定義規(guī)則,但是總算有一個(gè)prebuildcommands可以用,于是研究了一下,自制了一個(gè).proto文件的"編譯規(guī)則":

            function protobufs(pat)
            local list = {}
            if type(pat) == "string" then
            list[1] = pat;
            elseif type(pat) == "table" then
            list = pat;
            end
            local proj = project();
            for _,pat in ipairs(list) do
            local protofiles = os.matchfiles(pat);
            for _,protofile in ipairs(protofiles) do
            local basename = path.getbasename(protofile);
            local sourcedir = proj.basedir.."/"..path.getdirectory(protofile);
            local sourcefile = proj.basedir.."/"..protofile;
            local targetdir = "$(OBJDIR)/proto/"..path.getdirectory(protofile);
            local targetfile = targetdir.."/"..basename..".pb.cc";
            prebuildcommands {
            "@mkdir -p "..targetdir,
            "@test "..sourcefile.." \\\n"
            .."\t\t\t -ot "..targetfile.." || \\\n"
            .."\t\t( echo protoc "..protofile.." && \\\n"
            .."\t\tprotoc --cpp_out "..targetdir.."\\\n"
            .."\t\t\t"..sourcefile.."\\\n"
            .."\t\t\t".." -I"..sourcedir.." ) \\\n"
            }
            files {
            path.join(targetdir, basename..".pb.h"),
            path.join(targetdir, basename..".pb.cc"),
            }
            includedirs { targetdir }
            end
            end
            end

            使用方法呢,就是把上面的代碼保存到protobuf.lua里面,然后在premake4.lua最開(kāi)始的時(shí)候,調(diào)用

            dofile "protobuf.lua"

            然后在項(xiàng)目定義的時(shí)候,使用

            protobufs { "**/*.proto" }

            就可以了。

            ?

            當(dāng)然,還有一點(diǎn)要注意的,我的系統(tǒng)是mac,但腳本在linux下應(yīng)該也能同樣運(yùn)行,但是windows下面的話,可能就需要做一點(diǎn)改動(dòng)了。

            posted on 2012-11-15 22:44 Clear 閱讀(1387) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C++

            亚洲欧美伊人久久综合一区二区 | 久久亚洲国产成人影院| 亚洲七七久久精品中文国产| 久久99精品久久久大学生| 国产一区二区三区久久精品| 久久综合伊人77777| 久久久久久午夜成人影院| 久久国产福利免费| av午夜福利一片免费看久久| 日韩十八禁一区二区久久| 国内精品久久国产大陆| 奇米影视7777久久精品人人爽| 久久国产精品成人免费| 久久精品国产亚洲AV影院| 久久久91人妻无码精品蜜桃HD| 2021久久精品国产99国产精品 | 麻豆AV一区二区三区久久 | 日本精品久久久久中文字幕8| 久久精品青青草原伊人| 久久久久亚洲AV成人网人人网站 | 亚洲国产成人精品91久久久| 国产精品久久久久久影院| 久久天天躁狠狠躁夜夜躁2O2O| 亚洲午夜福利精品久久| 婷婷久久综合九色综合九七| 精品国产热久久久福利| 久久伊人精品青青草原高清| 国产成人久久AV免费| 伊人久久大香线蕉AV色婷婷色| 亚洲精品NV久久久久久久久久 | 欧美777精品久久久久网| 久久国产免费观看精品| 久久亚洲精品人成综合网| 久久天天婷婷五月俺也去| 色狠狠久久综合网| 久久夜色精品国产亚洲| 精品久久久无码人妻中文字幕| 少妇久久久久久被弄到高潮| 久久经典免费视频| 性做久久久久久久| 久久不见久久见免费视频7|