From 788ae3e0266bdb12bdff6c260dda2e3bcbdfc79c Mon Sep 17 00:00:00 2001 From: Flu0r1ne Date: Mon, 6 Sep 2021 01:58:42 -0500 Subject: Add directives for compiler options and shared linking --- adapters/gtest/config.go | 42 ++++++++++++++++++-------------------- adapters/gtest/executable.go | 43 ++++++++++++++++++++++++++------------- adapters/gtest/templating.go | 48 +++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 93 insertions(+), 40 deletions(-) diff --git a/adapters/gtest/config.go b/adapters/gtest/config.go index 533f266..71b5cca 100644 --- a/adapters/gtest/config.go +++ b/adapters/gtest/config.go @@ -13,21 +13,25 @@ const ( ) type Defaults struct { - Name string - Suite string - Testfile string - Srcs []string - Timeout uint + Name string + Suite string + Testfile string + Srcs []string + Timeout uint + Include_src *bool + Compiler_options string } func (child *Defaults) Inherit(p interface{}) { parent := p.(*Defaults) - if(child.Name == "") { child.Name = parent.Name } - if(child.Suite == "") { child.Suite = parent.Suite } - if(child.Testfile == "") { child.Testfile = parent.Testfile } - if(len(child.Srcs) == 0) { child.Srcs = parent.Srcs } - if(child.Timeout == 0) { child.Timeout = parent.Timeout } + if(child.Name == "") { child.Name = parent.Name } + if(child.Suite == "") { child.Suite = parent.Suite } + if(child.Testfile == "") { child.Testfile = parent.Testfile } + if(len(child.Srcs) == 0) { child.Srcs = parent.Srcs } + if(child.Timeout == 0) { child.Timeout = parent.Timeout } + if(child.Compiler_options == "") { child.Compiler_options = parent.Compiler_options } + if(child.Include_src == nil) { child.Include_src = parent.Include_src} } @@ -47,6 +51,11 @@ func (c * Config) finalize(path string) { if c.Timeout == 0 { c.Timeout = DEFAULT_TIMEOUT; } + + if c.Include_src == nil { + c.Include_src = new(bool) + *c.Include_src = true + } } func srcList(srcdir string, srcs []string) string { @@ -61,19 +70,6 @@ func srcList(srcdir string, srcs []string) string { return builder.String() } -func cmakeUnits(e []executable, dirs planr.DirConfig) []cmakeUnit { - - units := make([]cmakeUnit, len(e)) - for i, exe := range e { - testpath := path.Join(dirs.Tests(), exe.testpath) - srclist := srcList(dirs.Src(), exe.srcs) - - units[i] = cmakeUnit { exe.exeNm, testpath, srclist } - } - - return units -} - func finalizeConfigs(tcs []planr.TestCase) { for i := range tcs { cfg := tcs[i].AdapterConfig().(*Config) diff --git a/adapters/gtest/executable.go b/adapters/gtest/executable.go index 25c83c1..80560c5 100644 --- a/adapters/gtest/executable.go +++ b/adapters/gtest/executable.go @@ -12,14 +12,22 @@ import ( "sort" "context" - "golang.flu0r1ne.net/planr" -) + "golang.flu0r1ne.net/planr") type executable struct { - exeNm string - testpath string - srcs []string - tcs []planr.TestCase + exeNm string + testpath string + srcs []string + includeSrc bool + compilerOptions string + tcs []planr.TestCase +} + +func dieConflictingExeProperty(exe executable, tc planr.TestCase, property string) { + log.Fatalf( + "Two test cases (including %s) belonging to the same executable (%s) have one or more conflicting properties\nProperty :%s", + tc.Cname, exe.testpath, property, + ) } func createExecutables(tcs []planr.TestCase) []executable { @@ -39,10 +47,12 @@ func createExecutables(tcs []planr.TestCase) []executable { exe := executable { - planr.Cname("", file), - file, - cfg.Srcs, - exeTcs, + exeNm: planr.Cname("", file), + testpath: file, + srcs: cfg.Srcs, + includeSrc: *cfg.Include_src, + compilerOptions: cfg.Compiler_options, + tcs: exeTcs, } exes[file] = exe @@ -53,10 +63,15 @@ func createExecutables(tcs []planr.TestCase) []executable { // We could create two different executables for each source list // But, that would be confusing so we're going to disallow it if !reflect.DeepEqual(exe.srcs, cfg.Srcs) { - log.Fatalf( - "Two test case definitions %s and %s have different lists of sources", - exe.testpath, cfg.Testfile, - ) + dieConflictingExeProperty(exe, tc, "srcs") + } + + if exe.compilerOptions != cfg.Compiler_options { + dieConflictingExeProperty(exe, tc, "compiler_options") + } + + if exe.includeSrc != *cfg.Include_src { + dieConflictingExeProperty(exe, tc, "include_src") } exe.tcs = append(exe.tcs, tc) diff --git a/adapters/gtest/templating.go b/adapters/gtest/templating.go index 41c54c1..2380db9 100644 --- a/adapters/gtest/templating.go +++ b/adapters/gtest/templating.go @@ -5,15 +5,39 @@ import ( "log" "os" "golang.flu0r1ne.net/planr" + "path" "text/template" ) type cmakeUnit struct { - ExeNm string - File string - Srcs string + ExeNm string + File string + Srcdir string + IncludeSrc bool + Srcs string + CompilerOptions string }; +func cmakeUnits(e []executable, dirs planr.DirConfig) []cmakeUnit { + + units := make([]cmakeUnit, len(e)) + for i, exe := range e { + testpath := path.Join(dirs.Tests(), exe.testpath) + srclist := srcList(dirs.Src(), exe.srcs) + + units[i] = cmakeUnit { + ExeNm: exe.exeNm, + File: testpath, + IncludeSrc: exe.includeSrc, + Srcdir: dirs.Src(), + Srcs: srclist, + CompilerOptions: compilerOptionsCmake(exe), + } + } + + return units +} + func generateCmakeScript(out string, units []cmakeUnit) { file, err := os.OpenFile(out, os.O_RDWR | os.O_CREATE, 0644) defer func () { @@ -39,6 +63,13 @@ func generateCmakeScript(out string, units []cmakeUnit) { } } +func compilerOptionsCmake(e executable) string { + if e.compilerOptions == "" { + return "" + } + + return "target_compile_options(\"" + e.exeNm + "\" PRIVATE " + e.compilerOptions + ")"; +} // TODO: Add comments func unitTemplate() *template.Template { @@ -54,6 +85,14 @@ add_executable( {{.Srcs}} ) +{{.CompilerOptions}} + +{{ if .IncludeSrc }} + +target_include_directories("{{.ExeNm}}" PRIVATE "{{.Srcdir}}") + +{{ end }} + target_link_libraries( "{{.ExeNm}}" gtest_main @@ -85,6 +124,7 @@ func writeCmakeBoilerplate(w io.Writer) { }) } +// TODO: Make CXX Version Editable func boilderTemplate() *template.Template { tmpl, err := template.New("gtest_boilerplate").Parse(` # AUTOMATICALLY GENERATED BY PLANR VERSION {{.Version}} @@ -99,6 +139,8 @@ FetchContent_Declare( URL {{.Url}} ) +set(CMAKE_CXX_STANDARD 17) + include(GoogleTest) FetchContent_MakeAvailable(googletest) `) -- cgit v1.2.3