Relax the usage of TARGET_OBJECTS generator expression

The geneator expression can now be used with static, shared, and
module libraries and executables.
This commit is contained in:
Robert Maynard
2019-04-03 14:42:35 -04:00
parent 3e129d71bc
commit ce078dda79
14 changed files with 138 additions and 19 deletions

View File

@@ -461,8 +461,7 @@ Output-Related Expressions
Content of ``...`` converted to a C identifier. The conversion follows the
same behavior as :command:`string(MAKE_C_IDENTIFIER)`.
``$<TARGET_OBJECTS:objLib>``
List of objects resulting from build of ``objLib``. ``objLib`` must be an
object of type ``OBJECT_LIBRARY``.
List of objects resulting from build of ``objLib``.
``$<SHELL_PATH:...>``
Content of ``...`` converted to shell path style. For example, slashes are
converted to backslashes in Windows shells and drive letters are converted

View File

@@ -0,0 +1,5 @@
relax-TARGET_OBJECTS-generator-expression
-----------------------------------------
* The ``TARGET_OBJECTS`` :manual:`generator expression <cmake-generator-expressions(7)>`
is now supported on ``SHARED``, ``STATIC``, ``MODULE`` libraries and executables.

View File

@@ -1525,10 +1525,16 @@ static const struct TargetObjectsNode : public cmGeneratorExpressionNode
reportError(context, content->GetOriginalExpression(), e.str());
return std::string();
}
if (gt->GetType() != cmStateEnums::OBJECT_LIBRARY) {
cmStateEnums::TargetType type = gt->GetType();
if (type != cmStateEnums::EXECUTABLE &&
type != cmStateEnums::STATIC_LIBRARY &&
type != cmStateEnums::SHARED_LIBRARY &&
type != cmStateEnums::MODULE_LIBRARY &&
type != cmStateEnums::OBJECT_LIBRARY) {
std::ostringstream e;
e << "Objects of target \"" << tgtName
<< "\" referenced but is not an OBJECT library.";
<< "\" referenced but is not an allowed library types (EXECUTABLE, "
<< "STATIC, SHARED, MODULE, OBJECT).";
reportError(context, content->GetOriginalExpression(), e.str());
return std::string();
}

View File

@@ -374,4 +374,49 @@ if(NOT CMAKE_GENERATOR STREQUAL Xcode OR NOT CMAKE_OSX_ARCHITECTURES MATCHES "[;
-P "${CMAKE_CURRENT_SOURCE_DIR}/check_object_files.cmake"
DEPENDS objlib
)
add_library(sharedlib SHARED objlib1.c objlib2.c)
file(GENERATE
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/sharedlib_files_$<CONFIGURATION>"
CONTENT "$<JOIN:$<TARGET_OBJECTS:sharedlib>,\n>\n"
)
add_custom_target(check_sharedlib_objs ALL
COMMAND ${CMAKE_COMMAND}
"-DOBJLIB_LISTFILE=${CMAKE_CURRENT_BINARY_DIR}/sharedlib_files_$<CONFIGURATION>"
-DEXPECTED_NUM_OBJECTFILES=2
-P "${CMAKE_CURRENT_SOURCE_DIR}/check_object_files.cmake"
DEPENDS sharedlib
)
add_library(staticlib STATIC objlib1.c objlib2.c)
file(GENERATE
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/staticlib_files_$<CONFIGURATION>"
CONTENT "$<JOIN:$<TARGET_OBJECTS:staticlib>,\n>\n"
)
add_custom_target(check_staticlib_objs ALL
COMMAND ${CMAKE_COMMAND}
"-DOBJLIB_LISTFILE=${CMAKE_CURRENT_BINARY_DIR}/staticlib_files_$<CONFIGURATION>"
-DEXPECTED_NUM_OBJECTFILES=2
-P "${CMAKE_CURRENT_SOURCE_DIR}/check_object_files.cmake"
DEPENDS staticlib
)
add_executable(execobjs objlib1.c objlib2.c echo.c)
file(GENERATE
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/execobjs_files_$<CONFIGURATION>"
CONTENT "$<JOIN:$<TARGET_OBJECTS:execobjs>,\n>\n"
)
add_custom_target(check_exec_objs ALL
COMMAND ${CMAKE_COMMAND}
"-DOBJLIB_LISTFILE=${CMAKE_CURRENT_BINARY_DIR}/execobjs_files_$<CONFIGURATION>"
-DEXPECTED_NUM_OBJECTFILES=3
-P "${CMAKE_CURRENT_SOURCE_DIR}/check_object_files.cmake"
DEPENDS execobjs
)
endif()

View File

@@ -62,4 +62,14 @@ add_custom_target(UseABinternalDep COMMAND ${CMAKE_COMMAND} -E touch UseABintern
add_custom_command(TARGET UseABinternal POST_BUILD COMMAND ${CMAKE_COMMAND} -P UseABinternalDep.cmake)
add_dependencies(UseABinternal UseABinternalDep)
# Test a static library with sources from a different static library
add_library(UseCstaticObjs STATIC $<TARGET_OBJECTS:Cstatic> $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:Bexport>)
# Test a shared library with sources from a different shared library
add_library(UseCsharedObjs SHARED $<TARGET_OBJECTS:Cshared> $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:Bexport>)
# Test a shared executable with sources from a different shared library
add_executable(UseABstaticObjs $<TARGET_OBJECTS:UseABstatic>)
target_link_libraries(UseABstaticObjs ABstatic)
add_subdirectory(ExportLanguages)

View File

@@ -3,6 +3,7 @@ CMake Error at OutputNameMatchesObjects.cmake:[0-9]+ \(file\):
\$<TARGET_OBJECTS:foo>
Objects of target "foo" referenced but is not an OBJECT library.
Objects of target "foo" referenced but is not an allowed library types
\(EXECUTABLE, STATIC, SHARED, MODULE, OBJECT\).
Call Stack \(most recent call first\):
CMakeLists.txt:[0-9]+ \(include\)

View File

@@ -1,11 +1,8 @@
enable_language(CXX)
file(GENERATE
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/$<BOOL:$<TARGET_OBJECTS:foo>>somefile.cpp"
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/$<LOWER_CASE:$<CONFIG>/somefile.cpp"
CONTENT "static const char content[] = \"$<TARGET_OBJECTS:foo>\";\n"
)
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/input.txt"
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/input.txt" "${CMAKE_CURRENT_BINARY_DIR}")
add_executable(foo empty.cpp "${CMAKE_CURRENT_BINARY_DIR}/1somefile.cpp" "${CMAKE_CURRENT_BINARY_DIR}/input.txt")
add_library(foo INTERFACE )

View File

@@ -3,6 +3,7 @@ CMake Error at BadSourceExpression3.cmake:2 \(add_library\):
\$<TARGET_OBJECTS:NotObjLib>
Objects of target "NotObjLib" referenced but is not an OBJECT library.
Objects of target "NotObjLib" referenced but is not an allowed library
types \(EXECUTABLE, STATIC, SHARED, MODULE, OBJECT\).
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
CMakeLists.txt:[0-9]+ \(include\)

View File

@@ -1,2 +1,2 @@
add_library(NotObjLib STATIC a.c)
add_library(NotObjLib INTERFACE)
add_library(A STATIC a.c $<TARGET_OBJECTS:NotObjLib>)

View File

@@ -0,0 +1,32 @@
add_library(StaticLib STATIC a.c)
add_custom_command(TARGET StaticLib POST_BUILD
VERBATIM
COMMAND ${CMAKE_COMMAND}
"-DTARGET_OBJECTS=$<TARGET_OBJECTS:StaticLib>"
-DEXPECTED_NUM_OBJECTFILES=2
-P "${CMAKE_CURRENT_SOURCE_DIR}/check_object_files.cmake"
)
add_library(SharedLib SHARED a.c b.c)
target_compile_definitions(SharedLib PRIVATE REQUIRED)
add_custom_command(TARGET SharedLib POST_BUILD
VERBATIM
COMMAND ${CMAKE_COMMAND}
"-DTARGET_OBJECTS:STRING=$<TARGET_OBJECTS:SharedLib>"
-DEXPECTED_NUM_OBJECTFILES=2
-P "${CMAKE_CURRENT_SOURCE_DIR}/check_object_files.cmake"
)
add_executable(ExecObjs a.c b.c exe.c)
target_compile_definitions(ExecObjs PRIVATE REQUIRED)
add_custom_target(check_exec_objs ALL
VERBATIM
COMMAND ${CMAKE_COMMAND}
"-DTARGET_OBJECTS=$<TARGET_OBJECTS:ExecObjs>"
-DEXPECTED_NUM_OBJECTFILES=3
-P "${CMAKE_CURRENT_SOURCE_DIR}/check_object_files.cmake"
DEPENDS ExecObjs
)

View File

@@ -37,6 +37,10 @@ function (run_object_lib_build2 name)
run_cmake_command(${name}-build ${CMAKE_COMMAND} --build .)
endfunction ()
if(NOT (RunCMake_GENERATOR STREQUAL "Xcode" AND "$ENV{CMAKE_OSX_ARCHITECTURES}" MATCHES "[;$]"))
run_object_lib_build(CheckTargetObjects)
endif()
run_object_lib_build(LinkObjLHSShared)
run_object_lib_build(LinkObjLHSStatic)
run_object_lib_build(LinkObjRHSShared)
@@ -54,6 +58,7 @@ run_cmake(PostBuild)
run_cmake(PreBuild)
run_cmake(PreLink)
function(run_Dependencies)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Dependencies-build)
set(RunCMake_TEST_NO_CLEAN 1)

View File

@@ -0,0 +1,17 @@
if (NOT TARGET_OBJECTS)
message(SEND_ERROR "Object not passed as -DTARGET_OBJECTS")
endif()
foreach(objlib_file IN LISTS objects)
message(STATUS "objlib_file: =${objlib_file}=")
set(file_exists False)
if (EXISTS "${objlib_file}")
set(file_exists True)
endif()
if (NOT file_exists)
message(SEND_ERROR "File \"${objlib_file}\" does not exist!${tried}")
endif()
endforeach()

View File

@@ -1,8 +1,9 @@
CMake Error at NotObjlibTarget.cmake:3 \(file\):
CMake Error at NotObjlibTarget.cmake:[0-9]+ \(file\):
Error evaluating generator expression:
\$<TARGET_OBJECTS:StaticLib>
\$<TARGET_OBJECTS:IFaceLib>
Objects of target "StaticLib" referenced but is not an OBJECT library.
Objects of target "IFaceLib" referenced but is not an allowed library types
\(EXECUTABLE, STATIC, SHARED, MODULE, OBJECT\).
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)
CMakeLists.txt:[0-9]+ \(include\)

View File

@@ -1,3 +1,3 @@
add_library(StaticLib empty.cpp)
add_library(IFaceLib INTERFACE )
file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/test_output CONTENT $<TARGET_OBJECTS:StaticLib>)
file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/test_output CONTENT $<TARGET_OBJECTS:IFaceLib>)