It would be nice to have something like an `objectlibrary` type, similar to CMake's feature: https://cmake.org/cmake/help/latest/command/add_library.html#object-libraries
A main advantages points in use of the `objectlibrary`:
1. It increases a compilation speed, against, e.g. a `staticlibrary`, because the `staticlibrary` generation pipeline includes this chain: `cpp -> obj -> lib`, but the `objectlibrary` includes only this chain: `cpp -> obj`. So, for a very big projects, with the heavy templates, which generates a many and a big `obj` files, the archiving all `obj` files into a `lib` file may take a long time.
2. On Windows && MSVC there is a limitation on a size of a generated static library `lib` file is about ~4GB. This forces you to break the project into smaller sub-libraries and constantly monitor their size, that's increases a development time, complexity, and so on.
I tried to do something like an `objectlibrary`, just imitate this feature, just setting the `obj` type to some Product. And then add dependency to this product in a resulting application. In results, this product compiles `cpp` -> `obj`, but that `obj` files does not passed to the `app` linker. So, maybe need to do something else harder:
== app.qbs ==
Application {
    Depends { name: "cpp" }
    Depends { name: "myobj" } // I assumed that `obj` from `myob` be passed to this `app` linker.. But unsuccessfull.
    consoleApplication: true
    files : [ "main.cpp" ]
}
== obj.qbs ==
Product {
    Depends { name: "cpp" }
    type: "obj" // Imitate a `objectlibrary`
    name: "myobj"
    files: ["obj.cpp", "obj.h"]
    Export {
        Depends { name: "cpp" }
        cpp.includePaths: [exportingProduct.sourceDirectory]
    }
}
Any suggestions are welcomed!
UPD: One workaround I found is to use this as an imitation of an `objectlibrary`:
== obj.qbs ==
Product {
    Depends { name: "cpp" }
    name: "myobj"
    files: ["obj.cpp", "obj.h"]
    Export {
        Depends { name: "cpp" }
        cpp.includePaths: [exportingProduct.sourceDirectory]
        Group { // This, just export an sources... But, it is ugly...
            files: exportingProduct.files
        }
    }
}
UPD2: Other workaround it is something like this:
== obj.qbs ==
Product {
    Depends { name: "cpp" }
    name: "myobj"
    type: "objectlibrary"
    files: ["obj1.cpp", "obj1.h", "obj2.cpp", "obj2.h"]
    Group {
        fileTagsFilter: ["obj"]
        fileTags: ["objectlibrary"]
    }
    Export {
        Depends { name: "cpp" }
        cpp.includePaths: [exportingProduct.sourceDirectory]
    }
}
== app.qbs ==
import qbs.File CppApplication { Depends { name: "myobj" } consoleApplication: true files: ["main.cpp"] Rule { inputsFromDependencies: ["objectlibrary"] Artifact { fileTags: ["obj"] filePath: input.completeBaseName + ".obj" } prepare: { var cmd = new JavaScriptCommand(); cmd.src = input.filePath; cmd.dst = output.filePath; cmd.sourceCode = function () { File.copy(src, dst); }; return [cmd]; } } }
but in this case we need to use a File.copy() that's duplicates an object files... Maybe we can create a sym-links instead, or maybe to use some `aliases` .... I don't know.
| For Gerrit Dashboard: QBS-1834 | ||||||
|---|---|---|---|---|---|---|
| # | Subject | Branch | Project | Status | CR | V | 
| 680496,2 | Language: Add Rule.targetInputsFromDependencies | master | qbs/qbs | Status: ABANDONED | 0 | +1 | 
| 681187,4 | Introduce ObjectLibrary | master | qbs/qbs | Status: MERGED | +2 | -1 |