1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
--!A cross-platform build utility based on Lua
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-- Copyright (C) 2015-present, Xmake Open Source Community.
--
-- @author ruki
-- @file xmake.lua
--
-- define rule: *.mof
rule("wdk.mof")
-- add rule: wdk environment
add_deps("wdk.env")
-- set extensions
set_extensions(".mof")
-- before load
on_load(function (target)
-- imports
import("core.project.config")
import("lib.detect.find_program")
-- get arch
local arch = assert(config.arch(), "arch not found!")
-- get wdk
local wdk = target:data("wdk")
-- get mofcomp
local mofcomp = find_program("mofcomp", {check = function (program)
local tmpmof = os.tmpfile()
io.writefile(tmpmof, "")
os.run("%s %s", program, tmpmof)
os.tryrm(tmpmof)
end})
-- get wmimofck
local wmimofck = nil
if arch == "x64" then
wmimofck = path.join(wdk.bindir, wdk.sdkver, "x64", "wmimofck.exe")
if not os.isexec(wmimofck) then
wmimofck = path.join(wdk.bindir, wdk.sdkver, "x86", "x64", "wmimofck.exe")
end
else
wmimofck = path.join(wdk.bindir, wdk.sdkver, "x86", "wmimofck.exe")
end
-- save mofcomp and wmimofck
target:data_set("wdk.mofcomp", mofcomp)
target:data_set("wdk.wmimofck", wmimofck)
end)
-- before build file
before_build_file(function (target, sourcefile, opt)
-- imports
import("core.base.option")
import("core.theme.theme")
import("core.project.depend")
import("utils.progress")
-- get mofcomp
local mofcomp = target:data("wdk.mofcomp")
assert(mofcomp and os.isexec(mofcomp), "mofcomp not found!")
-- get wmimofck
local wmimofck = target:data("wdk.wmimofck")
assert(wmimofck and os.isexec(wmimofck), "wmimofck not found!")
-- get output directory
local outputdir = path.join(target:autogendir(), "rules", "wdk", "mof")
-- add includedirs
target:add("includedirs", outputdir)
-- get header file
local header = target:values("wdk.mof.header", sourcefile)
local headerfile = path.join(outputdir, header and header or (path.basename(sourcefile) .. ".h"))
-- get some temporary file
local sourcefile_mof = path.join(outputdir, path.filename(sourcefile))
local targetfile_mfl = path.join(outputdir, "." .. path.basename(sourcefile) .. ".mfl")
local targetfile_mof = path.join(outputdir, "." .. path.basename(sourcefile) .. ".mof")
local targetfile_mfl_mof = path.join(outputdir, "." .. path.basename(sourcefile) .. ".mfl.mof")
local targetfile_bmf = path.join(outputdir, path.basename(sourcefile) .. ".bmf")
local outputdir_htm = path.join(outputdir, "htm")
local targetfile_vbs = path.join(outputdir, path.basename(sourcefile) .. ".vbs")
-- need build this object?
local dependfile = target:dependfile(headerfile)
local dependinfo = target:is_rebuilt() and {} or (depend.load(dependfile) or {})
if not depend.is_changed(dependinfo, {lastmtime = os.mtime(headerfile), values = args}) then
return
end
-- trace progress info
progress.show(opt.progress, "${color.build.object}compiling.wdk.mof %s", sourcefile)
-- ensure the output directory
if not os.isdir(outputdir) then
os.mkdir(outputdir)
end
-- copy *.mof to output directory
os.cp(sourcefile, sourcefile_mof)
-- do mofcomp
os.vrunv(mofcomp, {"-Amendment:ms_409", "-MFL:" .. targetfile_mfl, "-MOF:" .. targetfile_mof, sourcefile_mof})
-- do wmimofck
os.vrunv(wmimofck, {"-y" .. targetfile_mof, "-z" .. targetfile_mfl, targetfile_mfl_mof})
-- do mofcomp to generate *.bmf
os.vrunv(mofcomp, {"-B:" .. targetfile_bmf, targetfile_mfl_mof})
-- do wmimofck to generate *.h
os.vrunv(wmimofck, {"-h" .. headerfile, "-w" .. outputdir_htm, "-m", "-t" .. targetfile_vbs, targetfile_bmf})
-- update files and values to the dependent file
dependinfo.files = {sourcefile}
dependinfo.values = args
depend.save(dependinfo, dependfile)
end)
|