mirror of
https://github.com/yasm/yasm
synced 2026-08-26 22:26:05 -04:00
Not default nor even distributed in the .tar.gz, the cmake build allows for loadable yasm plugins by building libyasm as a shared library. Example plugins are in the plugins/ directory, and may be loaded into a cmake-built yasm using the -N command line option (non-cmake builds will not have this option). Tested only on Linux so far, but should be relatively painless to port to Windows thanks to the use of cmake rather than libtool to create shared libraries. The only modification to the main source tree is some conditional-compiled additions to yasm.c. svn path=/trunk/yasm/; revision=2098
89 lines
3.3 KiB
CMake
89 lines
3.3 KiB
CMake
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
INCLUDE(arch/CMakeLists.txt)
|
|
INCLUDE(listfmts/CMakeLists.txt)
|
|
INCLUDE(parsers/CMakeLists.txt)
|
|
INCLUDE(preprocs/CMakeLists.txt)
|
|
INCLUDE(dbgfmts/CMakeLists.txt)
|
|
INCLUDE(objfmts/CMakeLists.txt)
|
|
|
|
MESSAGE(STATUS "Standard modules: ${YASM_MODULES}")
|
|
|
|
#
|
|
# Generate init_plugin.c
|
|
# This file provides the yasm_init_plugin() function for yasmstd.
|
|
#
|
|
|
|
SET(INIT_PLUGIN_C ${CMAKE_CURRENT_BINARY_DIR}/init_plugin.c)
|
|
SET(INIT_PLUGIN_C_REV 1)
|
|
|
|
# Don't regen if no changes; default to regen
|
|
SET(regen_init_plugin_c TRUE)
|
|
IF(EXISTS ${INIT_PLUGIN_C})
|
|
FILE(READ ${INIT_PLUGIN_C} _old_init_plugin_c)
|
|
STRING(REGEX MATCHALL "[^\n]*\n" _lines "${_old_init_plugin_c}")
|
|
#MESSAGE(STATUS "Lines: ${_lines}")
|
|
|
|
LIST(GET _lines 0 _line0)
|
|
STRING(REGEX MATCH "([A-Za-z][A-Za-z0-9_]+[ ]?)+" _old_modules "${_line0}")
|
|
#MESSAGE(STATUS "Old modules: ${_old_modules}")
|
|
STRING(REPLACE ";" " " _modules_str "${YASM_MODULES}")
|
|
STRING(COMPARE EQUAL "${_old_modules}" "${_modules_str} " _modules_match)
|
|
|
|
LIST(GET _lines 1 _line1)
|
|
STRING(REGEX MATCH "rev [0-9]+" _old_modules_rev "${_line1}")
|
|
#MESSAGE(STATUS "Old modules rev: ${_old_modules_rev}")
|
|
STRING(COMPARE EQUAL "${_old_modules_rev}" "rev ${INIT_PLUGIN_C_REV}"
|
|
_modules_rev_match)
|
|
|
|
IF(_modules_match AND _modules_rev_match)
|
|
SET(regen_init_plugin_c FALSE)
|
|
ENDIF(_modules_match AND _modules_rev_match)
|
|
ENDIF(EXISTS ${INIT_PLUGIN_C})
|
|
|
|
IF(regen_init_plugin_c)
|
|
MESSAGE(STATUS "Generating standard plugin initialization file")
|
|
STRING(REPLACE ";" " " _modules_str "${YASM_MODULES}")
|
|
FILE(WRITE ${INIT_PLUGIN_C} "/* ${_modules_str} \n")
|
|
FILE(APPEND ${INIT_PLUGIN_C} " rev ${INIT_PLUGIN_C_REV}\n")
|
|
FILE(APPEND ${INIT_PLUGIN_C} " */\n\n")
|
|
FILE(APPEND ${INIT_PLUGIN_C} "#include <libyasm.h>\n")
|
|
FILE(APPEND ${INIT_PLUGIN_C} "#include <libyasm/module.h>\n\n")
|
|
FOREACH(module ${YASM_MODULES})
|
|
STRING(REGEX MATCHALL "[a-zA-Z][a-zA-Z0-9]+" _modulepath ${module})
|
|
LIST(GET _modulepath 0 _type)
|
|
LIST(GET _modulepath 1 _keyword)
|
|
FILE(APPEND ${INIT_PLUGIN_C}
|
|
"extern yasm_${_type}_module yasm_${_keyword}_LTX_${_type};\n")
|
|
ENDFOREACH(module)
|
|
FILE(APPEND ${INIT_PLUGIN_C} "\n#ifdef _MSC_VER\n")
|
|
FILE(APPEND ${INIT_PLUGIN_C} "__declspec(dllexport)\n")
|
|
FILE(APPEND ${INIT_PLUGIN_C} "#endif\n")
|
|
FILE(APPEND ${INIT_PLUGIN_C} "void\n")
|
|
FILE(APPEND ${INIT_PLUGIN_C} "yasm_init_plugin(void)\n")
|
|
FILE(APPEND ${INIT_PLUGIN_C} "{\n")
|
|
FOREACH(module ${YASM_MODULES})
|
|
STRING(REGEX MATCHALL "[a-zA-Z][a-zA-Z0-9]+" _modulepath ${module})
|
|
LIST(GET _modulepath 0 _type)
|
|
LIST(GET _modulepath 1 _keyword)
|
|
SET(_data "yasm_${_keyword}_LTX_${_type}")
|
|
STRING(TOUPPER "${_type}" _type)
|
|
FILE(APPEND ${INIT_PLUGIN_C}
|
|
" yasm_register_module(YASM_MODULE_${_type}, \"${_keyword}\", &${_data});\n")
|
|
ENDFOREACH(module)
|
|
FILE(APPEND ${INIT_PLUGIN_C} "}\n")
|
|
ELSE(regen_init_plugin_c)
|
|
MESSAGE(STATUS "Not regenerating static modules file (unchanged)")
|
|
ENDIF(regen_init_plugin_c)
|
|
|
|
SET_SOURCE_FILES_PROPERTIES(init_plugin.c GENERATED)
|
|
|
|
SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})
|
|
|
|
ADD_LIBRARY(yasmstd MODULE
|
|
init_plugin.c
|
|
${YASM_MODULES_SRC}
|
|
)
|
|
TARGET_LINK_LIBRARIES(yasmstd libyasm)
|
|
|
|
INSTALL(TARGETS yasmstd LIBRARY DESTINATION lib)
|