• <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

            記憶中的閃光,總會蒙塵。
            隨筆 - 6, 文章 - 0, 評論 - 0, 引用 - 0
            數據加載中……

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

            最近在使用Premake4進行項目配置生成makefile之類。

            比較而言,Premake4比cmake還是感覺簡單一點,至少lua語法簡單,premake4的配置文件比較簡單易讀,而cmake的配置文件就比較復雜,而且又是自己定義的一套東西,用起來實在比較煩。

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

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

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

            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最開始的時候,調用

            dofile "protobuf.lua"

            然后在項目定義的時候,使用

            protobufs { "**/*.proto" }

            就可以了。

            ?

            當然,還有一點要注意的,我的系統是mac,但腳本在linux下應該也能同樣運行,但是windows下面的話,可能就需要做一點改動了。

            posted on 2012-11-15 22:44 Clear 閱讀(1385) 評論(0)  編輯 收藏 引用 所屬分類: C++

            精品久久久无码中文字幕天天| 亚洲精品国产美女久久久| AV色综合久久天堂AV色综合在| 国产精品视频久久久| 久久久久人妻一区精品果冻| 中文精品99久久国产| 99国产欧美久久久精品蜜芽 | 久久久久99精品成人片三人毛片 | 国内精品久久久久久久久电影网| 欧美一区二区三区久久综合| 天天久久狠狠色综合| 精品国产乱码久久久久久人妻| 2022年国产精品久久久久| 日韩久久久久中文字幕人妻 | 欧洲人妻丰满av无码久久不卡 | 国产精品久久国产精麻豆99网站 | 国产精品99久久久久久宅男| 久久精品国产2020| 久久五月精品中文字幕| 久久青草国产精品一区| 久久狠狠爱亚洲综合影院| 久久久久国产| 精品多毛少妇人妻AV免费久久| 久久精品人人做人人爽电影蜜月 | 伊人丁香狠狠色综合久久| 无码专区久久综合久中文字幕| 亚洲国产精品综合久久一线| 97精品伊人久久久大香线蕉 | 国产2021久久精品| 久久久国产精品福利免费| 久久婷婷激情综合色综合俺也去| 久久伊人影视| 免费一级做a爰片久久毛片潮| 色综合久久中文综合网| 国产精品禁18久久久夂久| 久久精品aⅴ无码中文字字幕重口| 久久综合久久美利坚合众国| 久久久久亚洲AV成人网人人网站| 色欲综合久久躁天天躁| 亚洲人AV永久一区二区三区久久 | 久久人妻少妇嫩草AV无码专区|