• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1cmake_minimum_required(VERSION 2.6)
2project(capstone)
3
4set(VERSION_MAJOR 3)
5set(VERSION_MINOR 0)
6set(VERSION_PATCH 5)
7
8# to configure the options specify them in in the command line or change them in the cmake UI.
9# Don't edit the makefile!
10option(CAPSTONE_BUILD_STATIC_RUNTIME "Embed static runtime" OFF)
11option(CAPSTONE_BUILD_STATIC "Build static library" ON)
12option(CAPSTONE_BUILD_SHARED "Build shared library" ON)
13option(CAPSTONE_BUILD_DIET "Build diet library" OFF)
14option(CAPSTONE_BUILD_TESTS "Build tests" ON)
15option(CAPSTONE_USE_DEFAULT_ALLOC "Use default memory allocation functions" ON)
16
17option(CAPSTONE_ARM_SUPPORT "ARM support" ON)
18option(CAPSTONE_ARM64_SUPPORT "ARM64 support" ON)
19option(CAPSTONE_MIPS_SUPPORT "MIPS support" ON)
20option(CAPSTONE_PPC_SUPPORT "PowerPC support" ON)
21option(CAPSTONE_SPARC_SUPPORT "Sparc support" ON)
22option(CAPSTONE_SYSZ_SUPPORT "SystemZ support" ON)
23option(CAPSTONE_XCORE_SUPPORT "XCore support" ON)
24option(CAPSTONE_X86_SUPPORT "x86 support" ON)
25option(CAPSTONE_X86_REDUCE "x86 with reduce instruction sets to minimize library" OFF)
26option(CAPSTONE_X86_ATT_DISABLE "Disable x86 AT&T syntax" OFF)
27option(CAPSTONE_OSXKERNEL_SUPPORT "Support to embed Capstone into OS X Kernel extensions" OFF)
28
29if (CAPSTONE_BUILD_DIET)
30    add_definitions(-DCAPSTONE_DIET)
31endif ()
32
33if (CAPSTONE_USE_DEFAULT_ALLOC)
34    add_definitions(-DCAPSTONE_USE_SYS_DYN_MEM)
35endif ()
36
37if (CAPSTONE_X86_REDUCE)
38    add_definitions(-DCAPSTONE_X86_REDUCE)
39endif ()
40
41if (CAPSTONE_X86_ATT_DISABLE)
42    add_definitions(-DCAPSTONE_X86_ATT_DISABLE)
43endif ()
44
45## sources
46set(SOURCES_ENGINE
47    cs.c
48    MCInst.c
49    MCInstrDesc.c
50    MCRegisterInfo.c
51    SStream.c
52    utils.c
53    )
54
55set(HEADERS_ENGINE
56    include/capstone.h
57    utils.h
58    MCRegisterInfo.h
59    MCInst.h
60    MCInstrDesc.h
61    SStream.h
62    cs_priv.h
63    include/platform.h
64    )
65
66set(HEADERS_COMMON
67    include/arm64.h
68    include/arm.h
69    include/capstone.h
70    include/mips.h
71    include/ppc.h
72    include/x86.h
73    include/sparc.h
74    include/systemz.h
75    include/xcore.h
76    include/platform.h
77    )
78
79
80set(TEST_SOURCES test_basic.c test_detail.c test_skipdata.c test_iter.c)
81
82## architecture support
83if (CAPSTONE_ARM_SUPPORT)
84    add_definitions(-DCAPSTONE_HAS_ARM)
85    set(SOURCES_ARM
86        arch/ARM/ARMDisassembler.c
87        arch/ARM/ARMInstPrinter.c
88        arch/ARM/ARMMapping.c
89        arch/ARM/ARMModule.c
90        )
91    set(HEADERS_ARM
92        arch/ARM/ARMAddressingModes.h
93        arch/ARM/ARMBaseInfo.h
94        arch/ARM/ARMDisassembler.h
95        arch/ARM/ARMGenAsmWriter.inc
96        arch/ARM/ARMGenDisassemblerTables.inc
97        arch/ARM/ARMGenInstrInfo.inc
98        arch/ARM/ARMGenRegisterInfo.inc
99        arch/ARM/ARMGenSubtargetInfo.inc
100        arch/ARM/ARMInstPrinter.h
101        arch/ARM/ARMMapping.h
102        )
103    set(TEST_SOURCES ${TEST_SOURCES} test_arm.c)
104endif ()
105
106if (CAPSTONE_ARM64_SUPPORT)
107    add_definitions(-DCAPSTONE_HAS_ARM64)
108    set(SOURCES_ARM64
109        arch/AArch64/AArch64BaseInfo.c
110        arch/AArch64/AArch64Disassembler.c
111        arch/AArch64/AArch64InstPrinter.c
112        arch/AArch64/AArch64Mapping.c
113        arch/AArch64/AArch64Module.c
114        )
115    set(HEADERS_ARM64
116        arch/AArch64/AArch64AddressingModes.h
117        arch/AArch64/AArch64BaseInfo.h
118        arch/AArch64/AArch64Disassembler.h
119        arch/AArch64/AArch64GenAsmWriter.inc
120        arch/AArch64/AArch64GenDisassemblerTables.inc
121        arch/AArch64/AArch64GenInstrInfo.inc
122        arch/AArch64/AArch64GenRegisterInfo.inc
123        arch/AArch64/AArch64GenSubtargetInfo.inc
124        arch/AArch64/AArch64InstPrinter.h
125        arch/AArch64/AArch64Mapping.h
126        )
127    set(TEST_SOURCES ${TEST_SOURCES} test_arm64.c)
128endif ()
129
130if (CAPSTONE_MIPS_SUPPORT)
131    add_definitions(-DCAPSTONE_HAS_MIPS)
132    set(SOURCES_MIPS
133        arch/Mips/MipsDisassembler.c
134        arch/Mips/MipsInstPrinter.c
135        arch/Mips/MipsMapping.c
136        arch/Mips/MipsModule.c
137        )
138    set(HEADERS_MIPS
139        arch/Mips/MipsDisassembler.h
140        arch/Mips/MipsGenAsmWriter.inc
141        arch/Mips/MipsGenDisassemblerTables.inc
142        arch/Mips/MipsGenInstrInfo.inc
143        arch/Mips/MipsGenRegisterInfo.inc
144        arch/Mips/MipsGenSubtargetInfo.inc
145        arch/Mips/MipsInstPrinter.h
146        arch/Mips/MipsMapping.h
147        )
148    set(TEST_SOURCES ${TEST_SOURCES} test_mips.c)
149endif ()
150
151if (CAPSTONE_PPC_SUPPORT)
152    add_definitions(-DCAPSTONE_HAS_POWERPC)
153    set(SOURCES_PPC
154        arch/PowerPC/PPCDisassembler.c
155        arch/PowerPC/PPCInstPrinter.c
156        arch/PowerPC/PPCMapping.c
157        arch/PowerPC/PPCModule.c
158        )
159    set(HEADERS_PPC
160        arch/PowerPC/PPCDisassembler.h
161        arch/PowerPC/PPCGenAsmWriter.inc
162        arch/PowerPC/PPCGenDisassemblerTables.inc
163        arch/PowerPC/PPCGenInstrInfo.inc
164        arch/PowerPC/PPCGenRegisterInfo.inc
165        arch/PowerPC/PPCGenSubtargetInfo.inc
166        arch/PowerPC/PPCInstPrinter.h
167        arch/PowerPC/PPCMapping.h
168        arch/PowerPC/PPCPredicates.h
169        )
170    set(TEST_SOURCES ${TEST_SOURCES} test_ppc.c)
171endif ()
172
173if (CAPSTONE_X86_SUPPORT)
174    add_definitions(-DCAPSTONE_HAS_X86)
175    set(SOURCES_X86
176        arch/X86/X86Disassembler.c
177        arch/X86/X86DisassemblerDecoder.c
178        arch/X86/X86IntelInstPrinter.c
179        arch/X86/X86Mapping.c
180        arch/X86/X86Module.c
181        )
182    set(HEADERS_X86
183        arch/X86/X86BaseInfo.h
184        arch/X86/X86Disassembler.h
185        arch/X86/X86DisassemblerDecoder.h
186        arch/X86/X86DisassemblerDecoderCommon.h
187        arch/X86/X86GenAsmWriter.inc
188        arch/X86/X86GenAsmWriter1.inc
189        arch/X86/X86GenAsmWriter1_reduce.inc
190        arch/X86/X86GenAsmWriter_reduce.inc
191        arch/X86/X86GenDisassemblerTables.inc
192        arch/X86/X86GenDisassemblerTables_reduce.inc
193        arch/X86/X86GenInstrInfo.inc
194        arch/X86/X86GenInstrInfo_reduce.inc
195        arch/X86/X86GenRegisterInfo.inc
196        arch/X86/X86InstPrinter.h
197        arch/X86/X86Mapping.h
198        )
199    if (NOT CAPSTONE_BUILD_DIET)
200        set(SOURCES_X86 ${SOURCES_X86} arch/X86/X86ATTInstPrinter.c)
201    endif ()
202    set(TEST_SOURCES ${TEST_SOURCES} test_x86.c)
203endif ()
204
205if (CAPSTONE_SPARC_SUPPORT)
206    add_definitions(-DCAPSTONE_HAS_SPARC)
207    set(SOURCES_SPARC
208        arch/Sparc/SparcDisassembler.c
209        arch/Sparc/SparcInstPrinter.c
210        arch/Sparc/SparcMapping.c
211        arch/Sparc/SparcModule.c
212        )
213    set(HEADERS_SPARC
214        arch/Sparc/Sparc.h
215        arch/Sparc/SparcDisassembler.h
216        arch/Sparc/SparcGenAsmWriter.inc
217        arch/Sparc/SparcGenDisassemblerTables.inc
218        arch/Sparc/SparcGenInstrInfo.inc
219        arch/Sparc/SparcGenRegisterInfo.inc
220        arch/Sparc/SparcGenSubtargetInfo.inc
221        arch/Sparc/SparcInstPrinter.h
222        arch/Sparc/SparcMapping.h
223        )
224    set(TEST_SOURCES ${TEST_SOURCES} test_sparc.c)
225endif ()
226
227if (CAPSTONE_SYSZ_SUPPORT)
228    add_definitions(-DCAPSTONE_HAS_SYSZ)
229    set(SOURCES_SYSZ
230        arch/SystemZ/SystemZDisassembler.c
231        arch/SystemZ/SystemZInstPrinter.c
232        arch/SystemZ/SystemZMapping.c
233        arch/SystemZ/SystemZModule.c
234        arch/SystemZ/SystemZMCTargetDesc.c
235        )
236    set(HEADERS_SYSZ
237        arch/SystemZ/SystemZDisassembler.h
238        arch/SystemZ/SystemZGenAsmWriter.inc
239        arch/SystemZ/SystemZGenDisassemblerTables.inc
240        arch/SystemZ/SystemZGenInstrInfo.inc
241        arch/SystemZ/SystemZGenRegisterInfo.inc
242        arch/SystemZ/SystemZGenSubtargetInfo.inc
243        arch/SystemZ/SystemZInstPrinter.h
244        arch/SystemZ/SystemZMCTargetDesc.h
245        arch/SystemZ/SystemZMapping.h
246        )
247    set(TEST_SOURCES ${TEST_SOURCES} test_systemz.c)
248endif ()
249
250if (CAPSTONE_XCORE_SUPPORT)
251    add_definitions(-DCAPSTONE_HAS_XCORE)
252    set(SOURCES_XCORE
253        arch/XCore/XCoreDisassembler.c
254        arch/XCore/XCoreInstPrinter.c
255        arch/XCore/XCoreMapping.c
256        arch/XCore/XCoreModule.c
257        )
258    set(HEADERS_XCORE
259        arch/XCore/XCoreDisassembler.h
260        arch/XCore/XCoreGenAsmWriter.inc
261        arch/XCore/XCoreGenDisassemblerTables.inc
262        arch/XCore/XCoreGenInstrInfo.inc
263        arch/XCore/XCoreGenRegisterInfo.inc
264        arch/XCore/XCoreInstPrinter.h
265        arch/XCore/XCoreMapping.h
266        )
267    set(TEST_SOURCES ${TEST_SOURCES} test_xcore.c)
268endif ()
269
270if (CAPSTONE_OSXKERNEL_SUPPORT)
271    add_definitions(-DCAPSTONE_HAS_OSXKERNEL)
272endif ()
273
274set(ALL_SOURCES
275    ${SOURCES_ENGINE}
276    ${SOURCES_ARM}
277    ${SOURCES_ARM64}
278    ${SOURCES_MIPS}
279    ${SOURCES_PPC}
280    ${SOURCES_X86}
281    ${SOURCES_SPARC}
282    ${SOURCES_SYSZ}
283    ${SOURCES_XCORE}
284    )
285
286set(ALL_HEADERS
287    ${HEADERS_COMMON}
288    ${HEADERS_ENGINE}
289    ${HEADERS_ARM}
290    ${HEADERS_ARM64}
291    ${HEADERS_MIPS}
292    ${HEADERS_PPC}
293    ${HEADERS_X86}
294    ${HEADERS_SPARC}
295    ${HEADERS_SYSZ}
296    ${HEADERS_XCORE}
297    )
298
299include_directories("${PROJECT_SOURCE_DIR}/include")
300
301## properties
302# version info
303set_property(GLOBAL PROPERTY VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
304
305## targets
306if (CAPSTONE_BUILD_STATIC)
307    add_library(capstone-static STATIC ${ALL_SOURCES} ${ALL_HEADERS})
308    set_property(TARGET capstone-static PROPERTY OUTPUT_NAME capstone)
309    set(default-target capstone-static)
310endif ()
311
312# Force static runtime libraries
313if (CAPSTONE_BUILD_STATIC_RUNTIME)
314    FOREACH(flag
315        CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO
316        CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_DEBUG_INIT
317        CMAKE_CXX_FLAGS_RELEASE  CMAKE_CXX_FLAGS_RELWITHDEBINFO
318        CMAKE_CXX_FLAGS_DEBUG  CMAKE_CXX_FLAGS_DEBUG_INIT)
319        if (MSVC)
320            STRING(REPLACE "/MD"  "/MT" "${flag}" "${${flag}}")
321            SET("${flag}" "${${flag}} /EHsc")
322        endif (MSVC)
323    ENDFOREACH()
324endif ()
325
326if (CAPSTONE_BUILD_SHARED)
327    add_library(capstone-shared SHARED ${ALL_SOURCES} ${ALL_HEADERS})
328    set_property(TARGET capstone-shared PROPERTY OUTPUT_NAME capstone)
329    set_property(TARGET capstone-shared PROPERTY COMPILE_FLAGS -DCAPSTONE_SHARED)
330
331    if (MSVC)
332        set_target_properties(capstone-shared PROPERTIES IMPORT_SUFFIX _dll.lib)
333    else()
334        set_target_properties(capstone-shared PROPERTIES
335	    VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
336	    SOVERSION ${VERSION_MAJOR})
337    endif ()
338
339    if(NOT DEFINED default-target)      # honor `capstone-static` for tests first.
340        set(default-target capstone-shared)
341        add_definitions(-DCAPSTONE_SHARED)
342    endif ()
343endif ()
344
345if (CAPSTONE_BUILD_TESTS)
346    foreach (TSRC ${TEST_SOURCES})
347        STRING(REGEX REPLACE ".c$" "" TBIN ${TSRC})
348        add_executable(${TBIN} "tests/${TSRC}")
349        target_link_libraries(${TBIN} ${default-target})
350    endforeach ()
351    if (CAPSTONE_ARM_SUPPORT)
352        set(ARM_REGRESS_TEST test_arm_regression.c)
353        STRING(REGEX REPLACE ".c$" "" ARM_REGRESS_BIN ${ARM_REGRESS_TEST})
354        add_executable(${ARM_REGRESS_BIN} "suite/arm/${ARM_REGRESS_TEST}")
355        target_link_libraries(${ARM_REGRESS_BIN} ${default-target})
356    endif()
357endif ()
358
359source_group("Source\\Engine" FILES ${SOURCES_ENGINE})
360source_group("Source\\ARM" FILES ${SOURCES_ARM})
361source_group("Source\\ARM64" FILES ${SOURCES_ARM64})
362source_group("Source\\Mips" FILES ${SOURCES_MIPS})
363source_group("Source\\PowerPC" FILES ${SOURCES_PPC})
364source_group("Source\\Sparc" FILES ${SOURCES_SPARC})
365source_group("Source\\SystemZ" FILES ${SOURCES_SYSZ})
366source_group("Source\\X86" FILES ${SOURCES_X86})
367source_group("Source\\XCore" FILES ${SOURCES_XCORE})
368
369source_group("Include\\Common" FILES ${HEADERS_COMMON})
370source_group("Include\\Engine" FILES ${HEADERS_ENGINE})
371source_group("Include\\ARM" FILES ${HEADERS_ARM})
372source_group("Include\\ARM64" FILES ${HEADERS_ARM64})
373source_group("Include\\Mips" FILES ${HEADERS_MIPS})
374source_group("Include\\PowerPC" FILES ${HEADERS_PPC})
375source_group("Include\\Sparc" FILES ${HEADERS_SPARC})
376source_group("Include\\SystemZ" FILES ${HEADERS_SYSZ})
377source_group("Include\\X86" FILES ${HEADERS_X86})
378source_group("Include\\XCore" FILES ${HEADERS_XCORE})
379
380### test library 64bit routine:
381get_property(LIB64 GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS)
382
383if (NOT APPLE AND "${LIB64}" STREQUAL "TRUE")
384    set(LIBSUFFIX 64)
385else()
386    set(LIBSUFFIX "")
387endif()
388
389set(INSTALL_LIB_DIR     lib${LIBSUFFIX} CACHE PATH "Installation directory for libraries")
390mark_as_advanced(INSTALL_LIB_DIR)
391
392## installation
393install(FILES ${HEADERS_COMMON} DESTINATION include/capstone)
394configure_file(capstone.pc.in capstone.pc)
395
396if (CAPSTONE_BUILD_STATIC)
397    install(TARGETS capstone-static
398            RUNTIME DESTINATION bin
399            LIBRARY DESTINATION ${INSTALL_LIB_DIR}
400            ARCHIVE DESTINATION ${INSTALL_LIB_DIR})
401endif ()
402
403if (CAPSTONE_BUILD_SHARED)
404    install(TARGETS capstone-shared
405            RUNTIME DESTINATION bin
406            LIBRARY DESTINATION ${INSTALL_LIB_DIR}
407            ARCHIVE DESTINATION ${INSTALL_LIB_DIR})
408endif ()
409
410if (CAPSTONE_BUILD_SHARED)
411FILE(GLOB CSTOOL_SRC cstool/*.c)
412add_executable(cstool ${CSTOOL_SRC})
413target_link_libraries(cstool ${default-target})
414
415install(TARGETS cstool DESTINATION bin)
416install(FILES ${CMAKE_BINARY_DIR}/capstone.pc DESTINATION lib/pkgconfig)
417endif ()
418