summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2017-07-28 13:52:22 +0800
committerruki <[email protected]>2017-07-28 13:52:22 +0800
commitf09e86f3f7986a71d6b376c754df3e9209ca2900 (patch)
treef7820a78ca048ea978c4423c32ef38705a7bd86a
parenteb2d597f3d8ca3b9795d02c3a1ee46e2956f0276 (diff)
add precompiled source
-rw-r--r--.gitignore2
-rw-r--r--tests/projects/precompiled_header_c++/src/header.cpp2
-rw-r--r--tests/projects/precompiled_header_c++/src/header.h (renamed from tests/projects/precompiled_header_c++/src/header.hpp)0
-rw-r--r--tests/projects/precompiled_header_c++/src/main.cpp2
-rw-r--r--tests/projects/precompiled_header_c++/src/test.cpp2
-rw-r--r--tests/projects/precompiled_header_c++/src/test2.cpp2
-rw-r--r--tests/projects/precompiled_header_c++/src/test3.cpp2
-rw-r--r--tests/projects/precompiled_header_c++/src/test4.cpp2
-rw-r--r--tests/projects/precompiled_header_c++/src/test5.cpp2
-rw-r--r--tests/projects/precompiled_header_c++/src/test6.cpp2
-rw-r--r--tests/projects/precompiled_header_c++/src/test7.cpp2
-rw-r--r--tests/projects/precompiled_header_c++/src/test8.cpp2
-rw-r--r--tests/projects/precompiled_header_c++/xmake.lua4
-rw-r--r--xmake/actions/build/kinds/object.lua17
-rw-r--r--xmake/core/project/target.lua32
-rw-r--r--xmake/modules/core/tools/gcc.lua33
16 files changed, 85 insertions, 23 deletions
diff --git a/.gitignore b/.gitignore
index d23dc702a..af6daaa36 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,7 +25,7 @@
*.deb
*.zip
*.gch
-*.d
+*.gch.d
cscope.*
gmon.out
other
diff --git a/tests/projects/precompiled_header_c++/src/header.cpp b/tests/projects/precompiled_header_c++/src/header.cpp
new file mode 100644
index 000000000..79395fab8
--- /dev/null
+++ b/tests/projects/precompiled_header_c++/src/header.cpp
@@ -0,0 +1,2 @@
+#include "header.h"
+
diff --git a/tests/projects/precompiled_header_c++/src/header.hpp b/tests/projects/precompiled_header_c++/src/header.h
index 39e07b7ce..39e07b7ce 100644
--- a/tests/projects/precompiled_header_c++/src/header.hpp
+++ b/tests/projects/precompiled_header_c++/src/header.h
diff --git a/tests/projects/precompiled_header_c++/src/main.cpp b/tests/projects/precompiled_header_c++/src/main.cpp
index ac88728f1..b152518bc 100644
--- a/tests/projects/precompiled_header_c++/src/main.cpp
+++ b/tests/projects/precompiled_header_c++/src/main.cpp
@@ -1,6 +1,6 @@
// main.cpp
-#include "header.hpp"
+#include "header.h"
int main() {
return 0;
diff --git a/tests/projects/precompiled_header_c++/src/test.cpp b/tests/projects/precompiled_header_c++/src/test.cpp
index 536d30aca..e9d6c83d9 100644
--- a/tests/projects/precompiled_header_c++/src/test.cpp
+++ b/tests/projects/precompiled_header_c++/src/test.cpp
@@ -1,6 +1,6 @@
// main.cpp
-#include "header.hpp"
+#include "header.h"
int test()
{
diff --git a/tests/projects/precompiled_header_c++/src/test2.cpp b/tests/projects/precompiled_header_c++/src/test2.cpp
index d46e45a7a..596359cd2 100644
--- a/tests/projects/precompiled_header_c++/src/test2.cpp
+++ b/tests/projects/precompiled_header_c++/src/test2.cpp
@@ -1,6 +1,6 @@
// main.cpp
-#include "header.hpp"
+#include "header.h"
int test2()
{
diff --git a/tests/projects/precompiled_header_c++/src/test3.cpp b/tests/projects/precompiled_header_c++/src/test3.cpp
index 5decf9960..b4ce69b0f 100644
--- a/tests/projects/precompiled_header_c++/src/test3.cpp
+++ b/tests/projects/precompiled_header_c++/src/test3.cpp
@@ -1,6 +1,6 @@
// main.cpp
-#include "header.hpp"
+#include "header.h"
int test3()
{
diff --git a/tests/projects/precompiled_header_c++/src/test4.cpp b/tests/projects/precompiled_header_c++/src/test4.cpp
index 4aad9efa4..a92803eb7 100644
--- a/tests/projects/precompiled_header_c++/src/test4.cpp
+++ b/tests/projects/precompiled_header_c++/src/test4.cpp
@@ -1,6 +1,6 @@
// main.cpp
-#include "header.hpp"
+#include "header.h"
int test4()
{
diff --git a/tests/projects/precompiled_header_c++/src/test5.cpp b/tests/projects/precompiled_header_c++/src/test5.cpp
index d7a227c95..2a3e7066c 100644
--- a/tests/projects/precompiled_header_c++/src/test5.cpp
+++ b/tests/projects/precompiled_header_c++/src/test5.cpp
@@ -1,6 +1,6 @@
// main.cpp
-#include "header.hpp"
+#include "header.h"
int test5()
{
diff --git a/tests/projects/precompiled_header_c++/src/test6.cpp b/tests/projects/precompiled_header_c++/src/test6.cpp
index 4caf0d0d6..efbd7c6c1 100644
--- a/tests/projects/precompiled_header_c++/src/test6.cpp
+++ b/tests/projects/precompiled_header_c++/src/test6.cpp
@@ -1,6 +1,6 @@
// main.cpp
-#include "header.hpp"
+#include "header.h"
int test6()
{
diff --git a/tests/projects/precompiled_header_c++/src/test7.cpp b/tests/projects/precompiled_header_c++/src/test7.cpp
index be5bd8939..24aeff619 100644
--- a/tests/projects/precompiled_header_c++/src/test7.cpp
+++ b/tests/projects/precompiled_header_c++/src/test7.cpp
@@ -1,6 +1,6 @@
// main.cpp
-#include "header.hpp"
+#include "header.h"
int test7()
{
diff --git a/tests/projects/precompiled_header_c++/src/test8.cpp b/tests/projects/precompiled_header_c++/src/test8.cpp
index a5e45d8ea..6ad5680a6 100644
--- a/tests/projects/precompiled_header_c++/src/test8.cpp
+++ b/tests/projects/precompiled_header_c++/src/test8.cpp
@@ -1,6 +1,6 @@
// main.cpp
-#include "header.hpp"
+#include "header.h"
int test8()
{
diff --git a/tests/projects/precompiled_header_c++/xmake.lua b/tests/projects/precompiled_header_c++/xmake.lua
index 322d27579..6ad93c1e1 100644
--- a/tests/projects/precompiled_header_c++/xmake.lua
+++ b/tests/projects/precompiled_header_c++/xmake.lua
@@ -8,8 +8,8 @@ target("main")
set_languages("cxx11")
-- set precompiled header
- set_precompiled_header("src/header.hpp")
+ set_precompiled_header("src/header.h", "src/header.cpp")
-- add files
- add_files("src/*.cpp")
+ add_files("src/*.cpp|header.cpp")
diff --git a/xmake/actions/build/kinds/object.lua b/xmake/actions/build/kinds/object.lua
index 045045041..2b801aeb0 100644
--- a/xmake/actions/build/kinds/object.lua
+++ b/xmake/actions/build/kinds/object.lua
@@ -27,6 +27,7 @@ import("core.base.option")
import("core.tool.compiler")
import("core.tool.extractor")
import("core.project.config")
+import("core.language.language")
import("detect.tools.find_ccache")
-- build the object from the *.[o|obj] source file
@@ -101,10 +102,7 @@ function _build_object(target, buildinfo, index, sourcebatch, ccache)
table.insert(depfiles, sourcefile)
-- add precompiled header to the dependent files
- local precompiled_header = target:get("precompiled_header")
- if precompiled_header then
- table.insert(depfiles, precompiled_header)
- end
+ table.join2(depfiles, target:pcsourcefile())
-- check the dependent files are modified?
local modified = false
@@ -232,7 +230,7 @@ end
function _build_precompiled_header(target, buildinfo)
-- get the precompiled header
- local precompiled_header = target:get("precompiled_header")
+ local precompiled_header, precompiled_source = target:pcsourcefile()
if not precompiled_header then
return
end
@@ -244,7 +242,14 @@ function _build_precompiled_header(target, buildinfo)
local sourcefile = precompiled_header
local objectfile = target:pcheaderfile()
local incdepfile = objectfile .. ".d"
- local sourcekind = sourcekinds[path.extension(precompiled_header)] or "cc"
+
+ -- init sourcekind
+ local sourcekind = nil
+ if precompiled_source then
+ sourcekind = language.sourcekind_of(precompiled_source)
+ else
+ sourcekind = sourcekinds[path.extension(precompiled_header)] or "cc"
+ end
-- init source batch
local sourcebatch = {sourcekind = sourcekind, sourcefiles = {sourcefile}, objectfiles = {objectfile}, incdepfiles = {incdepfile}}
diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua
index ee033a892..7999ee2de 100644
--- a/xmake/core/project/target.lua
+++ b/xmake/core/project/target.lua
@@ -711,11 +711,41 @@ function target:configheader(outputdir)
return configheader, outputheader
end
+-- get the precompiled source file (.[h|hpp], .[c|cpp])
+function target:pcsourcefile()
+
+ -- get it from the cache first
+ if self._PCSOURCEFILE then
+ return unpack(self._PCSOURCEFILE)
+ end
+
+ -- get the precompiled header and source file
+ local headerfile = nil
+ local sourcefile = nil
+ for _, file in ipairs(table.wrap(self:get("precompiled_header"))) do
+ local extension = path.extension(file)
+ if not headerfile and extension:startswith(".h") then
+ headerfile = file
+ else
+ sourcefile = file
+ end
+ if headerfile and sourcefile then
+ break
+ end
+ end
+
+ -- save to cache
+ self._PCSOURCEFILE = {headerfile, sourcefile}
+
+ -- ok?
+ return headerfile, sourcefile
+end
+
-- get the precompiled header file (xxx.h.pch)
function target:pcheaderfile()
-- get the precompiled header file in the object directory
- local precompiled_header = self:get("precompiled_header")
+ local precompiled_header = self:pcsourcefile()
if precompiled_header then
-- get it from the cache first
diff --git a/xmake/modules/core/tools/gcc.lua b/xmake/modules/core/tools/gcc.lua
index 4f53cc19c..254f3301a 100644
--- a/xmake/modules/core/tools/gcc.lua
+++ b/xmake/modules/core/tools/gcc.lua
@@ -252,10 +252,13 @@ end
-- make the precompiled header flag
function nf_precompiled_header(self, headerfile, target)
- if self:name() == "clang" then
- return "-include " .. headerfile .. " -include-pch " .. target:pcheaderfile()
- else
- return "-include " .. headerfile
+ local extension = path.extension(headerfile)
+ if extension == ".h" or extension == ".hpp" then
+ if self:name() == "clang" then
+ return "-include " .. headerfile .. " -include-pch " .. target:pcheaderfile()
+ else
+ return "-include " .. headerfile
+ end
end
end
@@ -280,6 +283,15 @@ function _include_deps(self, sourcefile, flags)
-- the temporary file
local tmpfile = os.tmpfile()
+ -- uses pchflags for precompiled header
+ if _g._PCHFLAGS then
+ local key = sourcefile .. tostring(flags)
+ local pchflags = _g._PCHFLAGS[key]
+ if pchflags then
+ flags = pchflags
+ end
+ end
+
-- generate it
os.runv(self:program(), table.join("-c", "-E", "-MM", flags or {}, "-o", tmpfile, sourcefile))
@@ -304,6 +316,10 @@ end
-- make the complie arguments list for the precompiled header
function _compargv1_pch(self, headerfile, objectfile, flags)
+ -- init key and cache
+ local key = headerfile .. tostring(flags)
+ _g._PCHFLAGS = _g._PCHFLAGS or {}
+
-- remove "-include xxx.h" and "-include-pch xxx.pch"
local pchflags = {}
local include = false
@@ -316,6 +332,15 @@ function _compargv1_pch(self, headerfile, objectfile, flags)
end
end
+ -- compile header.h as c++?
+ if self:kind() == "cxx" and headerfile:endswith(".h") then
+ table.insert(pchflags, "-x")
+ table.insert(pchflags, "c++-header")
+ end
+
+ -- save pchflags to cache
+ _g._PCHFLAGS[key] = pchflags
+
-- make complie arguments list
return self:program(), table.join("-c", pchflags, "-o", objectfile, headerfile)
end