If an executable marks symbols with __declspec(dllexport) then VS creates an import library for it. However, it forgets to create the directory that will contain the import library if it is different from the location of the executable. We work around this VS bug by creating a pre-build event on the executable target to make the directory.
50 lines
1.7 KiB
CMake
50 lines
1.7 KiB
CMake
cmake_minimum_required (VERSION 2.6)
|
|
PROJECT(Plugin)
|
|
|
|
# Test per-target output directory properties.
|
|
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${Plugin_BINARY_DIR}/bin)
|
|
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${Plugin_BINARY_DIR}/lib/plugin)
|
|
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${Plugin_BINARY_DIR}/lib/static)
|
|
|
|
# We need ansi C support.
|
|
IF(CMAKE_ANSI_CFLAGS)
|
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_ANSI_CFLAGS}")
|
|
ENDIF(CMAKE_ANSI_CFLAGS)
|
|
|
|
# We need the dynamic loader support from KWSys to load the plugin in
|
|
# the executable.
|
|
SET(KWSYS_NAMESPACE kwsys)
|
|
SET(KWSYS_HEADER_ROOT ${Plugin_BINARY_DIR}/include)
|
|
SET(KWSYS_USE_DynamicLoader 1)
|
|
ADD_SUBDIRECTORY(${Plugin_SOURCE_DIR}/../../Source/kwsys src/kwsys)
|
|
|
|
# Configure the location of plugins.
|
|
CONFIGURE_FILE(${Plugin_SOURCE_DIR}/src/example_exe.h.in
|
|
${Plugin_BINARY_DIR}/include/example_exe.h @ONLY)
|
|
|
|
# We need to include headers from the source tree and configured
|
|
# headers in the build tree.
|
|
INCLUDE_DIRECTORIES(
|
|
${Plugin_BINARY_DIR}/include
|
|
${Plugin_SOURCE_DIR}/include
|
|
)
|
|
|
|
# Create an executable that exports an API for use by plugins.
|
|
ADD_EXECUTABLE(example_exe src/example_exe.cxx)
|
|
SET_TARGET_PROPERTIES(example_exe PROPERTIES
|
|
ENABLE_EXPORTS 1
|
|
OUTPUT_NAME example
|
|
# Test placing exe import library in unique directory.
|
|
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/exe
|
|
)
|
|
TARGET_LINK_LIBRARIES(example_exe kwsys)
|
|
|
|
# Create a plugin that uses the API provided by the executable.
|
|
# This module "links" to the executable to use the symbols.
|
|
ADD_LIBRARY(example_mod_1 MODULE src/example_mod_1.c)
|
|
TARGET_LINK_LIBRARIES(example_mod_1 example_exe)
|
|
|
|
# TODO:
|
|
# - create a plugin that links to a static lib
|
|
# - create a plugin that links to a shared lib
|