in newt/builder/cmake.go [209:316]
func (b *Builder) CMakeTargetWrite(w io.Writer, targetCompiler *toolchain.Compiler) error {
bpkgs := b.sortedBuildPackages()
var compileFlags []string
var linkFlags []string
var libraries []string
c := targetCompiler
c.AddInfo(b.GetCompilerInfo())
builtPackages := []*BuildPackage{}
for _, bpkg := range bpkgs {
builtPackage, err := b.CMakeBuildPackageWrite(w, bpkg,
&linkFlags, &libraries)
if err != nil {
return err
}
if builtPackage != nil {
builtPackages = append(builtPackages, builtPackage)
}
}
elfName := "cmake_" + filepath.Base(b.AppElfPath())
fmt.Fprintf(w, "# Generating code for %s\n", elfName)
var targetObjectsBuffer bytes.Buffer
for _, bpkg := range builtPackages {
targetObjectsBuffer.WriteString(fmt.Sprintf("%s ",
EscapePkgName(bpkg.rpkg.Lpkg.NameWithRepo())))
}
for _, filename := range libraries {
targetObjectsBuffer.WriteString(fmt.Sprintf("%s ",
ExtractLibraryName(filename)))
}
elfOutputDir := trimProjectPath(filepath.Dir(b.AppElfPath()))
fmt.Fprintf(w, "file(WRITE %s \"\")\n", replaceBackslashes(filepath.Join(elfOutputDir, "null.c")))
fmt.Fprintf(w, "add_executable(%s %s)\n\n", elfName,
replaceBackslashes(filepath.Join(elfOutputDir, "null.c")))
if c.GetLdResolveCircularDeps() {
fmt.Fprintf(w, "target_link_libraries(%s -Wl,--start-group %s -Wl,--end-group)\n",
elfName, targetObjectsBuffer.String())
} else {
fmt.Fprintf(w, "target_link_libraries(%s %s)\n",
elfName, targetObjectsBuffer.String())
}
compileFlags = append(compileFlags, c.GetCompilerInfo().Cflags...)
compileFlags = append(compileFlags, c.GetLocalCompilerInfo().Cflags...)
compileFlags = append(compileFlags, c.GetCompilerInfo().CXXflags...)
compileFlags = append(compileFlags, c.GetLocalCompilerInfo().CXXflags...)
compileFlags = util.SortFields(compileFlags...)
fmt.Fprintf(w,
`set_property(TARGET %s APPEND_STRING
PROPERTY
COMPILE_FLAGS
"%s")`,
elfName,
strings.Join(escapeFlagsSlice(compileFlags), " "))
fmt.Fprintln(w)
lFlags := append(c.GetCompilerInfo().Lflags, c.GetLocalCompilerInfo().Lflags...)
lFlags = append(lFlags, linkFlags...)
lFlags = util.SortFields(lFlags...)
for _, ld := range c.LinkerScripts {
lFlags = append(lFlags, "-T"+ld)
}
var cFlags []string
cFlags = append(cFlags, c.GetCompilerInfo().Cflags...)
cFlags = append(cFlags, c.GetLocalCompilerInfo().Cflags...)
cFlags = util.SortFields(cFlags...)
lFlags = append(lFlags, cFlags...)
var cxxFlags []string
cxxFlags = append(cxxFlags, c.GetCompilerInfo().CXXflags...)
cxxFlags = append(cxxFlags, c.GetLocalCompilerInfo().CXXflags...)
cxxFlags = util.SortFields(cxxFlags...)
lFlags = append(lFlags, cxxFlags...)
fmt.Fprintf(w,
`set_target_properties(%s
PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY %s
LIBRARY_OUTPUT_DIRECTORY %s
RUNTIME_OUTPUT_DIRECTORY %s
LINK_FLAGS "%s"
LINKER_LANGUAGE C)`,
elfName,
elfOutputDir,
elfOutputDir,
elfOutputDir,
strings.Join(escapeFlagsSlice(lFlags), " "))
fmt.Fprintln(w)
libs := strings.Join(getLibsFromLinkerFlags(lFlags), " ")
fmt.Fprintf(w, "# Workaround for gcc linker woes\n")
fmt.Fprintf(w, "set(CMAKE_C_LINK_EXECUTABLE \"${CMAKE_C_LINK_EXECUTABLE} %s\")\n", libs)
fmt.Fprintln(w)
return nil
}