summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2023-03-10 13:58:46 +0800
committerGitHub <[email protected]>2023-03-10 13:58:46 +0800
commiteb6314a1747a4f24640e7ce66992de74fa6aa04c (patch)
treefe018d94d1bd0b95d9428bbe6d1f27b20b876c5b
parent53e072790413cd48f1b5f9ede2a2714822f47846 (diff)
parent4e10f9b8a793b4bd1b16683b958e1c250cc1c3f3 (diff)
Merge pull request #3491 from xmake-io/ninja
Improve ninja generator
-rw-r--r--xmake/plugins/project/cmake/cmakelists.lua104
-rw-r--r--xmake/plugins/project/ninja/build_ninja.lua108
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua6
3 files changed, 139 insertions, 79 deletions
diff --git a/xmake/plugins/project/cmake/cmakelists.lua b/xmake/plugins/project/cmake/cmakelists.lua
index b3d614985..d22117aa1 100644
--- a/xmake/plugins/project/cmake/cmakelists.lua
+++ b/xmake/plugins/project/cmake/cmakelists.lua
@@ -81,16 +81,16 @@ function _escape_path_in_flag(target, flag)
return flag
end
--- get unix path
-function _get_unix_path(filepath, outputdir)
+-- get relative unix path
+function _get_relative_unix_path(filepath, outputdir)
filepath = _translate_path(filepath, outputdir)
filepath = _escape_path(path.translate(filepath))
return os.args(filepath)
end
--- get unix path relative to the cmake path
+-- get relative unix path to the cmake path
-- @see https://github.com/xmake-io/xmake/issues/2026
-function _get_unix_path_relative_to_cmake(filepath, outputdir)
+function _get_relative_unix_path_to_cmake(filepath, outputdir)
filepath = _translate_path(filepath, outputdir)
filepath = path.translate(filepath):gsub('\\', '/')
if filepath and not path.is_absolute(filepath) then
@@ -146,17 +146,17 @@ end
function _translate_flag(flag, outputdir)
if flag then
if path.instance_of(flag) then
- flag = flag:clone():set(_get_unix_path_relative_to_cmake(flag:rawstr(), outputdir)):str()
+ flag = flag:clone():set(_get_relative_unix_path_to_cmake(flag:rawstr(), outputdir)):str()
elseif path.is_absolute(flag) then
- flag = _get_unix_path_relative_to_cmake(flag, outputdir)
+ flag = _get_relative_unix_path_to_cmake(flag, outputdir)
elseif flag:startswith("-fmodule-file=") then
- flag = "-fmodule-file=" .. _get_unix_path_relative_to_cmake(flag:sub(15), outputdir)
+ flag = "-fmodule-file=" .. _get_relative_unix_path_to_cmake(flag:sub(15), outputdir)
elseif flag:startswith("-fmodule-mapper=") then
- flag = "-fmodule-mapper=" .. _get_unix_path_relative_to_cmake(flag:sub(17), outputdir)
+ flag = "-fmodule-mapper=" .. _get_relative_unix_path_to_cmake(flag:sub(17), outputdir)
elseif flag:match("(.+)=(.+)") then
local k, v = flag:match("(.+)=(.+)")
if v and v:endswith(".ifc") then -- e.g. hello=xxx/hello.ifc
- flag = k .. "=" .. _get_unix_path_relative_to_cmake(v, outputdir)
+ flag = k .. "=" .. _get_relative_unix_path_to_cmake(v, outputdir)
end
end
end
@@ -283,7 +283,7 @@ function _add_target_binary(cmakelists, target, outputdir)
_set_target_compiler(cmakelists, target)
cmakelists:print("add_executable(%s \"\")", target:name())
cmakelists:print("set_target_properties(%s PROPERTIES OUTPUT_NAME \"%s\")", target:name(), target:basename())
- cmakelists:print("set_target_properties(%s PROPERTIES RUNTIME_OUTPUT_DIRECTORY \"%s\")", target:name(), _get_unix_path_relative_to_cmake(target:targetdir(), outputdir))
+ cmakelists:print("set_target_properties(%s PROPERTIES RUNTIME_OUTPUT_DIRECTORY \"%s\")", target:name(), _get_relative_unix_path_to_cmake(target:targetdir(), outputdir))
end
-- add target: static
@@ -291,7 +291,7 @@ function _add_target_static(cmakelists, target, outputdir)
_set_target_compiler(cmakelists, target)
cmakelists:print("add_library(%s STATIC \"\")", target:name())
cmakelists:print("set_target_properties(%s PROPERTIES OUTPUT_NAME \"%s\")", target:name(), target:basename())
- cmakelists:print("set_target_properties(%s PROPERTIES ARCHIVE_OUTPUT_DIRECTORY \"%s\")", target:name(), _get_unix_path_relative_to_cmake(target:targetdir(), outputdir))
+ cmakelists:print("set_target_properties(%s PROPERTIES ARCHIVE_OUTPUT_DIRECTORY \"%s\")", target:name(), _get_relative_unix_path_to_cmake(target:targetdir(), outputdir))
end
-- add target: shared
@@ -301,10 +301,10 @@ function _add_target_shared(cmakelists, target, outputdir)
cmakelists:print("set_target_properties(%s PROPERTIES OUTPUT_NAME \"%s\")", target:name(), target:basename())
if target:is_plat("windows") then
-- @see https://github.com/xmake-io/xmake/issues/2192
- cmakelists:print("set_target_properties(%s PROPERTIES RUNTIME_OUTPUT_DIRECTORY \"%s\")", target:name(), _get_unix_path_relative_to_cmake(target:targetdir(), outputdir))
- cmakelists:print("set_target_properties(%s PROPERTIES ARCHIVE_OUTPUT_DIRECTORY \"%s\")", target:name(), _get_unix_path_relative_to_cmake(target:targetdir(), outputdir))
+ cmakelists:print("set_target_properties(%s PROPERTIES RUNTIME_OUTPUT_DIRECTORY \"%s\")", target:name(), _get_relative_unix_path_to_cmake(target:targetdir(), outputdir))
+ cmakelists:print("set_target_properties(%s PROPERTIES ARCHIVE_OUTPUT_DIRECTORY \"%s\")", target:name(), _get_relative_unix_path_to_cmake(target:targetdir(), outputdir))
else
- cmakelists:print("set_target_properties(%s PROPERTIES LIBRARY_OUTPUT_DIRECTORY \"%s\")", target:name(), _get_unix_path_relative_to_cmake(target:targetdir(), outputdir))
+ cmakelists:print("set_target_properties(%s PROPERTIES LIBRARY_OUTPUT_DIRECTORY \"%s\")", target:name(), _get_relative_unix_path_to_cmake(target:targetdir(), outputdir))
end
end
@@ -332,7 +332,7 @@ function _add_target_sources(cmakelists, target, outputdir)
for _, sourcebatch in table.orderpairs(target:sourcebatches()) do
if _sourcebatch_is_built(sourcebatch) then
for _, sourcefile in ipairs(sourcebatch.sourcefiles) do
- cmakelists:print(" " .. _get_unix_path(sourcefile, outputdir))
+ cmakelists:print(" " .. _get_relative_unix_path(sourcefile, outputdir))
end
end
if sourcebatch.sourcekind == "cu" then
@@ -340,7 +340,7 @@ function _add_target_sources(cmakelists, target, outputdir)
end
end
for _, headerfile in ipairs(target:headerfiles()) do
- cmakelists:print(" " .. _get_unix_path(headerfile, outputdir))
+ cmakelists:print(" " .. _get_relative_unix_path(headerfile, outputdir))
end
cmakelists:print(")")
if has_cuda then
@@ -364,36 +364,36 @@ function _add_target_source_groups(cmakelists, target, outputdir)
local sources = {}
local recurse_sources = {}
if path.is_absolute(rootdir) then
- rootdir = _get_unix_path(rootdir, outputdir)
+ rootdir = _get_relative_unix_path(rootdir, outputdir)
else
- rootdir = string.format("${CMAKE_CURRENT_SOURCE_DIR}/%s", _get_unix_path(rootdir, outputdir))
+ rootdir = string.format("${CMAKE_CURRENT_SOURCE_DIR}/%s", _get_relative_unix_path(rootdir, outputdir))
end
for _, filepattern in ipairs(files) do
if filepattern:find("**", 1, true) then
filepattern = filepattern:gsub("%*%*", "*")
- table.insert(recurse_sources, _get_unix_path(path.join(rootdir, filepattern), outputdir))
+ table.insert(recurse_sources, _get_relative_unix_path(path.join(rootdir, filepattern), outputdir))
else
- table.insert(sources, _get_unix_path(path.join(rootdir, filepattern), outputdir))
+ table.insert(sources, _get_relative_unix_path(path.join(rootdir, filepattern), outputdir))
end
end
if #sources > 0 then
cmakelists:print("FILE(GLOB %s_GROUP_SOURCE_LIST %s)", target:name(), table.concat(sources, " "))
if mode and mode == "plain" then
cmakelists:print("source_group(%s FILES ${%s_GROUP_SOURCE_LIST})",
- _get_unix_path(filegroup, outputdir), target:name())
+ _get_relative_unix_path(filegroup, outputdir), target:name())
else
cmakelists:print("source_group(TREE %s PREFIX %s FILES ${%s_GROUP_SOURCE_LIST})",
- rootdir, _get_unix_path(filegroup, outputdir), target:name())
+ rootdir, _get_relative_unix_path(filegroup, outputdir), target:name())
end
end
if #recurse_sources > 0 then
cmakelists:print("FILE(GLOB_RECURSE %s_GROUP_RECURSE_SOURCE_LIST %s)", target:name(), table.concat(recurse_sources, " "))
if mode and mode == "plain" then
cmakelists:print("source_group(%s FILES ${%s_GROUP_RECURSE_SOURCE_LIST})",
- _get_unix_path(filegroup, outputdir), target:name())
+ _get_relative_unix_path(filegroup, outputdir), target:name())
else
cmakelists:print("source_group(TREE %s PREFIX %s FILES ${%s_GROUP_RECURSE_SOURCE_LIST})",
- rootdir, _get_unix_path(filegroup, outputdir), target:name())
+ rootdir, _get_relative_unix_path(filegroup, outputdir), target:name())
end
end
end
@@ -406,7 +406,7 @@ function _add_target_precompiled_header(cmakelists, target, outputdir)
cmakelists:print("target_precompile_headers(%s PRIVATE", target:name())
cmakelists:print(" $<$<COMPILE_LANGUAGE:%s>:${CMAKE_CURRENT_SOURCE_DIR}/%s>",
target:get("pcxxheader") and "CXX" or "C",
- _get_unix_path(precompiled_header, outputdir))
+ _get_relative_unix_path(precompiled_header, outputdir))
cmakelists:print(")")
end
end
@@ -417,7 +417,7 @@ function _add_target_include_directories(cmakelists, target, outputdir)
if #includedirs > 0 then
cmakelists:print("target_include_directories(%s PRIVATE", target:name())
for _, includedir in ipairs(includedirs) do
- cmakelists:print(" " .. _get_unix_path(includedir, outputdir))
+ cmakelists:print(" " .. _get_relative_unix_path(includedir, outputdir))
end
cmakelists:print(")")
end
@@ -425,14 +425,14 @@ function _add_target_include_directories(cmakelists, target, outputdir)
if includedirs_interface then
cmakelists:print("target_include_directories(%s INTERFACE", target:name())
for _, headerdir in ipairs(includedirs_interface) do
- cmakelists:print(" " .. _get_unix_path(headerdir, outputdir))
+ cmakelists:print(" " .. _get_relative_unix_path(headerdir, outputdir))
end
cmakelists:print(")")
end
-- export config header directory (deprecated)
local configheader = target:configheader()
if configheader then
- cmakelists:print("target_include_directories(%s PUBLIC %s)", target:name(), _get_unix_path(path.directory(configheader), outputdir))
+ cmakelists:print("target_include_directories(%s PUBLIC %s)", target:name(), _get_relative_unix_path(path.directory(configheader), outputdir))
end
end
@@ -445,7 +445,7 @@ function _add_target_sysinclude_directories(cmakelists, target, outputdir)
-- TODO should be `SYSTEM PRIVATE`
cmakelists:print("target_include_directories(%s PRIVATE", target:name())
for _, includedir in ipairs(includedirs) do
- cmakelists:print(" " .. _get_unix_path(includedir, outputdir))
+ cmakelists:print(" " .. _get_relative_unix_path(includedir, outputdir))
end
cmakelists:print(")")
end
@@ -453,7 +453,7 @@ function _add_target_sysinclude_directories(cmakelists, target, outputdir)
if includedirs_interface then
cmakelists:print("target_include_directories(%s INTERFACE", target:name())
for _, headerdir in ipairs(includedirs_interface) do
- cmakelists:print(" " .. _get_unix_path(headerdir, outputdir))
+ cmakelists:print(" " .. _get_relative_unix_path(headerdir, outputdir))
end
cmakelists:print(")")
end
@@ -465,10 +465,10 @@ function _add_target_framework_directories(cmakelists, target, outputdir)
if #frameworkdirs > 0 then
cmakelists:print("target_compile_options(%s PRIVATE", target:name())
for _, frameworkdir in ipairs(frameworkdirs) do
- cmakelists:print(" $<$<COMPILE_LANGUAGE:C>:-F" .. _get_unix_path(frameworkdir, outputdir) .. ">")
- cmakelists:print(" $<$<COMPILE_LANGUAGE:CXX>:-F" .. _get_unix_path(frameworkdir, outputdir) .. ">")
- cmakelists:print(" $<$<COMPILE_LANGUAGE:OBJC>:-F" .. _get_unix_path(frameworkdir, outputdir) .. ">")
- cmakelists:print(" $<$<COMPILE_LANGUAGE:OBJCXX>:-F" .. _get_unix_path(frameworkdir, outputdir) .. ">")
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:C>:-F" .. _get_relative_unix_path(frameworkdir, outputdir) .. ">")
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:CXX>:-F" .. _get_relative_unix_path(frameworkdir, outputdir) .. ">")
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:OBJC>:-F" .. _get_relative_unix_path(frameworkdir, outputdir) .. ">")
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:OBJCXX>:-F" .. _get_relative_unix_path(frameworkdir, outputdir) .. ">")
end
cmakelists:print(")")
local cmake_minver = _get_cmake_minver()
@@ -478,7 +478,7 @@ function _add_target_framework_directories(cmakelists, target, outputdir)
cmakelists:print("target_link_libraries(%s PRIVATE", target:name())
end
for _, frameworkdir in ipairs(frameworkdirs) do
- cmakelists:print(" -F" .. _get_unix_path(frameworkdir, outputdir))
+ cmakelists:print(" -F" .. _get_relative_unix_path(frameworkdir, outputdir))
end
cmakelists:print(")")
end
@@ -486,10 +486,10 @@ function _add_target_framework_directories(cmakelists, target, outputdir)
if frameworkdirs_interface then
cmakelists:print("target_compile_options(%s PRIVATE", target:name())
for _, frameworkdir in ipairs(frameworkdirs_interface) do
- cmakelists:print(" $<$<COMPILE_LANGUAGE:C>:-F" .. _get_unix_path(frameworkdir, outputdir) .. ">")
- cmakelists:print(" $<$<COMPILE_LANGUAGE:CXX>:-F" .. _get_unix_path(frameworkdir, outputdir) .. ">")
- cmakelists:print(" $<$<COMPILE_LANGUAGE:OBJC>:-F" .. _get_unix_path(frameworkdir, outputdir) .. ">")
- cmakelists:print(" $<$<COMPILE_LANGUAGE:OBJCXX>:-F" .. _get_unix_path(frameworkdir, outputdir) .. ">")
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:C>:-F" .. _get_relative_unix_path(frameworkdir, outputdir) .. ">")
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:CXX>:-F" .. _get_relative_unix_path(frameworkdir, outputdir) .. ">")
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:OBJC>:-F" .. _get_relative_unix_path(frameworkdir, outputdir) .. ">")
+ cmakelists:print(" $<$<COMPILE_LANGUAGE:OBJCXX>:-F" .. _get_relative_unix_path(frameworkdir, outputdir) .. ">")
end
cmakelists:print(")")
end
@@ -514,7 +514,7 @@ function _add_target_sourcefiles_flags(cmakelists, target, sourcefile, name, out
local flags = _get_flags_from_fileconfig(fileconfig, outputdir, name)
if flags and #flags > 0 then
cmakelists:print("set_source_files_properties("
- .. _get_unix_path_relative_to_cmake(sourcefile, outputdir)
+ .. _get_relative_unix_path_to_cmake(sourcefile, outputdir)
.. " PROPERTIES COMPILE_OPTIONS")
local flagstrs = {}
for _, flag in ipairs(flags) do
@@ -765,7 +765,7 @@ function _add_target_link_libraries(cmakelists, target, outputdir)
cmakelists:print("target_link_libraries(%s PRIVATE", target:name())
for _, objectfile in ipairs(target:objectfiles()) do
if not objectfiles_set:has(objectfile) then
- cmakelists:print(" " .. _get_unix_path_relative_to_cmake(objectfile, outputdir))
+ cmakelists:print(" " .. _get_relative_unix_path_to_cmake(objectfile, outputdir))
end
end
cmakelists:print(")")
@@ -780,20 +780,20 @@ function _add_target_link_directories(cmakelists, target, outputdir)
if cmake_minver:ge("3.13.0") then
cmakelists:print("target_link_directories(%s PRIVATE", target:name())
for _, linkdir in ipairs(linkdirs) do
- cmakelists:print(" " .. _get_unix_path(linkdir, outputdir))
+ cmakelists:print(" " .. _get_relative_unix_path(linkdir, outputdir))
end
cmakelists:print(")")
else
cmakelists:print("if(MSVC)")
cmakelists:print(" target_link_libraries(%s PRIVATE", target:name())
for _, linkdir in ipairs(linkdirs) do
- cmakelists:print(" -libpath:" .. _get_unix_path(linkdir, outputdir))
+ cmakelists:print(" -libpath:" .. _get_relative_unix_path(linkdir, outputdir))
end
cmakelists:print(" )")
cmakelists:print("else()")
cmakelists:print(" target_link_libraries(%s PRIVATE", target:name())
for _, linkdir in ipairs(linkdirs) do
- cmakelists:print(" -L" .. _get_unix_path(linkdir, outputdir))
+ cmakelists:print(" -L" .. _get_relative_unix_path(linkdir, outputdir))
end
cmakelists:print(" )")
cmakelists:print("endif()")
@@ -836,28 +836,28 @@ function _get_command_string(cmd, outputdir)
for _, v in ipairs(cmd.argv) do
table.insert(argv, _translate_flag(v, outputdir))
end
- local command = _get_unix_path_relative_to_cmake(cmd.program) .. " " .. os.args(argv)
+ local command = _get_relative_unix_path_to_cmake(cmd.program) .. " " .. os.args(argv)
if opt and opt.curdir then
- command = "${CMAKE_COMMAND} -E chdir " .. _get_unix_path_relative_to_cmake(opt.curdir, outputdir) .. " " .. command
+ command = "${CMAKE_COMMAND} -E chdir " .. _get_relative_unix_path_to_cmake(opt.curdir, outputdir) .. " " .. command
end
return command
elseif kind == "cp" then
if os.isdir(cmd.srcpath) then
return string.format("${CMAKE_COMMAND} -E copy_directory %s %s",
- _get_unix_path_relative_to_cmake(cmd.srcpath, outputdir), _get_unix_path_relative_to_cmake(cmd.dstpath, outputdir))
+ _get_relative_unix_path_to_cmake(cmd.srcpath, outputdir), _get_relative_unix_path_to_cmake(cmd.dstpath, outputdir))
else
return string.format("${CMAKE_COMMAND} -E copy %s %s",
- _get_unix_path_relative_to_cmake(cmd.srcpath, outputdir), _get_unix_path_relative_to_cmake(cmd.dstpath, outputdir))
+ _get_relative_unix_path_to_cmake(cmd.srcpath, outputdir), _get_relative_unix_path_to_cmake(cmd.dstpath, outputdir))
end
elseif kind == "rm" then
- return string.format("${CMAKE_COMMAND} -E rm -rf %s", _get_unix_path_relative_to_cmake(cmd.filepath, outputdir))
+ return string.format("${CMAKE_COMMAND} -E rm -rf %s", _get_relative_unix_path_to_cmake(cmd.filepath, outputdir))
elseif kind == "mv" then
return string.format("${CMAKE_COMMAND} -E rename %s %s",
- _get_unix_path_relative_to_cmake(cmd.srcpath, outputdir), _get_unix_path_relative_to_cmake(cmd.dstpath, outputdir))
+ _get_relative_unix_path_to_cmake(cmd.srcpath, outputdir), _get_relative_unix_path_to_cmake(cmd.dstpath, outputdir))
elseif kind == "cd" then
- return string.format("cd %s", _get_unix_path_relative_to_cmake(cmd.dir, outputdir))
+ return string.format("cd %s", _get_relative_unix_path_to_cmake(cmd.dir, outputdir))
elseif kind == "mkdir" then
- return string.format("${CMAKE_COMMAND} -E make_directory %s", _get_unix_path_relative_to_cmake(cmd.dir, outputdir))
+ return string.format("${CMAKE_COMMAND} -E make_directory %s", _get_relative_unix_path_to_cmake(cmd.dir, outputdir))
elseif kind == "show" then
return string.format("echo %s", colors.ignore(cmd.showtext))
end
diff --git a/xmake/plugins/project/ninja/build_ninja.lua b/xmake/plugins/project/ninja/build_ninja.lua
index ebf1fcc2e..a97aac804 100644
--- a/xmake/plugins/project/ninja/build_ninja.lua
+++ b/xmake/plugins/project/ninja/build_ninja.lua
@@ -39,6 +39,67 @@ function _sourcebatch_is_built(sourcebatch)
end
end
+-- escape path
+function _escape_path(filepath)
+ if is_host("windows") then
+ filepath = filepath:gsub('\\', '/')
+ end
+ return filepath
+end
+
+-- tranlate path
+function _translate_path(filepath, outputdir)
+ filepath = path.translate(filepath)
+ if filepath == "" then
+ return ""
+ end
+ if path.is_absolute(filepath) then
+ if filepath:startswith(project.directory()) then
+ return path.relative(filepath, outputdir)
+ end
+ return filepath
+ else
+ return path.relative(path.absolute(filepath), outputdir)
+ end
+end
+
+-- get relative unix path
+function _get_relative_unix_path(filepath, outputdir)
+ filepath = _translate_path(filepath, outputdir)
+ filepath = _escape_path(path.translate(filepath))
+ return os.args(filepath)
+end
+
+-- translate compiler flags
+function _translate_compflags(compflags, outputdir)
+ local flags = {}
+ for _, flag in ipairs(compflags) do
+ for _, pattern in ipairs({"[%-](I)(.*)", "[%-](isystem)(.*)"}) do
+ flag = flag:gsub(pattern, function (flag, dir)
+ dir = _get_relative_unix_path(dir, outputdir)
+ return "-" .. flag .. dir
+ end)
+ end
+ table.insert(flags, flag)
+ end
+ return flags
+end
+
+-- translate linker flags
+function _translate_linkflags(linkflags, outputdir)
+ local flags = {}
+ for _, flag in ipairs(linkflags) do
+ for _, pattern in ipairs({"[%-](L)(.*)", "[%-](F)(.*)"}) do
+ flag = flag:gsub(pattern, function (flag, dir)
+ dir = _get_relative_unix_path(dir, outputdir)
+ return "-" .. flag .. dir
+ end)
+ end
+ table.insert(flags, flag)
+ end
+ return flags
+end
+
-- add header
function _add_header(ninjafile)
ninjafile:print([[# this is the build file for project %s
@@ -50,9 +111,10 @@ function _add_header(ninjafile)
end
-- add rules for generator
-function _add_rules_for_generator(ninjafile)
+function _add_rules_for_generator(ninjafile, outputdir)
+ local projectdir = _get_relative_unix_path(os.projectdir(), outputdir)
ninjafile:print("rule gen")
- ninjafile:print(" command = xmake project -k ninja")
+ ninjafile:print(" command = xmake project -P %s -k ninja", projectdir)
ninjafile:print(" description = regenerating ninja files")
ninjafile:print("")
end
@@ -204,10 +266,10 @@ function _add_rules_for_linker(ninjafile)
end
-- add rules
-function _add_rules(ninjafile)
+function _add_rules(ninjafile, outputdir)
-- add rules for generator
- _add_rules_for_generator(ninjafile)
+ _add_rules_for_generator(ninjafile, outputdir)
-- add rules for complier
_add_rules_for_compiler(ninjafile)
@@ -222,21 +284,24 @@ function _add_build_for_phony(ninjafile, target)
end
-- add build rule for object
-function _add_build_for_object(ninjafile, target, sourcekind, sourcefile, objectfile)
+function _add_build_for_object(ninjafile, target, sourcekind, sourcefile, objectfile, outputdir)
+ objectfile = _get_relative_unix_path(objectfile, outputdir)
+ sourcefile = _get_relative_unix_path(sourcefile, outputdir)
+ local compflags = compiler.compflags(sourcefile, {target = target})
ninjafile:print("build %s: %s %s", objectfile, sourcekind, sourcefile)
- ninjafile:print(" ARGS = %s", os.args(compiler.compflags(sourcefile, {target = target})))
+ ninjafile:print(" ARGS = %s", os.args(_translate_compflags(compflags, outputdir)))
ninjafile:print("")
end
-- add build rule for objects
-function _add_build_for_objects(ninjafile, target, sourcebatch)
+function _add_build_for_objects(ninjafile, target, sourcebatch, outputdir)
for index, objectfile in ipairs(sourcebatch.objectfiles) do
- _add_build_for_object(ninjafile, target, sourcebatch.sourcekind, sourcebatch.sourcefiles[index], objectfile)
+ _add_build_for_object(ninjafile, target, sourcebatch.sourcekind, sourcebatch.sourcefiles[index], objectfile, outputdir)
end
end
-- add build rule for target
-function _add_build_for_target(ninjafile, target)
+function _add_build_for_target(ninjafile, target, outputdir)
-- https://github.com/xmake-io/xmake/issues/2337
target:data_set("plugin.project.kind", "ninja")
@@ -248,14 +313,14 @@ function _add_build_for_target(ninjafile, target)
-- build target
ninjafile:print("# build target: %s", target:name())
- local targetfile = target:targetfile()
+ local targetfile = _get_relative_unix_path(target:targetfile(), outputdir)
ninjafile:print("build %s: phony %s", target:name(), targetfile)
-- build target file
ninjafile:printf("build %s: %s", targetfile, target:linker():kind())
local objectfiles = target:objectfiles()
for _, objectfile in ipairs(objectfiles) do
- ninjafile:write(" " .. objectfile)
+ ninjafile:write(" " .. _get_relative_unix_path(objectfile, outputdir))
end
-- merge objects with rule("utils.merge.object")
for _, sourcebatch in pairs(target:sourcebatches()) do
@@ -268,42 +333,43 @@ function _add_build_for_target(ninjafile, target)
ninjafile:print(" || $")
ninjafile:write(" ")
for _, dep in ipairs(deps) do
- ninjafile:write(" " .. project.target(dep):targetfile())
+ ninjafile:write(" " .. _get_relative_unix_path(project.target(dep):targetfile(), outputdir))
end
end
ninjafile:print("")
- ninjafile:print(" ARGS = %s", os.args(target:linkflags()))
+ ninjafile:print(" ARGS = %s", os.args(_translate_linkflags(target:linkflags(), outputdir)))
ninjafile:print("")
-- build target objects
for _, sourcebatch in table.orderpairs(target:sourcebatches()) do
if _sourcebatch_is_built(sourcebatch) then
- _add_build_for_objects(ninjafile, target, sourcebatch)
+ _add_build_for_objects(ninjafile, target, sourcebatch, outputdir)
end
end
end
-- add build rule for generator
-function _add_build_for_generator(ninjafile)
+function _add_build_for_generator(ninjafile, outputdir)
ninjafile:print("# build build.ninja")
ninjafile:print("build build.ninja: gen $")
local allfiles = project.allfiles()
for idx, projectfile in ipairs(allfiles) do
if not path.is_absolute(projectfile) or projectfile:startswith(os.projectdir()) then
- ninjafile:print(" %s %s", os.args(path.relative(path.absolute(projectfile))), idx < #allfiles and "$" or "")
+ local filepath = _get_relative_unix_path(projectfile, outputdir)
+ ninjafile:print(" %s %s", filepath, idx < #allfiles and "$" or "")
end
end
ninjafile:print("")
end
-- add build rule for targets
-function _add_build_for_targets(ninjafile)
+function _add_build_for_targets(ninjafile, outputdir)
-- begin
ninjafile:print("# build targets\n")
-- add build rule for generator
- _add_build_for_generator(ninjafile)
+ _add_build_for_generator(ninjafile, outputdir)
-- TODO
-- disable precompiled header first
@@ -314,7 +380,7 @@ function _add_build_for_targets(ninjafile)
-- build targets
for _, target in pairs(project.targets()) do
- _add_build_for_target(ninjafile, target)
+ _add_build_for_target(ninjafile, target, outputdir)
end
-- build default
@@ -350,10 +416,10 @@ function make(outputdir)
_add_header(ninjafile)
-- add rules
- _add_rules(ninjafile)
+ _add_rules(ninjafile, outputdir)
-- add build rules for targets
- _add_build_for_targets(ninjafile)
+ _add_build_for_targets(ninjafile, outputdir)
-- close the ninjafile
ninjafile:close()
diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
index ad0c6df5f..64a6f5419 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
@@ -168,8 +168,6 @@ function _make_compflags(sourcefile, targetinfo, vcxprojdir)
-- translate path for -Idir or /Idir
local flags = {}
for _, flag in ipairs(targetinfo.compflags[sourcefile]) do
-
- -- handle external includes as well
for _, pattern in ipairs({"[%-/](I)(.*)", "[%-/](external:I)(.*)"}) do
-- -Idir or /Idir
@@ -178,16 +176,12 @@ function _make_compflags(sourcefile, targetinfo, vcxprojdir)
return "/" .. flag .. dir
end)
end
-
- -- save flag
table.insert(flags, flag)
end
-- add -D__config_$(mode)__ and -D__config_$(arch)__ for the config header
table.insert(flags, "-D__config_" .. targetinfo.mode .. "__")
table.insert(flags, "-D__config_" .. targetinfo.arch .. "__")
-
- -- ok?
return flags
end