Skip to content

Commit b54b152

Browse files
author
Dan Dees
committed
FIRST - add cmake build generator - CMakeLists.txt
- out of source build - no projects or build artifacts polluting source tree - supports CI/CD automation - generates many build types with simple command line option - https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html - ninja - FAST command line - visual studio project - msbuild - msys make - name - builds static, shared (DLL), and "reflection main" libraries - shared library includes 3rd party - no install needed of Detours as linked into DLL - support shared DLL and "relection" option DLL - creates library/header installation - installs as package - supports vcpkg, conan, CPM - supports nuget - https://cmake.org/cmake/help/latest/cpack_gen/nuget.html - builds 3rd party deps - automates debug and release builds - done with ninja/msbuild - exports config for use in other cmake project - MemoryModulePPConfigVersion.cmake - find_package(MemoryModulePP CONFIG) is enough to use in another project - https://cmake.org/cmake/help/latest/command/find_package.html - importing and exporting cmake project - https://cmake.org/cmake/help/latest/guide/importing-exporting/index.html - maintainable - LLMs such as ChatGPT can create/maintain CMakeLists.txt - no longer need to learn the book and best practices - CMakeList modern format with targets as objects - CMAKE_DEBUG_POSTIFIX allows debug and release dll/exe in same directory example ninja installation output ... -- Install configuration: "Debug" -- Install configuration: "Debug" -- Installing: x:/vs17-64/memorymodulepp/lib/MemoryModulePP-static_d.lib -- Installing: x:/vs17-64/memorymodulepp/include/BaseAddressIndex.h -- Installing: x:/vs17-64/memorymodulepp/include/ImportTable.h -- Installing: x:/vs17-64/memorymodulepp/include/Initialize.h -- Installing: x:/vs17-64/memorymodulepp/include/InvertedFunctionTable.h -- Installing: x:/vs17-64/memorymodulepp/include/LdrEntry.h -- Installing: x:/vs17-64/memorymodulepp/include/LoadDllMemoryApi.h -- Installing: x:/vs17-64/memorymodulepp/include/Loader.h -- Installing: x:/vs17-64/memorymodulepp/include/MemoryModule.h -- Installing: x:/vs17-64/memorymodulepp/include/MmpGlobalData.h -- Installing: x:/vs17-64/memorymodulepp/include/MmpDotNet.h -- Installing: x:/vs17-64/memorymodulepp/include/MmpTls.h -- Installing: x:/vs17-64/memorymodulepp/include/Utils.h -- Installing: x:/vs17-64/memorymodulepp/lib/MemoryModulePP-shared_d.lib -- Installing: x:/vs17-64/memorymodulepp/bin/MemoryModulePP-shared_d.dll -- Installing: x:/vs17-64/memorymodulepp/include/BaseAddressIndex.h -- Installing: x:/vs17-64/memorymodulepp/include/ImportTable.h -- Installing: x:/vs17-64/memorymodulepp/include/Initialize.h -- Installing: x:/vs17-64/memorymodulepp/include/InvertedFunctionTable.h -- Installing: x:/vs17-64/memorymodulepp/include/LdrEntry.h -- Installing: x:/vs17-64/memorymodulepp/include/LoadDllMemoryApi.h -- Installing: x:/vs17-64/memorymodulepp/include/Loader.h -- Installing: x:/vs17-64/memorymodulepp/include/MemoryModule.h -- Installing: x:/vs17-64/memorymodulepp/include/MmpGlobalData.h -- Installing: x:/vs17-64/memorymodulepp/include/MmpDotNet.h -- Installing: x:/vs17-64/memorymodulepp/include/MmpTls.h -- Installing: x:/vs17-64/memorymodulepp/include/Utils.h -- Installing: x:/vs17-64/memorymodulepp/lib/MemoryModulePP-relfect-shared_d.lib -- Installing: x:/vs17-64/memorymodulepp/bin/MemoryModulePP-relfect-shared_d.dll -- Installing: x:/vs17-64/memorymodulepp/include/BaseAddressIndex.h -- Installing: x:/vs17-64/memorymodulepp/include/ImportTable.h -- Installing: x:/vs17-64/memorymodulepp/include/Initialize.h -- Installing: x:/vs17-64/memorymodulepp/include/InvertedFunctionTable.h -- Installing: x:/vs17-64/memorymodulepp/include/LdrEntry.h -- Installing: x:/vs17-64/memorymodulepp/include/LoadDllMemoryApi.h -- Installing: x:/vs17-64/memorymodulepp/include/Loader.h -- Installing: x:/vs17-64/memorymodulepp/include/MemoryModule.h -- Installing: x:/vs17-64/memorymodulepp/include/MmpGlobalData.h -- Installing: x:/vs17-64/memorymodulepp/include/MmpDotNet.h -- Installing: x:/vs17-64/memorymodulepp/include/MmpTls.h -- Installing: x:/vs17-64/memorymodulepp/include/Utils.h -- Installing: x:/vs17-64/memorymodulepp/lib/cmake/MemoryModulePP/MemoryModulePPTargets.cmake -- Installing: x:/vs17-64/memorymodulepp/lib/cmake/MemoryModulePP/MemoryModulePPTargets-debug.cmake -- Installing: x:/vs17-64/memorymodulepp/lib/cmake/MemoryModulePP/MemoryModulePPConfig.cmake -- Installing: x:/vs17-64/memorymodulepp/lib/cmake/MemoryModulePP/MemoryModulePPConfigVersion.cmake
1 parent 588b48e commit b54b152

