Enable pchheader for Codelite. (#1627)

* Enable pchheader for Codelite.

* Factorize code.
This commit is contained in:
Joris Dauphin 2021-05-29 20:19:18 +02:00 committed by GitHub
parent 23f32c2759
commit ebbbb72ab7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 62 additions and 79 deletions

View File

@ -188,7 +188,6 @@
} }
end end
function m.compiler(cfg) function m.compiler(cfg)
if configuration_iscustombuild(cfg) or configuration_isfilelist(cfg) then if configuration_iscustombuild(cfg) or configuration_isfilelist(cfg) then
_p(3, '<Compiler Required="no"/>') _p(3, '<Compiler Required="no"/>')
@ -201,9 +200,14 @@
local cxxflags = table.concat(table.join(sysincludedirs, toolset.getcxxflags(cfg), forceincludes, cfg.buildoptions), ";") local cxxflags = table.concat(table.join(sysincludedirs, toolset.getcxxflags(cfg), forceincludes, cfg.buildoptions), ";")
local cflags = table.concat(table.join(sysincludedirs, toolset.getcflags(cfg), forceincludes, cfg.buildoptions), ";") local cflags = table.concat(table.join(sysincludedirs, toolset.getcflags(cfg), forceincludes, cfg.buildoptions), ";")
local asmflags = "" local asmflags = ""
local pch = "" local pch = p.tools.gcc.getpch(cfg)
local usepch = "yes"
if pch == nil then
pch = "";
usepch = "no"
end
_x(3, '<Compiler Options="%s" C_Options="%s" Assembler="%s" Required="yes" PreCompiledHeader="%s" PCHInCommandLine="no" UseDifferentPCHFlags="no" PCHFlags="">', cxxflags, cflags, asmflags, pch) _x(3, '<Compiler Options="%s" C_Options="%s" Assembler="%s" Required="yes" PreCompiledHeader="%s" PCHInCommandLine="%s" UseDifferentPCHFlags="no" PCHFlags="">', cxxflags, cflags, asmflags, pch, usepch)
for _, includedir in ipairs(cfg.includedirs) do for _, includedir in ipairs(cfg.includedirs) do
_x(4, '<IncludePath Value="%s"/>', project.getrelative(cfg.project, includedir)) _x(4, '<IncludePath Value="%s"/>', project.getrelative(cfg.project, includedir))

View File

@ -93,6 +93,16 @@
]] ]]
end end
function suite.OnProjectCfg_Pch()
pchheader "pch.h"
prepare()
codelite.project.compiler(cfg)
test.capture [[
<Compiler Options="" C_Options="" Assembler="" Required="yes" PreCompiledHeader="pch.h" PCHInCommandLine="yes" UseDifferentPCHFlags="no" PCHFlags="">
</Compiler>
]]
end
function suite.OnProjectCfg_Linker() function suite.OnProjectCfg_Linker()
prepare() prepare()
codelite.project.linker(cfg) codelite.project.linker(cfg)

View File

@ -567,51 +567,16 @@ end
function make.pch(cfg, toolset) function make.pch(cfg, toolset)
local pch = p.tools.gcc.getpch(cfg)
-- If there is no header, or if PCH has been disabled, I can early out -- If there is no header, or if PCH has been disabled, I can early out
if not cfg.pchheader or cfg.flags.NoPCH then if pch == nil then
return return
end end
-- Visual Studio requires the PCH header to be specified in the same way
-- it appears in the #include statements used in the source code; the PCH
-- source actual handles the compilation of the header. GCC compiles the
-- header file directly, and needs the file's actual file system path in
-- order to locate it.
-- To maximize the compatibility between the two approaches, see if I can
-- locate the specified PCH header on one of the include file search paths
-- and, if so, adjust the path automatically so the user doesn't have
-- add a conditional configuration to the project script.
local pch = cfg.pchheader
local found = false
-- test locally in the project folder first (this is the most likely location)
local testname = path.join(cfg.project.basedir, pch)
if os.isfile(testname) then
pch = project.getrelative(cfg.project, testname)
found = true
else
-- else scan in all include dirs.
for _, incdir in ipairs(cfg.includedirs) do
testname = path.join(incdir, pch)
if os.isfile(testname) then
pch = project.getrelative(cfg.project, testname)
found = true
break
end
end
end
if not found then
pch = project.getrelative(cfg.project, path.getabsolute(pch))
end
_x(' PCH = %s', pch) _x(' PCH = %s', pch)
_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch') _p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')
end end
function make.pchRules(prj) function make.pchRules(prj)
_p('ifneq (,$(PCH))') _p('ifneq (,$(PCH))')
_p('$(OBJECTS): $(GCH) $(PCH) | $(OBJDIR)') _p('$(OBJECTS): $(GCH) $(PCH) | $(OBJDIR)')

