Example for issue-318
The repository consists only of
- the submodule libxlsxwriter at Release_1.0.0.
- one CMakeLists.txt which adds the submodule as additional folder.
- the demo in src/demo.c from the libxlsxwriter repository. But that serves only as an example for compiling and linking.
The problem can be seen with the following commands:
mkdir build
cd build
cmake .. 2> err_1
cmake .. 2> err_2
make
Due to the second cmake run, the compilation of the demo fails with the error message
fatal error: xlsxwriter.h: No such file or directory
The (error) output already give hints to the reason for the failure, namely the targets name change.
The CMakeLists.txt in the folder libxlsxwriter creates a target, which represents the library xlsxwriter. But the actual name of the target is different between the first and all later cmake runs. To make that behavior clear, the CMakeLists.txt prints either "has the target xlsxwriter" (in the first run) or "has the target testIssue_318" (in the second run). Hence the reference in line 15 in CMakeLists.txt does not refer to the target.
To explain that behavior, we consider the content and the type of the variable PROJECT_NAME in two lines:
file | line | first run | second run | ||
---|---|---|---|---|---|
content | type | content | type | ||
CMakeLists.txt | 3 | testIssue_318 | ordinary | testIssue_318 | cache |
libxlsxwriter/CMakeLists.txt | 96 | testIssue_318 | ordinary | testIssue_318 | cache |
libxlsxwriter/CMakeLists.txt | 98 | libxlsxwriter | cache | testIssue_318 | cache |
That type and value changes are explained in the cmake documentation
If the cache entry does not exist prior to the call or the FORCE option is given then the cache entry will be set to the
given value. Furthermore, any normal variable binding in the current scope will be removed to expose the newly
cached value to any immediately following evaluation.
In our case
- in the first run, we change the type from ordinary to cache, AND the value from testIssue_318 to xlsxwriter.
- in the second run, we keep the type AND the value, but from the outer project name.