yasm/modules/CMakeLists.txt
Peter Johnson b7f2fbc64f Add cmake build infrastructure.
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
2008-05-22 09:08:03 +00:00

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)