Skip to content
This repository has been archived by the owner on Aug 1, 2022. It is now read-only.

Qbs support #22

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/qpm.io/common/messages/qpm.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions src/qpm.io/common/messages/qpm.proto
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@ message Package {
string name = 1;
string email = 2;
}

message Plugin {
string class = 1;
string uri = 2;
}

string name = 1;
string description = 2;
Expand All @@ -67,6 +72,9 @@ message Package {
LicenseType license = 7;
string pri_filename = 8;
string webpage = 10;
repeated Plugin plugins = 11;
repeated string headers = 12;
string qbs_filename = 13;
}

message Dependency {
Expand Down
7 changes: 7 additions & 0 deletions src/qpm.io/common/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,13 @@ func (pw PackageWrapper) PriFile() string {
return dotUnderscore(pw.Package.Name) + ".pri"
}

func (pw PackageWrapper) QbsFile() string {
if pw.QbsFilename != "" {
return pw.QbsFilename
}
return dotUnderscore(pw.Package.Name) + ".qbs"
}

func (pw PackageWrapper) QrcFile() string {
return dotUnderscore(pw.Package.Name) + ".qrc"
}
Expand Down
137 changes: 137 additions & 0 deletions src/qpm.io/qpm/commands/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,24 @@ var packageFuncs = template.FuncMap{
return abs
}
},
"relHeaderFile": func(vendorDir string, dep *common.PackageWrapper, headerFile string) string {
abs := filepath.Join(dep.RootDir(), headerFile)
rel, err := filepath.Rel(vendorDir, abs)
if err == nil {
return rel
} else {
return abs
}
},
"relQbsFile": func(vendorDir string, dep *common.PackageWrapper) string {
abs := filepath.Join(dep.RootDir(), dep.QbsFile())
rel, err := filepath.Rel(vendorDir, abs)
if err == nil {
return rel
} else {
return abs
}
},
}

var (
Expand All @@ -39,12 +57,70 @@ DEFINES += QPM_INIT\\(E\\)=\"E.addImportPath(QStringLiteral(\\\"qrc:/\\\"));\"
DEFINES += QPM_USE_NS
INCLUDEPATH += $$PWD
QML_IMPORT_PATH += $$PWD
HEADERS += $$PWD/vendor.h
{{$vendirDir := .VendorDir}}
{{range $dep := .Dependencies}}
include($$PWD/{{relPriFile $vendirDir $dep}}){{end}}
`))
)

var (
// This template is very dense to avoid excessive whitespace in the generated code.
// We can address this in a future version of Go (1.6?):
// https://github.com/golang/go/commit/e6ee26a03b79d0e8b658463bdb29349ca68e1460
vendorHeader = template.Must(template.New("vendorHeader").Funcs(packageFuncs).Parse(`
#include <QQmlEngine>
#include <QCoreApplication>

{{$vendirDir := .VendorDir}}
{{range $dep := .Dependencies}}
{{range $header := $dep.Package.Headers}}
#include "{{relHeaderFile $vendirDir $dep $header}}"
{{end}}
{{end}}

namespace qpm {

void init(const QCoreApplication &app, QQmlEngine &engine) {
// Add qml components
engine.addImportPath(QStringLiteral("qrc:/"));

// Add C++ components
{{range $dep := .Dependencies}}
{{range $plugin := $dep.Package.Plugins}}
// {{$plugin}}
{{$plugin.Class}} pluginInstance_{{$plugin.Class}};
pluginInstance_{{$plugin.Class}}.registerTypes("{{$plugin.Uri}}");
pluginInstance_{{$plugin.Class}}.initializeEngine(&engine, "{{$plugin.Uri}}");
{{end}}
{{end}}
}

}
`))
vendorQbs = template.Must(template.New("vendorQbs").Funcs(packageFuncs).Parse(`
import qbs 1.0
{{$vendirDir := .VendorDir}}
Project {
references: [
{{range $dep := .Dependencies}}
"{{relQbsFile $vendirDir $dep}}"
{{end}}
]
Product {
name: "vendor"
Export {
{{range $dep := .Dependencies}}
Depends { name: "{{$dep.Name}}" }
{{end}}
Depends { name: "cpp" }
cpp.includePaths: ["."]
}
}
}
`))
)

type ProgressProxyReader struct {
io.Reader
total int64
Expand Down Expand Up @@ -247,9 +323,42 @@ func (i *InstallCommand) postInstall() error {
i.Error(err)
return err
}
if err := GenerateVendorHeader(i.vendorDir, i.pkg); err != nil {
i.Error(err)
return err
}
if err := GenerateVendorQbs(i.vendorDir, i.pkg); err != nil {
i.Error(err)
return err
}
return nil
}

func GenerateVendorHeader(vendorDir string, pkg *common.PackageWrapper) error {
depMap, err := common.LoadPackages(vendorDir)
if err != nil {
return err
}

var deps []*common.PackageWrapper
for _, dep := range depMap {
deps = append(deps, dep)
}

vendorHeaderFile := filepath.Join(vendorDir, core.Vendor+".h")

data := struct {
VendorDir string
Package *common.PackageWrapper
Dependencies []*common.PackageWrapper
}{
vendorDir,
pkg,
deps,
}
return core.WriteTemplate(vendorHeaderFile, vendorHeader, data)
}

// Generates a vendor.pri inside vendorDir using the information contained in the package file
// and the dependencies
func GenerateVendorPri(vendorDir string, pkg *common.PackageWrapper) error {
Expand Down Expand Up @@ -277,3 +386,31 @@ func GenerateVendorPri(vendorDir string, pkg *common.PackageWrapper) error {

return core.WriteTemplate(vendorPriFile, vendorPri, data)
}

// Generates a vendor.pri inside vendorDir using the information contained in the package file
// and the dependencies
func GenerateVendorQbs(vendorDir string, pkg *common.PackageWrapper) error {
depMap, err := common.LoadPackages(vendorDir)
if err != nil {
return err
}

var deps []*common.PackageWrapper
for _, dep := range depMap {
deps = append(deps, dep)
}

vendorQbsFile := filepath.Join(vendorDir, core.Vendor+".qbs")

data := struct {
VendorDir string
Package *common.PackageWrapper
Dependencies []*common.PackageWrapper
}{
vendorDir,
pkg,
deps,
}

return core.WriteTemplate(vendorQbsFile, vendorQbs, data)
}