Comments (5)
Targets must always be defined before use. If you reference something you haven't defined before, FASTBuild assumes you are referring to an external file and auto-creates a target for you. This is not Alias specific.
In the Alias example, as the dll and import lib are external targets, FASTBuild has to auto-create FileNodes for them.
The error could be better. Ideally we'd improve this by specifying where the original conflicting definition came from. This would require some non-trivial changes to bff parsing - we'd have to track a BFFIterator for every declared target, and cope with scoping problems when parsing things like includes (i.e. BFFIterator referencing a file that is no longer open)
from fastbuild.
In the Alias example, as the dll and import lib are external targets, FASTBuild has to auto-create FileNodes for them. This is not Alias specific.
I found these 2 snippets, which seems to correspond to what you described :
- FBuild\FBuildCore\BFF\Functions\Function.cpp(567)
Node * n = ng.FindNode( nodeName );
if ( n == nullptr )
{
// not found - create a new file node
n = ng.CreateFileNode( nodeName );
nodes.Append( Dependency( n ) );
return true;
}
- FBuild\FBuildCore\BFF\Functions\FunctionExecutable.cpp(229)
// node not found - create a new FileNode, assuming we are
// linking against an externally built library
node = ng.CreateFileNode( nodeName );
nodes.Append( Dependency( node ) );
return true;
What would you think of adding a forward declaration syntax, like Library( 'LibraryAlias' )
?
It requires to have a new Undefined state in Nodes to avoid access to properties of a forward declared node and to change a bit Function parser, but still might be a good improvement.
from fastbuild.
I took a look through the code, and there are at least 14 places which create FileNodes like this - essentially every Node type handles this case like this.
I think a forward declaration syntax would complicate the parsing a lot, as well as having consequences for things like error checking. The entire core of the BFF parsing has been built upon the assumption that you define something before you use it. I tend to think it's also reasonable that you can't use things you haven't defined yet - this being something programmers generally have to do.
I think the core problem is that the error is not helpful when you make a mistake and have a conflict. I think if the error was:
fbuild.bff(100,1): FASTBuild Error #1100 - Exec() - Target 'mylib' already defined.
Library( 'mylib' )
^
\--here
fbuild.bff(5,1): FASTBuild Error #1100 - Exec() - See previous declaration:
Exec( 'myexec' )
^
\--here
it would be much clearer.
This would help the case where you did define the same thing twice, either by including something twice (without #once) or by making a mistake in the declaration.
Implementing this isn't trivial either, but I think it'll be a lot easier/safer than changing the fundamental assumptions made in the parsing.
from fastbuild.
I made a change to Error #1100 such that it emits enhanced errors including the location of the initial declaration when a conflicting definition is encountered (f749794).
This change will be in the next release (v1.11). I'll leave this issue open until that version is released.
from fastbuild.
FASTBuild v1.11 has now been released and includes improved output for Error #1100 (information about the previous declaration will be emitted when that error occurs).
from fastbuild.
Related Issues (20)
- C++20 module support HOT 3
- Missing dependencies when using array as `.CompilerInputPattern` HOT 8
- Missing XML Quoting support in vcxproj generator HOT 4
- integration Distributed ThinLTO with FASTBuild HOT 7
- `-compdb` does not include commands to generate PCHs HOT 1
- Problem using variable inside #include HOT 2
- Configuration file supporting Libraby and executable HOT 2
- Visual Studio Instrumentation profiling integration? HOT 5
- ObjectList not rebuilt when PreBuildDependencies changes HOT 4
- .CompilerOptionsC option HOT 16
- How to make full use of the build server HOT 3
- FASTBuild 1.13 gives false "Missing precompiled header option Yc in PCHOptions" error when Yc is present HOT 2
- Problems with compressed source files (LNK2019 error) HOT 7
- Compilation fails with 4> clang: error: invalid Xarch argument: '-Xarch_arm64 -o', options requiring arguments are unsupported HOT 3
- fbuild <target> emits warning while there are no warnings in the cl output HOT 1
- warning LNK4042 when linking a library from several ObjectLists that reused the same PCH. HOT 2
- Limit number of cores used for linking HOT 3
- 'Exec' can't have 'ObjectList' node specified as '.ExecInput' HOT 1
- Show remaining tasks in the status line, and document it HOT 3
- -report=json produces malformed output when caching is disabled HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fastbuild.