add_library: Allow arbitrary non-linked sources in OBJECT libraries
Loosen this restriction on OBJECT libraries to allow source files of any name to be generated by custom commands or listed for reference in IDE projects so long as they would not affect linking of a normal library. Update the rejection message to be more specific about the looser restriction. Extend the ObjectLibrary test to cover a ".cmake" file generated by a custom command in an OBJECT library.
This commit is contained in:
parent
de4f3e2c82
commit
2c470b775a
|
@ -94,7 +94,8 @@ object library name. For example:
|
||||||
|
|
||||||
will include objlib's object files in a library and an executable
|
will include objlib's object files in a library and an executable
|
||||||
along with those compiled from their own sources. Object libraries
|
along with those compiled from their own sources. Object libraries
|
||||||
may contain only sources (and headers) that compile to object files.
|
may contain only sources that compile, header files, and other files
|
||||||
|
that would not affect linking of a normal library (e.g. ``.txt``).
|
||||||
They may contain custom commands generating such sources, but not
|
They may contain custom commands generating such sources, but not
|
||||||
``PRE_BUILD``, ``PRE_LINK``, or ``POST_BUILD`` commands. Object libraries
|
``PRE_BUILD``, ``PRE_LINK``, or ``POST_BUILD`` commands. Object libraries
|
||||||
cannot be imported, exported, installed, or linked. Some native build
|
cannot be imported, exported, installed, or linked. Some native build
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
allow-OBJECT-library-extra-sources
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
* :ref:`Object Libraries` may now have extra sources that do not
|
||||||
|
compile to object files so long as they would not affect linking
|
||||||
|
of a normal library (e.g. ``.dat`` is okay but not ``.def``).
|
|
@ -38,7 +38,8 @@ void reportBadObjLib(std::vector<cmSourceFile*> const& badObjLib,
|
||||||
{
|
{
|
||||||
e << " " << (*i)->GetLocation().GetName() << "\n";
|
e << " " << (*i)->GetLocation().GetName() << "\n";
|
||||||
}
|
}
|
||||||
e << "but may contain only headers and sources that compile.";
|
e << "but may contain only sources that compile, header files, and "
|
||||||
|
"other files that would not affect linking of a normal library.";
|
||||||
cm->IssueMessage(cmake::FATAL_ERROR, e.str(),
|
cm->IssueMessage(cmake::FATAL_ERROR, e.str(),
|
||||||
target->GetBacktrace());
|
target->GetBacktrace());
|
||||||
}
|
}
|
||||||
|
@ -205,10 +206,6 @@ struct TagVisitor
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DoAccept<IsSameTag<Tag, ExtraSourcesTag>::Result>::Do(this->Data, sf);
|
DoAccept<IsSameTag<Tag, ExtraSourcesTag>::Result>::Do(this->Data, sf);
|
||||||
if(this->IsObjLib && ext != "txt")
|
|
||||||
{
|
|
||||||
this->BadObjLibFiles.push_back(sf);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -11,5 +11,16 @@ add_custom_command(
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/a1.c
|
${CMAKE_CURRENT_BINARY_DIR}/a1.c
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(A OBJECT a1.c a2.c)
|
# Remove the custom command output to be sure it runs in an
|
||||||
|
# incremental test. Skip this on VS 6 because it sometimes
|
||||||
|
# re-runs CMake after the custom command runs.
|
||||||
|
if(NOT CMAKE_GENERATOR STREQUAL "Visual Studio 6")
|
||||||
|
file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/a.cmake)
|
||||||
|
endif()
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT a.cmake
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/a.cmake
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(A OBJECT a1.c a2.c a.cmake)
|
||||||
target_include_directories(A PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
target_include_directories(A PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
|
@ -12,6 +12,7 @@ add_library(Cshared SHARED c.c $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:Bexport>)
|
||||||
add_executable(UseCshared main.c)
|
add_executable(UseCshared main.c)
|
||||||
set_property(TARGET UseCshared PROPERTY COMPILE_DEFINITIONS SHARED_C)
|
set_property(TARGET UseCshared PROPERTY COMPILE_DEFINITIONS SHARED_C)
|
||||||
target_link_libraries(UseCshared Cshared)
|
target_link_libraries(UseCshared Cshared)
|
||||||
|
add_custom_command(TARGET UseCshared POST_BUILD COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/A/a.cmake)
|
||||||
|
|
||||||
add_executable(UseCinternal main.c c.c $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:B>)
|
add_executable(UseCinternal main.c c.c $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:B>)
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ CMake Error at BadObjSource1.cmake:1 \(add_library\):
|
||||||
|
|
||||||
bad.def
|
bad.def
|
||||||
|
|
||||||
but may contain only headers and sources that compile.
|
but may contain only sources that compile, header files, and other files
|
||||||
|
that would not affect linking of a normal library.
|
||||||
Call Stack \(most recent call first\):
|
Call Stack \(most recent call first\):
|
||||||
CMakeLists.txt:3 \(include\)
|
CMakeLists.txt:3 \(include\)
|
||||||
|
|
|
@ -3,6 +3,7 @@ CMake Error at BadObjSource2.cmake:1 \(add_library\):
|
||||||
|
|
||||||
bad.obj
|
bad.obj
|
||||||
|
|
||||||
but may contain only headers and sources that compile.
|
but may contain only sources that compile, header files, and other files
|
||||||
|
that would not affect linking of a normal library.
|
||||||
Call Stack \(most recent call first\):
|
Call Stack \(most recent call first\):
|
||||||
CMakeLists.txt:3 \(include\)
|
CMakeLists.txt:3 \(include\)
|
||||||
|
|
Loading…
Reference in New Issue