Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions xmake/modules/detect/tools/find_midl.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
--!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, TBOOX Open Source Group.
--
-- @author ruki
-- @file find_midl.lua
--

-- imports
import("core.project.config")
import("lib.detect.find_program")
import("lib.detect.find_programver")

-- find midl
--
-- @param opt the argument options, e.g. {version = true}
--
-- @return program, version
--
-- @code
-- local midl = find_midl()
-- @endcode
--
function main(opt)
opt = opt or {}
opt.check = opt.check or "/confirm"
opt.command = opt.command or "/confirm"
opt.parse = opt.parse or function (output) return output:match("Version (%d+%.%d+%.%d+)%s") end

local envs = opt.envs
if envs and envs.WindowsSdkDir and envs.WindowsSDKVersion then
local toolchain = opt.toolchain
local arch = toolchain and toolchain:arch() or config.arch()
local bindir = path.join(envs.WindowsSdkDir, "bin", envs.WindowsSDKVersion, arch)
if os.isdir(bindir) then
opt.paths = opt.paths or {}
table.insert(opt.paths, bindir)
end
end

local program = find_program(opt.program or "midl", opt)

local version = nil
if program and opt and opt.version then
version = find_programver(program, opt)
end
return program, version
end
64 changes: 64 additions & 0 deletions xmake/rules/platform/windows/idl/xmake.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
--!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, TBOOX Open Source Group.
--
-- @author ruki
-- @file xmake.lua
--

-- add *.idl for rc file
rule("platform.windows.idl")
set_extensions(".idl")

on_config(function (target)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里也应该限制到 windows 平台

local autogendir = path.join(target:autogendir(), "platform/windows/idl")
os.mkdir(autogendir)
target:add("includedirs", autogendir, {public = true})
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这会导致所有工程都默认加上这个 includedir

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rule 里生成的头文件,如果下游 target 想用怎么办,粗粒度一点应该也不会撞吧

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

目前是所有工程 不管是否带 idl,都会带上这个 includedirs,即使没头文件冲突,但是 xmake -v 里莫名带上这个 includedirs 也很怪。

我稍微改了下,其实可以参考 windows.def 那个 rule,只有当前 target 带有 idl files ,才加上。

end)

before_buildcmd_file(function (target, batchcmds, sourcefile, opt)
import("lib.detect.find_tool")

local msvc = target:toolchain("msvc") or target:toolchain("clang-cl") or target:toolchain("clang")
local midl = assert(find_tool("midl", {envs = msvc:runenvs(), toolchain = msvc}), "midl not found!")

local name = path.basename(sourcefile)
local autogendir = path.join(target:autogendir(), "platform/windows/idl")

local flags = {"/nologo"}
table.join2(flags, table.wrap(target:values("idl.flags")))
table.join2(flags, {
"/out", path(autogendir),
"/header", name .. ".h",
"/iid", name .. "_i.c",
"/proxy", name .. "_p.c",
"/tlb", name .. ".tlb",
path(sourcefile)
})

batchcmds:show_progress(opt.progress, "${color.build.object}compiling.idl %s", sourcefile)
batchcmds:vrunv(midl.program, flags, {envs = msvc:runenvs()})

local iid_file = path.join(autogendir, name .. "_i.c")
local objectfile = target:objectfile(iid_file)
table.insert(target:objectfiles(), objectfile)

batchcmds:show_progress(opt.progress, "${color.build.object}compiling.$(mode) %s", iid_file)
batchcmds:compile(iid_file, objectfile)

batchcmds:add_depfiles(sourcefile, iid_file)
batchcmds:set_depmtime(os.mtime(objectfile))
batchcmds:set_depcache(target:dependfile(objectfile))
end)
1 change: 1 addition & 0 deletions xmake/rules/platform/xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ rule("platform.wasm")

rule("platform.windows")
add_deps("platform.windows.def")
add_deps("platform.windows.idl")
if is_host("windows") then
add_deps("platform.windows.manifest")
end
Loading