File tree

7 files changed

+326
-0
lines changed

7 files changed

+326
-0
lines changed

3rdparty/CMakelists.txt

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
cmake_minimum_required(VERSION 3.30)
2+
project(Detours LANGUAGES CXX)
3+
4+
set(CMAKE_CXX_STANDARD 23)
5+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
6+
7+
set(libname lib_detours)
8+
set(DETOURS_SOURCE Detours)
9+
10+
add_library(${libname} STATIC)
11+
target_include_directories(${libname} PRIVATE ${DETOURS_SOURCE})
12+
target_sources(${libname} PRIVATE
13+
${DETOURS_SOURCE}/creatwth.cpp
14+
${DETOURS_SOURCE}/detours.cpp
15+
${DETOURS_SOURCE}/disasm.cpp
16+
${DETOURS_SOURCE}/disolarm.cpp
17+
${DETOURS_SOURCE}/disolarm64.cpp
18+
${DETOURS_SOURCE}/disolia64.cpp
19+
${DETOURS_SOURCE}/disolx64.cpp
20+
${DETOURS_SOURCE}/disolx86.cpp
21+
${DETOURS_SOURCE}/image.cpp
22+
${DETOURS_SOURCE}/modules.cpp
23+
${DETOURS_SOURCE}/uimports.cpp
24+
${DETOURS_SOURCE}/detours.h
25+
${DETOURS_SOURCE}/detver.h
26+
)
27+
28+
# This file is included and not compiled on its own
29+
set_property (
30+
SOURCE ${DETOURS_SOURCE}/uimports.cpp
31+
APPEND PROPERTY HEADER_FILE_ONLY true)
32+
33+
# Install libraries and public headers
34+
install(TARGETS ${libname}
35+
EXPORT ${PROJECT_NAME}Targets
36+
LIBRARY DESTINATION lib
37+
ARCHIVE DESTINATION lib
38+
RUNTIME DESTINATION bin
39+
FILE_SET HEADERS DESTINATION include
40+
)
41+
42+
# Install export file
43+
install(EXPORT ${PROJECT_NAME}Targets
44+
FILE ${PROJECT_NAME}Targets.cmake
45+
NAMESPACE ${PROJECT_NAME}::
46+
DESTINATION lib/cmake/${PROJECT_NAME}
47+
)
48+
49+
# Generate and install CMake config file
50+
include(CMakePackageConfigHelpers)
51+
write_basic_package_version_file(
52+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
53+
VERSION 1.0.0
54+
COMPATIBILITY SameMajorVersion
55+
)
56+
57+
configure_file(
58+
"${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in"
59+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
60+
@ONLY
61+
)
62+
63+
install(FILES
64+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
65+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
66+
DESTINATION lib/cmake/${PROJECT_NAME}
67+
)
68+
69+
# CPack configuration for packaging
70+
set(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
71+
set(CPACK_PACKAGE_VERSION "1.0.0")
72+
set(CPACK_PACKAGE_DESCRIPTION "A custom MemoryModulePP implementation")
73+
set(CPACK_PACKAGE_VENDOR "xAI")
74+
set(CPACK_GENERATOR "ZIP;TGZ")
75+
include(CPack)

3rdparty/DetoursConfig.cmake.in

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
@PACKAGE_INIT@
2+
3+
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
4+
check_required_components("@PROJECT_NAME@")

CMakeLists.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
cmake_minimum_required(VERSION 3.27)
2+
project(MemoryModulePP LANGUAGES CXX)
3+
4+
set(CMAKE_CXX_STANDARD 23)
5+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
6+
7+
# add _d to debug targets
8+
SET(CMAKE_DEBUG_POSTFIX _d)
9+
10+
# build spec done in subdirectories
11+
add_subdirectory(3rdparty)
12+
add_subdirectory(a)
13+
add_subdirectory(MemoryModule)
14+
add_subdirectory(test)

MemoryModule/CMakeLists.txt

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
cmake_minimum_required(VERSION 3.30)
2+
project(MemoryModulePP LANGUAGES CXX)
3+
4+
# Define static library target
5+
set(static_libname "MemoryModulePP-static")
6+
add_library(${static_libname} STATIC)
7+
8+
# Define shared library target
9+
set(shared_libname "MemoryModulePP-shared")
10+
add_library(${shared_libname} SHARED)
11+
12+
# turn on "reflection"
13+
target_compile_definitions(${shared_libname} PRIVATE _USRDLL)
14+
15+
# link libraries for DLL
16+
target_link_libraries(${shared_libname} PRIVATE lib_detours)
17+
18+
# Common sources and headers for both libraries
19+
set(common_sources
20+
BaseAddressIndex.cpp
21+
ImportTable.cpp
22+
Initialize.cpp
23+
InvertedFunctionTable.cpp
24+
LdrEntry.cpp
25+
LoadDllMemoryApi.cpp
26+
Loader.cpp
27+
MemoryModule.cpp
28+
MmpDotNet.cpp
29+
MmpLdrpTls.cpp
30+
MmpTls.cpp
31+
MmpTlsFiber.cpp
32+
Utils.cpp
33+
34+
# exports
35+
MemoryModulePP.def
36+
)
37+
38+
set(common_public_headers
39+
BaseAddressIndex.h
40+
ImportTable.h
41+
Initialize.h
42+
InvertedFunctionTable.h
43+
LdrEntry.h
44+
LoadDllMemoryApi.h
45+
Loader.h
46+
MemoryModule.h
47+
MmpGlobalData.h
48+
MmpDotNet.h
49+
MmpTls.h
50+
Utils.h
51+
)
52+
53+
set(common_private_headers
54+
LoaderPrivate.h
55+
MmpTlsFiber.h
56+
MmpTlsp.h
57+
ReflectiveDLLInjection.h
58+
ReflectiveLoader.h
59+
)
60+
61+
# Specify sources and headers for static library
62+
target_sources(${static_libname}
63+
PRIVATE
64+
${common_sources}
65+
PUBLIC
66+
FILE_SET HEADERS
67+
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}
68+
FILES
69+
${common_public_headers}
70+
PRIVATE
71+
FILE_SET private_headers
72+
TYPE HEADERS
73+
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}
74+
FILES
75+
${common_private_headers}
76+
)
77+
78+
# Specify sources and headers for shared library
79+
target_sources(${shared_libname}
80+
PRIVATE
81+
${common_sources}
82+
PUBLIC
83+
FILE_SET HEADERS
84+
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}
85+
FILES
86+
${common_public_headers}
87+
PRIVATE
88+
FILE_SET private_headers
89+
TYPE HEADERS
90+
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}
91+
FILES
92+
${common_private_headers}
93+
)
94+
95+
# Set include directories for libraries
96+
foreach(libname ${static_libname} ${shared_libname})
97+
target_include_directories(${libname}
98+
PUBLIC
99+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
100+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
101+
$<INSTALL_INTERFACE:include>
102+
)
103+
104+
# Ensure C++ standard
105+
target_compile_features(${libname} PRIVATE cxx_std_23)
106+
107+
# key definitions
108+
target_compile_definitions(${libname} PRIVATE
109+
_MEMORY_MODULE
110+
_HAS_AUTO_INITIALIZE
111+
MMPP_USE_TLS=1
112+
)
113+
endforeach()
114+
115+
# Install libraries and public headers
116+
install(TARGETS ${static_libname} ${shared_libname}
117+
EXPORT ${PROJECT_NAME}Targets
118+
LIBRARY DESTINATION lib
119+
ARCHIVE DESTINATION lib
120+
RUNTIME DESTINATION bin
121+
FILE_SET HEADERS DESTINATION include
122+
)
123+
124+
# Install export file
125+
install(EXPORT ${PROJECT_NAME}Targets
126+
FILE ${PROJECT_NAME}Targets.cmake
127+
NAMESPACE ${PROJECT_NAME}::
128+
DESTINATION lib/cmake/${PROJECT_NAME}
129+
)
130+
131+
# Generate and install CMake config file
132+
include(CMakePackageConfigHelpers)
133+
write_basic_package_version_file(
134+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
135+
VERSION 1.0.0
136+
COMPATIBILITY SameMajorVersion
137+
)
138+
139+
configure_file(
140+
"${CMAKE_CURRENT_SOURCE_DIR}/../${PROJECT_NAME}Config.cmake.in"
141+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
142+
@ONLY
143+
)
144+
145+
install(FILES
146+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
147+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
148+
DESTINATION lib/cmake/${PROJECT_NAME}
149+
)
150+
151+
# CPack configuration for packaging
152+
set(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
153+
set(CPACK_PACKAGE_VERSION "1.0.0")
154+
set(CPACK_PACKAGE_DESCRIPTION "A custom MemoryModulePP implementation")
155+
set(CPACK_PACKAGE_VENDOR "xAI")
156+
set(CPACK_GENERATOR "ZIP;TGZ")
157+
include(CPack)

MemoryModulePPConfig.cmake.in

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
@PACKAGE_INIT@
2+
3+
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
4+
check_required_components("@PROJECT_NAME@")

a/CMakeLists.txt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
cmake_minimum_required(VERSION 3.30)
2+
project(a-sample LANGUAGES CXX)
3+
4+
set(libname "a")
5+
6+
add_library(${libname} SHARED)
7+
target_link_libraries(${libname} PRIVATE lib_detours)
8+
target_sources(${libname} PRIVATE
9+
# sources
10+
dllmain.cpp
11+
exception.cpp
12+
gdiplus.cpp
13+
thread.cpp
14+
15+
# exports
16+
m.def
17+
18+
# resources
19+
a.rc
20+
resource.h
21+
)
22+
23+
# put dll in local install dir
24+
set( INSTALL_DIR "${CMAKE_BINARY_DIR}/install")
25+
install(TARGETS ${libname}
26+
LIBRARY DESTINATION ${INSTALL_DIR}
27+
ARCHIVE DESTINATION ${INSTALL_DIR}
28+
RUNTIME DESTINATION ${INSTALL_DIR}
29+
)

test/CMakeLists.txt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
cmake_minimum_required(VERSION 3.27)
2+
project(mmtest LANGUAGES CXX)
3+
4+
# Define executable targets
5+
set(static_exename "mmtest-static")
6+
add_executable(${static_exename})
7+
target_link_libraries(${static_exename} PRIVATE
8+
MemoryModulePP-static
9+
lib_detours
10+
)
11+
12+
set(shared_exename "mmtest-shared")
13+
add_executable(${shared_exename})
14+
target_link_libraries(${shared_exename} PRIVATE
15+
MemoryModulePP-shared
16+
)
17+
18+
# use install directory under build to assemble tests
19+
set( INSTALL_DIR "${CMAKE_BINARY_DIR}/install")
20+
21+
foreach(exename ${static_exename} ${shared_exename})
22+
23+
# common sources and libs
24+
target_sources(${exename} PRIVATE test.cpp)
25+
26+
# copy exes into install dir
27+
install(TARGETS ${exename} RUNTIME DESTINATION ${INSTALL_DIR})
28+
29+
# add shared lib to PATH
30+
file(TO_NATIVE_PATH "$<TARGET_FILE_DIR:MemoryModulePP-shared>" MMSHARED_TARGET)
31+
string(REGEX REPLACE "/" "\\\\" MMSHARED_PATH ${MMSHARED_TARGET})
32+
set_target_properties(${exename} PROPERTIES
33+
VS_DEBUGGER_ENVIRONMENT
34+
"PATH=${MMSHARED_PATH};%PATH%"
35+
)
36+
37+
# pass path to target a_d.dll in VS debugger
38+
file(TO_NATIVE_PATH "$<TARGET_FILE:a>" A_DLL)
39+
set_target_properties(${exename} PROPERTIES
40+
"VS_DEBUGGER_COMMAND_ARGUMENTS"
41+
"${A_DLL}"
42+
)
43+
endforeach()

0 commit comments

Comments
 (0)