View File

@ -368,46 +368,12 @@
function cpp.pch(cfg, toolset) function cpp.pch(cfg, toolset)
local pch = p.tools.gcc.getpch(cfg)
-- If there is no header, or if PCH has been disabled, I can early out -- If there is no header, or if PCH has been disabled, I can early out
if not cfg.pchheader or cfg.flags.NoPCH then if pch == nil then
return return
end end
-- Visual Studio requires the PCH header to be specified in the same way
-- it appears in the #include statements used in the source code; the PCH
-- source actual handles the compilation of the header. GCC compiles the
-- header file directly, and needs the file's actual file system path in
-- order to locate it.
-- To maximize the compatibility between the two approaches, see if I can
-- locate the specified PCH header on one of the include file search paths
-- and, if so, adjust the path automatically so the user doesn't have
-- add a conditional configuration to the project script.
local pch = cfg.pchheader
local found = false
-- test locally in the project folder first (this is the most likely location)
local testname = path.join(cfg.project.basedir, pch)
if os.isfile(testname) then
pch = project.getrelative(cfg.project, testname)
found = true
else
-- else scan in all include dirs.
for _, incdir in ipairs(cfg.includedirs) do
testname = path.join(incdir, pch)
if os.isfile(testname) then
pch = project.getrelative(cfg.project, testname)
found = true
break
end
end
end
if not found then
pch = project.getrelative(cfg.project, path.getabsolute(pch))
end
p.outln('PCH = ' .. pch) p.outln('PCH = ' .. pch)
p.outln('PCH_PLACEHOLDER = $(OBJDIR)/$(notdir $(PCH))') p.outln('PCH_PLACEHOLDER = $(OBJDIR)/$(notdir $(PCH))')
p.outln('GCH = $(PCH_PLACEHOLDER).gch') p.outln('GCH = $(PCH_PLACEHOLDER).gch')

View File

@ -297,6 +297,44 @@
return result return result
end end
-- relative pch file path if any
function gcc.getpch(cfg)
-- If there is no header, or if PCH has been disabled, I can early out
if not cfg.pchheader or cfg.flags.NoPCH then
return nil
end
-- Visual Studio requires the PCH header to be specified in the same way
-- it appears in the #include statements used in the source code; the PCH
-- source actual handles the compilation of the header. GCC compiles the
-- header file directly, and needs the file's actual file system path in
-- order to locate it.
-- To maximize the compatibility between the two approaches, see if I can
-- locate the specified PCH header on one of the include file search paths
-- and, if so, adjust the path automatically so the user doesn't have
-- add a conditional configuration to the project script.
local pch = cfg.pchheader
local found = false
-- test locally in the project folder first (this is the most likely location)
local testname = path.join(cfg.project.basedir, pch)
if os.isfile(testname) then
return project.getrelative(cfg.project, testname)
else
-- else scan in all include dirs.
for _, incdir in ipairs(cfg.includedirs) do
testname = path.join(incdir, pch)
if os.isfile(testname) then
return project.getrelative(cfg.project, testname)
end
end
end
return project.getrelative(cfg.project, path.getabsolute(pch))
end
-- --
-- Return a list of decorated rpaths -- Return a list of decorated rpaths
-- --