Merge pull request #12926 from mikedn/dead-cast-code
[platform/upstream/coreclr.git] / src / dlls / mscordac / CMakeLists.txt
1 include(${CLR_DIR}/dac.cmake)
2 add_definitions(-DFEATURE_NO_HOST)
3
4 if(CLR_CMAKE_PLATFORM_UNIX)
5     add_compile_options(-fPIC)
6 endif(CLR_CMAKE_PLATFORM_UNIX)
7
8 set(CLR_DAC_SOURCES
9 )
10
11 add_definitions(-DFX_VER_INTERNALNAME_STR=mscordaccore.dll)
12
13 if(WIN32)
14     list(APPEND CLR_DAC_SOURCES
15         Native.rc
16     )
17     set(DEF_SOURCES
18         mscordac.src
19     )
20
21     set(CURRENT_BINARY_DIR_FOR_CONFIG ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
22
23     #Preprocess exports definition file
24     preprocess_def_file(${CMAKE_CURRENT_SOURCE_DIR}/${DEF_SOURCES} ${CURRENT_BINARY_DIR_FOR_CONFIG}/mscordac.def)
25
26     #create target to add file dependency on mscordac.def
27     add_custom_target(mscordaccore_def DEPENDS ${CURRENT_BINARY_DIR_FOR_CONFIG}/mscordac.def)
28
29     # No library groups for Win32
30     set(START_LIBRARY_GROUP)
31     set(END_LIBRARY_GROUP)
32 else(WIN32)
33     set(DEF_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/mscordac_unixexports.src)
34     set(EXPORTS_FILE ${CMAKE_CURRENT_BINARY_DIR}/mscordac.exports)
35     generate_exports_file(${DEF_SOURCES} ${EXPORTS_FILE})
36 endif(WIN32)
37
38 if(CLR_CMAKE_PLATFORM_LINUX OR CLR_CMAKE_PLATFORM_FREEBSD OR CLR_CMAKE_PLATFORM_NETBSD)
39     # This option is necessary to ensure that the overloaded delete operator defined inside
40     # of the utilcode will be used instead of the standard library delete operator.
41     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -Bsymbolic -Xlinker -Bsymbolic-functions")    
42
43     # The following linked options can be inserted into the linker libraries list to 
44     # ensure proper resolving of circular references between a subset of the libraries.
45     set(START_LIBRARY_GROUP -Wl,--start-group)
46     set(END_LIBRARY_GROUP -Wl,--end-group)
47
48     # These options are used to force every object to be included even if it's unused.
49     set(START_WHOLE_ARCHIVE -Wl,--whole-archive)
50     set(END_WHOLE_ARCHIVE -Wl,--no-whole-archive) 
51
52     # Add linker exports file option
53     set(EXPORTS_LINKER_OPTION -Wl,--version-script=${EXPORTS_FILE})
54 endif(CLR_CMAKE_PLATFORM_LINUX OR CLR_CMAKE_PLATFORM_FREEBSD OR CLR_CMAKE_PLATFORM_NETBSD)
55
56 if(CLR_CMAKE_PLATFORM_DARWIN)
57     # Add linker exports file option
58     set(EXPORTS_LINKER_OPTION -Wl,-exported_symbols_list,${EXPORTS_FILE})
59 endif(CLR_CMAKE_PLATFORM_DARWIN)
60
61 # Create object library to enable creation of proper dependency of mscordaccore.exp on mscordac.obj and
62 # mscordaccore on both the mscordaccore.exp and mscordac.obj.
63 add_library(mscordacobj OBJECT mscordac.cpp)
64
65 add_library_clr(mscordaccore SHARED ${CLR_DAC_SOURCES} $<TARGET_OBJECTS:mscordacobj>)
66
67 if(CLR_CMAKE_PLATFORM_UNIX)
68     add_custom_target(mscordaccore_exports DEPENDS ${EXPORTS_FILE})
69     add_dependencies(mscordaccore mscordaccore_exports)
70
71     set_property(TARGET mscordaccore APPEND_STRING PROPERTY LINK_FLAGS ${EXPORTS_LINKER_OPTION})
72     set_property(TARGET mscordaccore APPEND_STRING PROPERTY LINK_DEPENDS ${EXPORTS_FILE})
73 endif(CLR_CMAKE_PLATFORM_UNIX)
74
75 # IMPORTANT! Please do not rearrange the order of the libraries. The linker on Linux is
76 # order dependent and changing the order can result in undefined symbols in the shared 
77 # library.
78 set(COREDAC_LIBRARIES
79     ${START_LIBRARY_GROUP} # Start group of libraries that have circular references
80     cee_dac
81     cordbee_dac
82     corguids
83     daccess
84     dbgutil
85     mdcompiler_dac
86     mdhotdata_dac
87     mdruntime_dac
88     mdruntimerw_dac
89     strongname_dac
90     utilcode_dac
91     unwinder_dac
92     ${END_LIBRARY_GROUP} # End group of libraries that have circular references
93 )
94
95 if(WIN32)
96     # mscordac.def should be generated before mscordaccore.dll is built
97     add_dependencies(mscordaccore mscordaccore_def)
98
99     set(MSCORDAC_OBJ_PATH "${CMAKE_CURRENT_BINARY_DIR}/mscordacobj.dir/${CMAKE_CFG_INTDIR}/mscordac.obj")
100
101     # Generate export file
102     add_custom_command(
103         DEPENDS mscordaccore_def "${CURRENT_BINARY_DIR_FOR_CONFIG}/mscordac.def" mscordacobj daccess
104         OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/mscordaccore.exp
105         COMMAND lib.exe /OUT:"${CMAKE_CURRENT_BINARY_DIR}/mscordaccore.lib" /DEF:"${CURRENT_BINARY_DIR_FOR_CONFIG}/mscordac.def" "$<TARGET_FILE:daccess>" $<$<OR:$<CONFIG:Release>,$<CONFIG:Relwithdebinfo>>:/LTCG> ${STATIC_LIBRARY_FLAGS} ${MSCORDAC_OBJ_PATH}
106         COMMENT "Generating mscordaccore.exp export file"
107     )
108
109     set_source_files_properties(
110         ${CMAKE_CURRENT_BINARY_DIR}/mscordaccore.exp
111         PROPERTIES GENERATED TRUE
112     )
113
114     add_custom_target(mscordaccore_exp DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/mscordaccore.exp)
115     add_dependencies(mscordaccore mscordaccore_exp)
116
117     set(COREDAC_LIBRARIES
118         ${CMAKE_CURRENT_BINARY_DIR}/mscordaccore.exp # export file
119         ${COREDAC_LIBRARIES}
120         mdwinmd_dac
121         kernel32.lib
122         advapi32.lib
123         ole32.lib
124         oleaut32.lib
125         uuid.lib
126         user32.lib
127         ${STATIC_MT_CRT_LIB}
128         ${STATIC_MT_VCRT_LIB}
129     )
130 else(WIN32)
131     list(APPEND COREDAC_LIBRARIES
132         mscorrc_debug
133         ${START_WHOLE_ARCHIVE} # force all PAL objects to be included so all exports are available  
134         coreclrpal
135         ${END_WHOLE_ARCHIVE}
136         palrt
137     )
138 endif(WIN32)
139
140 target_link_libraries(mscordaccore PRIVATE ${COREDAC_LIBRARIES})
141
142 # add the install targets
143 install_clr(mscordaccore)