@@ -15,6 +15,7 @@ set(CMAKE_CXX_EXTENSIONS Off)
1515
1616# export compile commands, useful for IDEs
1717set (EXPORT_COMPILE_COMMANDS ON )
18+ set (CMAKE_POSITION_INDEPENDENT_CODE ON )
1819
1920# Define build options
2021# echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
@@ -25,6 +26,7 @@ option(SUPPORT_TTL "whether support TTL" OFF)
2526option (OPT_SUPPORT_ZSTD_TRACE "whether support zstd trace" ON )
2627option (ENABLE_LRB "enable LRB" OFF )
2728option (ENABLE_3L_CACHE "enable 3LCache" OFF )
29+ option (BUILD_SHARED_LIBS "build shared library" ON )
2830set (LOG_LEVEL "default" CACHE STRING "change the logging level" )
2931set_property (CACHE LOG_LEVEL PROPERTY STRINGS ERROR WARN INFO DEBUG VERBOSE DEFAULT )
3032
@@ -112,28 +114,31 @@ include(GNUInstallDirs)
112114set (dependency_libs "" )
113115
114116find_package (Threads REQUIRED )
115- set (dependency_libs ${dependency_libs} ${CMAKE_THREAD_LIBS_INIT} )
117+ list (APPEND dependency_libs ${CMAKE_THREAD_LIBS_INIT} )
118+
119+ # Link standard math and dl libraries universally
120+ list (APPEND dependency_libs m dl)
116121
117122find_package (GLib REQUIRED )
118- include_directories (${GLib_INCLUDE_DIRS} )
119- set (dependency_libs ${dependency_libs} ${GLib_LIBRARY} )
123+ # Don't add GLib includes globally - add them to specific targets
124+ # include_directories(${GLib_INCLUDE_DIRS})
125+ list (APPEND dependency_libs ${GLib_LIBRARY} )
120126
121127find_package (argp REQUIRED )
122- include_directories (${ARGP_INCLUDE_DIRS} )
123- set (dependency_libs ${dependency_libs} ${ARGP_LIBRARY} )
128+ # Don't add argp includes globally
129+ # include_directories(${ARGP_INCLUDE_DIRS})
130+ list (APPEND dependency_libs ${ARGP_LIBRARY} )
124131
125132if (OPT_SUPPORT_ZSTD_TRACE)
126133 add_compile_definitions (SUPPORT_ZSTD_TRACE=1 )
127134 find_package (ZSTD )
128-
129- include_directories (${ZSTD_INCLUDE_DIR} )
130-
135+ message (STATUS "ZSTD_INCLUDE_DIR ${ZSTD_INCLUDE_DIR} , ZSTD_LIBRARIES ${ZSTD_LIBRARIES} " )
131136 if ("${ZSTD_LIBRARIES} " STREQUAL "" )
132137 message (FATAL_ERROR "zstd not found" )
138+ else ()
139+ include_directories (${ZSTD_INCLUDE_DIR} )
140+ list (APPEND dependency_libs ${ZSTD_LIBRARIES} )
133141 endif ()
134-
135- set (dependency_libs ${dependency_libs} ${ZSTD_LIBRARIES} )
136- message (STATUS "ZSTD_INCLUDE_DIR ${ZSTD_INCLUDE_DIR} , ZSTD_LIBRARIES ${ZSTD_LIBRARIES} " )
137142endif ()
138143
139144# TCMalloc (libgoogle-perftools-dev google-perftools)
@@ -146,9 +151,10 @@ if(NOT ${CMAKE_BUILD_TYPE} MATCHES "Debug")
146151 if ("${Tcmalloc_LIBRARY} " STREQUAL "" )
147152 message (STATUS "!!! cannot find tcmalloc" )
148153 else ()
149- set (dependency_libs ${ dependency_libs} ${Tcmalloc_LIBRARIES} )
154+ list ( APPEND dependency_libs ${Tcmalloc_LIBRARIES} )
150155 # tcmalloc flags will be set per target instead of globally
151156 set (tcmalloc_flags "-fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free" )
157+ list (APPEND LIBCACHESIM_C_FLAGS ${tcmalloc_flags} )
152158 endif ()
153159endif ()
154160
@@ -157,7 +163,7 @@ find_package(Threads)
157163if (ENABLE_GLCACHE)
158164 find_package (xgboost REQUIRED )
159165 include_directories (${XGBOOST_INCLUDE_DIR} )
160- set (dependency_libs ${ dependency_libs} xgboost::xgboost)
166+ list ( APPEND dependency_libs xgboost::xgboost)
161167 add_compile_definitions (ENABLE_GLCACHE=1 )
162168 message (STATUS "XGBOOST_INCLUDE_DIR=${XGBOOST_INCLUDE_DIR} " )
163169endif ()
@@ -168,13 +174,13 @@ foreach(FEATURE ENABLE_LRB ENABLE_3L_CACHE)
168174 if (NOT LIGHTGBM_PATH)
169175 message (FATAL_ERROR "LIGHTGBM_PATH not found" )
170176 endif ()
171- include_directories (${LIGHTGBM_PATH} )
177+ # include_directories(${LIGHTGBM_PATH})
172178
173179 find_library (LIGHTGBM_LIB _lightgbm )
174180 if (NOT LIGHTGBM_LIB)
175181 message (FATAL_ERROR "LIGHTGBM_LIB not found" )
176182 endif ()
177- set (dependency_libs ${ dependency_libs} ${LIGHTGBM_LIB} )
183+ list ( APPEND dependency_libs ${LIGHTGBM_LIB} )
178184 add_compile_definitions (${FEATURE} =1 )
179185 endif ()
180186endforeach ()
@@ -214,18 +220,11 @@ message(STATUS "============= Status of optional features ==============")
214220message (STATUS "========================================================" )
215221
216222# Define include directories for reuse in subdirectories
217- set (libCacheSim_include_dir ${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim/include ${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim/utils/include ${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim)
218- set (libCacheSim_binary_include_dir ${CMAKE_CURRENT_BINARY_DIR} /libCacheSim/include)
219-
220- include_directories (${libCacheSim_include_dir} )
221- include_directories (${libCacheSim_binary_include_dir} )
222- # Restructured to avoid transitive dependency duplicates
223- # profiler_lib already includes cache_lib_c, cache_lib_cpp, traceReader_lib (which includes utils_lib)
224- # Only include top-level libraries to avoid duplicates
225- set (all_modules cache_lib_c cache_lib_cpp traceReader_lib profiler_lib dataStructure_lib utils_lib traceAnalyzer_lib mrcProfiler_lib)
226- # For linking: use minimal sets to avoid transitive dependency duplicates
227- set (core_libs cache_lib_c cache_lib_cpp traceReader_lib dataStructure_lib utils_lib)
228- set (high_level_libs profiler_lib traceAnalyzer_lib)
223+ set (libCacheSim_include_dir
224+ ${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim/include
225+ ${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim/utils/include
226+ ${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim
227+ )
229228
230229add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim/cache )
231230add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim/dataStructure )
@@ -251,24 +250,74 @@ endif()
251250
252251# libCacheSim unified library compilation and installation
253252# Create a single library that combines all modular libraries
254- add_library (${PROJECT_NAME} INTERFACE )
255-
256- # Link all modular libraries into the unified library
257- target_link_libraries (${PROJECT_NAME} INTERFACE ${high_level_libs} )
253+ add_library (${PROJECT_NAME} STATIC
254+ $<TARGET_OBJECTS :cache_lib_c >
255+ $<TARGET_OBJECTS :cache_lib_cpp >
256+ $<TARGET_OBJECTS :traceReader_lib >
257+ $<TARGET_OBJECTS :profiler_lib >
258+ $<TARGET_OBJECTS :dataStructure_lib >
259+ $<TARGET_OBJECTS :utils_lib >
260+ $<TARGET_OBJECTS :traceAnalyzer_lib >
261+ $<TARGET_OBJECTS :mrcProfiler_lib >
262+ )
258263
259264# Set include directories for the unified library
260265target_include_directories (${PROJECT_NAME} INTERFACE
261- $<BUILD_INTERFACE :${libCacheSim_include_dir} >
262- $<BUILD_INTERFACE :${libCacheSim_binary_include_dir} >
266+ # Use separate BUILD_INTERFACE for each directory to avoid list expansion issues
267+ $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim /include >
268+ $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim /utils /include >
269+ $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim />
263270 $<INSTALL_INTERFACE :${CMAKE_INSTALL_INCLUDEDIR} >
264271)
265272
266- # Link dependencies for the unified library
267- target_link_libraries (${PROJECT_NAME} INTERFACE ${dependency_libs} )
273+
274+ # Link the static library to all required dependencies
275+ target_link_libraries (${PROJECT_NAME} PUBLIC ${dependency_libs} )
268276
269277# Set version and properties
270278set_target_properties (${PROJECT_NAME} PROPERTIES VERSION ${${PROJECT_NAME}_VERSION} )
271279
280+ # Install the static library
281+ install (TARGETS ${PROJECT_NAME}
282+ EXPORT ${PROJECT_NAME} Targets
283+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
284+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
285+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
286+ )
287+
288+
289+ if (BUILD_SHARED_LIBS )
290+ add_library (${PROJECT_NAME} _shared SHARED
291+ $<TARGET_OBJECTS :cache_lib_c >
292+ $<TARGET_OBJECTS :cache_lib_cpp >
293+ $<TARGET_OBJECTS :traceReader_lib >
294+ $<TARGET_OBJECTS :profiler_lib >
295+ $<TARGET_OBJECTS :dataStructure_lib >
296+ $<TARGET_OBJECTS :utils_lib >
297+ $<TARGET_OBJECTS :traceAnalyzer_lib >
298+ $<TARGET_OBJECTS :mrcProfiler_lib >
299+ )
300+
301+ target_include_directories (${PROJECT_NAME} _shared INTERFACE
302+ $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim /include >
303+ $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim /utils /include >
304+ $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /libCacheSim />
305+ $<INSTALL_INTERFACE :${CMAKE_INSTALL_INCLUDEDIR} >
306+ )
307+
308+ target_link_libraries (${PROJECT_NAME} _shared PUBLIC ${dependency_libs} )
309+
310+ set_target_properties (${PROJECT_NAME} _shared PROPERTIES VERSION ${${PROJECT_NAME}_VERSION} )
311+
312+ install (TARGETS ${PROJECT_NAME} _shared
313+ EXPORT ${PROJECT_NAME} Targets
314+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
315+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
316+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
317+ )
318+ endif ()
319+
320+
272321# Configuration files
273322configure_file (${PROJECT_SOURCE_DIR} /${PROJECT_NAME}.pc.in ${CMAKE_CURRENT_BINARY_DIR} /${PROJECT_NAME}.pc @ONLY )
274323configure_file (${PROJECT_SOURCE_DIR} /${PROJECT_NAME}.cmake.in ${CMAKE_CURRENT_BINARY_DIR} /Find${PROJECT_NAME}.cmake @ONLY )
@@ -281,17 +330,8 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
281330install (FILES ${CMAKE_CURRENT_BINARY_DIR} /Find${PROJECT_NAME} .cmake
282331 DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/${PROJECT_NAME} COMPONENT dev)
283332
284- # Install all modular libraries and the unified interface library
285- install (TARGETS ${PROJECT_NAME} ${all_modules}
286- EXPORT ${PROJECT_NAME} Targets
287- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
288- ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
289- INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
290- )
291-
292333# Install the export file
293334install (EXPORT ${PROJECT_NAME} Targets
294335 FILE ${PROJECT_NAME} Targets .cmake
295336 DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/${PROJECT_NAME}
296- )
297-
337+ )
0 commit comments