Skip to content

Commit b8c3a8b

Browse files
authored
[refactor]: cmake library installation (#228)
* [refactor] update CMake configuration for improved modularity and clarity - Set CMAKE_POSITION_INDEPENDENT_CODE to ON for better compatibility. - Transitioned from global include directories to target-specific includes for better encapsulation. - Changed library definitions from INTERFACE to OBJECT for modular libraries to avoid transitive dependencies. - Updated target linking to use the unified PROJECT_NAME for consistency across executables. - Enhanced installation targets for unified libraries and improved include directory management. - Cleaned up unnecessary global includes and streamlined dependency management across various components. * fix compile error on mac * fix anonymous struct * fix shared lib compile * add an option for shared lib * fix macOS compilation issue
1 parent 0a210a7 commit b8c3a8b

23 files changed

Lines changed: 177 additions & 142 deletions

File tree

CMakeLists.txt

Lines changed: 85 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ set(CMAKE_CXX_EXTENSIONS Off)
1515

1616
# export compile commands, useful for IDEs
1717
set(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)
2526
option(OPT_SUPPORT_ZSTD_TRACE "whether support zstd trace" ON)
2627
option(ENABLE_LRB "enable LRB" OFF)
2728
option(ENABLE_3L_CACHE "enable 3LCache" OFF)
29+
option(BUILD_SHARED_LIBS "build shared library" ON)
2830
set(LOG_LEVEL "default" CACHE STRING "change the logging level")
2931
set_property(CACHE LOG_LEVEL PROPERTY STRINGS ERROR WARN INFO DEBUG VERBOSE DEFAULT)
3032

@@ -112,28 +114,31 @@ include(GNUInstallDirs)
112114
set(dependency_libs "")
113115

114116
find_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

117122
find_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

121127
find_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

125132
if(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}")
137142
endif()
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()
153159
endif()
154160

@@ -157,7 +163,7 @@ find_package(Threads)
157163
if(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}")
163169
endif()
@@ -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()
180186
endforeach()
@@ -214,18 +220,11 @@ message(STATUS "============= Status of optional features ==============")
214220
message(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

230229
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libCacheSim/cache)
231230
add_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
260265
target_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
270278
set_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
273322
configure_file(${PROJECT_SOURCE_DIR}/${PROJECT_NAME}.pc.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc @ONLY)
274323
configure_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
281330
install(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
293334
install(EXPORT ${PROJECT_NAME}Targets
294335
FILE ${PROJECT_NAME}Targets.cmake
295336
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
296-
)
297-
337+
)

libCacheSim/bin/MRC/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ set(mrc_sources_c
1515
)
1616

1717
add_executable(MRC ${mrc_sources_c})
18-
target_link_libraries(MRC ${core_libs} ${dependency_libs})
18+
target_include_directories(MRC PRIVATE ${libCacheSim_include_dir} ${GLib_INCLUDE_DIRS})
19+
target_link_libraries(MRC ${PROJECT_NAME})
1920
install(TARGETS MRC RUNTIME DESTINATION bin)

libCacheSim/bin/cachesim/CMakeLists.txt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ set(cachesim_sources_c
99
../cli_reader_utils.c
1010
)
1111
add_executable(cachesim ${cachesim_sources_c})
12-
target_include_directories(cachesim PRIVATE ../)
13-
# Link just profiler_lib which now provides all needed libraries transitively
14-
target_link_libraries(cachesim profiler_lib)
15-
# target_link_options(cachesim PRIVATE "-Wl,--export-dynamic") # Not supported on macOS
12+
target_include_directories(cachesim PRIVATE ${libCacheSim_include_dir} ${GLib_INCLUDE_DIRS} ../)
13+
target_link_libraries(cachesim ${PROJECT_NAME})
1614
install(TARGETS cachesim RUNTIME DESTINATION bin)

libCacheSim/bin/customized/SOSP23/CMakeLists.txt

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,23 @@ set(traceOneHit_sources_cpp
99
../../cli_reader_utils.c
1010
)
1111
add_executable(traceOneHit ${traceOneHit_sources_cpp})
12-
target_include_directories(traceOneHit PRIVATE ../../)
13-
target_link_libraries(traceOneHit dataStructure_lib traceReader_lib ${Boost_LIBRARIES} ${dependency_libs})
12+
target_include_directories(traceOneHit PRIVATE
13+
../../
14+
${libCacheSim_include_dir}
15+
${GLib_INCLUDE_DIRS}
16+
)
17+
# target_link_libraries(traceOneHit dataStructure_lib traceReader_lib ${Boost_LIBRARIES} ${dependency_libs})
18+
target_link_libraries(traceOneHit dataStructure_lib traceReader_lib utils_lib ${Boost_LIBRARIES} ${dependency_libs})
1419

1520
set(flash_sources_cpp
1621
flash/flash.cpp
1722
oneHit/cli_parser.c
1823
../../cli_reader_utils.c
1924
)
2025
add_executable(flash ${flash_sources_cpp})
21-
target_include_directories(flash PRIVATE ../../)
22-
target_link_libraries(flash ${core_libs} ${dependency_libs})
26+
target_include_directories(flash PRIVATE
27+
../../
28+
${libCacheSim_include_dir}
29+
${GLib_INCLUDE_DIRS}
30+
)
31+
target_link_libraries(flash ${PROJECT_NAME} ${dependency_libs})

libCacheSim/bin/debug/CMakeLists.txt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
# ==============================================================================
44

55
add_executable(debug main.cpp)
6-
target_link_libraries(debug ${core_libs} ${dependency_libs})
6+
target_include_directories(debug PRIVATE ${libCacheSim_include_dir} ${GLib_INCLUDE_DIRS})
7+
target_link_libraries(debug ${PROJECT_NAME})
78

89
add_executable(debug_aligned aligned.c)
9-
target_link_libraries(debug_aligned ${core_libs} ${dependency_libs})
10+
target_include_directories(debug_aligned PRIVATE ${libCacheSim_include_dir} ${GLib_INCLUDE_DIRS})
11+
target_link_libraries(debug_aligned ${PROJECT_NAME})
1012

1113
add_executable(debug_fileOp fileOp.cpp)
12-
target_link_libraries(debug_fileOp ${core_libs} ${dependency_libs})
14+
target_include_directories(debug_fileOp PRIVATE ${libCacheSim_include_dir} ${GLib_INCLUDE_DIRS})
15+
target_link_libraries(debug_fileOp ${PROJECT_NAME})
1316

libCacheSim/bin/distUtil/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ set(distUtil_sources_c
88
../cli_reader_utils.c
99
)
1010
add_executable(distUtil ${distUtil_sources_c})
11-
target_link_libraries(distUtil profiler_lib)
11+
target_include_directories(distUtil PRIVATE ${libCacheSim_include_dir} ${GLib_INCLUDE_DIRS})
12+
target_link_libraries(distUtil ${PROJECT_NAME})
1213
install(TARGETS distUtil RUNTIME DESTINATION bin)

libCacheSim/bin/mrcProfiler/CMakeLists.txt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,15 @@ add_executable(mrcProfiler ${mrcProfiler_sources_cpp})
1313
target_compile_options(mrcProfiler PRIVATE
1414
$<$<COMPILE_LANGUAGE:C>:${LIBCACHESIM_C_FLAGS}>
1515
$<$<COMPILE_LANGUAGE:CXX>:${LIBCACHESIM_CXX_FLAGS}>
16-
${tcmalloc_flags}
1716
)
18-
19-
target_link_libraries(mrcProfiler mrcProfiler_lib m dl)
20-
21-
# target_link_options(mrcProfiler PRIVATE "-Wl,--export-dynamic") # Not supported on macOS
22-
install(TARGETS mrcProfiler RUNTIME DESTINATION bin)
17+
target_include_directories(mrcProfiler PRIVATE ${libCacheSim_include_dir} ${GLib_INCLUDE_DIRS})
18+
target_link_libraries(mrcProfiler ${PROJECT_NAME})
2319

2420
set_target_properties(mrcProfiler
2521
PROPERTIES
2622
CXX_STANDARD 17
2723
CXX_STANDARD_REQUIRED YES
2824
CXX_EXTENSIONS NO
2925
)
26+
27+
install(TARGETS mrcProfiler RUNTIME DESTINATION bin)

libCacheSim/bin/traceAnalyzer/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ set(traceAnalyzer_sources_cpp
88
../cli_reader_utils.c
99
)
1010
add_executable(traceAnalyzer ${traceAnalyzer_sources_cpp})
11-
target_link_libraries(traceAnalyzer traceAnalyzer_lib ${core_libs} ${dependency_libs})
11+
target_include_directories(traceAnalyzer PRIVATE ${libCacheSim_include_dir} ${GLib_INCLUDE_DIRS})
12+
target_link_libraries(traceAnalyzer ${PROJECT_NAME})
1213
install(TARGETS traceAnalyzer RUNTIME DESTINATION bin)
1314

1415
set_target_properties(traceAnalyzer

libCacheSim/bin/traceUtils/CMakeLists.txt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@
33
# ==============================================================================
44

55
add_library(cliReaderLib ../cli_reader_utils.c)
6-
6+
target_include_directories(cliReaderLib PRIVATE
7+
${libCacheSim_include_dir}
8+
${GLib_INCLUDE_DIRS}
9+
)
10+
target_compile_options(cliReaderLib PRIVATE ${LIBCACHESIM_C_FLAGS})
11+
target_link_libraries(cliReaderLib PRIVATE ${PROJECT_NAME})
712

813
set(tracePrint_sources_cpp
914
tracePrintMain.cpp
1015
cli_parser.cpp
1116
)
1217
add_executable(tracePrint ${tracePrint_sources_cpp})
13-
target_link_libraries(tracePrint cliReaderLib ${core_libs} ${dependency_libs})
18+
target_include_directories(tracePrint PRIVATE ${libCacheSim_include_dir} ${GLib_INCLUDE_DIRS})
19+
target_link_libraries(tracePrint ${PROJECT_NAME} cliReaderLib)
1420
set_target_properties(tracePrint
1521
PROPERTIES
1622
CXX_STANDARD 17
@@ -28,7 +34,8 @@ set(traceConv_sources_cpp
2834
utils.cpp
2935
)
3036
add_executable(traceConv ${traceConv_sources_cpp})
31-
target_link_libraries(traceConv cliReaderLib ${core_libs} ${dependency_libs})
37+
target_include_directories(traceConv PRIVATE ${libCacheSim_include_dir} ${GLib_INCLUDE_DIRS})
38+
target_link_libraries(traceConv ${PROJECT_NAME} cliReaderLib)
3239
set_target_properties(traceConv
3340
PROPERTIES
3441
CXX_STANDARD 17
@@ -43,7 +50,8 @@ set(traceFilter_sources_cpp
4350
cli_parser.cpp
4451
)
4552
add_executable(traceFilter ${traceFilter_sources_cpp})
46-
target_link_libraries(traceFilter cliReaderLib ${core_libs} ${dependency_libs})
53+
target_include_directories(traceFilter PRIVATE ${libCacheSim_include_dir} ${GLib_INCLUDE_DIRS})
54+
target_link_libraries(traceFilter ${PROJECT_NAME} cliReaderLib)
4755
set_target_properties(traceFilter
4856
PROPERTIES
4957
CXX_STANDARD 17
@@ -52,4 +60,3 @@ set_target_properties(traceFilter
5260
)
5361

5462
install(TARGETS traceFilter RUNTIME DESTINATION bin)
55-

0 commit comments

Comments
 (0)