Meson - How to link a shared library to a project? - linker
I have 2 projects, one of which I want to compile as a shared library and other as my main executable linked the with shared library generated by the other project. Here is the structure of my project,
I have 3 meson.build files one for the HiveAPI project which will be compiled as a shared library and one for the SampleHive project which is my executable and one main meson.build file.
Here is my meson.build file for HiveAPI,
# Source files to be compiled
hive_src = [
'src/HiveAPI/Core/Application.cpp',
'src/HiveAPI/Core/Window.cpp',
'src/HiveAPI/Core/Log.cpp',
'src/HiveAPI/Input/Input.cpp',
'src/HiveAPI/GLFW/GLFWLayer.cpp',
'src/HiveAPI/ImGui/ImGuiLayer.cpp',
'src/HiveAPI/OpenGL/VertexBuffer.cpp',
'src/HiveAPI/OpenGL/IndexBuffer.cpp',
'src/HiveAPI/OpenGL/VertexArray.cpp',
'src/HiveAPI/OpenGL/Shader.cpp',
'src/HiveAPI/OpenGL/Renderer.cpp',
'src/HiveAPI/OpenGL/Texture.cpp',
'src/HiveAPI/OpenGL/Framebuffer.cpp',
'src/HiveAPI/Portaudio/Audio.cpp',
'src/HiveAPI/Taglib/Tags.cpp',
'vendor/stb_image/stb_image.cpp',
]
taglib_opts = cmake.subproject_options()
taglib_opts.add_cmake_defines({'CMAKE_POSITION_INDEPENDENT_CODE': 'ON',
'CMAKE_INSTALL_PREFIX': prefix,
'CMAKE_BUILD_TYPE': 'Release',
'BUILD_SHARED_LIBS': 'ON'})
snd_opts = cmake.subproject_options()
snd_shared = ''
if host_sys == 'windows'
snd_shared = 'OFF'
else
snd_shared = 'ON'
endif
snd_opts.add_cmake_defines({'CMAKE_POSITION_INDEPENDENT_CODE': 'ON',
'CMAKE_INSTALL_PREFIX': prefix,
'CMAKE_BUILD_TYPE': 'Release',
'BUILD_SHARED_LIBS': snd_shared,
'BUILD_PROGRAMS': 'OFF',
'BUILD_EXAMPLES': 'OFF',
'BUILD_TESTING': 'OFF',
'ENABLE_EXTERNAL_LIBS': 'ON',
'ENABLE_MPEG': 'ON'})
hive_api_inc = include_directories(['src', 'vendor'])
imgui_subproject = subproject('imgui',
default_options: [
'default_library=shared',
'compile_library=true',])
imgui = imgui_subproject.get_variable('imgui_dep')
glfw = dependency('glfw3')
glew = dependency('glew')
taglib = dependency('taglib', version: '>=1.12', required: false, static: false)
if not taglib.found()
taglib_subproject = cmake.subproject('taglib', options: taglib_opts)
taglib = taglib_subproject.dependency('tag')
endif
snd_subproject = cmake.subproject('libsndfile', options: snd_opts)
snd = snd_subproject.dependency('sndfile')
spdlog = dependency('spdlog', version: '>=1.8.5', required: false, static: false)
if not spdlog.found()
spdlog_subproject = subproject('spdlog',
default_options: [
'default_library=shared',
'compile_library=true',])
spdlog = spdlog_subproject.get_variable('spdlog_dep')
endif
portaudio = dependency('portaudio-2.0', static: false)
hive_deps = [imgui, glew, glfw, spdlog, portaudio, snd, taglib]
hive_lib = shared_library('hiveapi',
sources: hive_src,
include_directories : hive_api_inc,
install: true,
install_rpath: prefix / 'lib')
Here is the meson.build file for SampleHive,
# Source files to be compiled
samplehive_src = [
'src/SampleHive/GUI/Dockspace.cpp',
'src/SampleHive/GUI/DirectoryBrowser.cpp',
'src/SampleHive/GUI/MainWindow.cpp',
'src/SampleHive/GUI/SearchBar.cpp',
'src/SampleHive/GUI/SampleViewer.cpp',
'src/SampleHive/GUI/WaveformViewer.cpp',
'src/SampleHive/GUI/TransportControls.cpp',
'src/SampleHive/GUI/TabBar.cpp',
'src/SampleHive/GUI/Hives.cpp',
'src/SampleHive/GUI/Trash.cpp',
'src/SampleHive/GUI/Dialogs/ProgressDialog.cpp',
'src/SampleHive/GUI/Dialogs/SettingsDialog.cpp',
'src/SampleHive/Application.cpp',
'src/SampleHive/Utility/Serializer.cpp',
'src/SampleHive/Utility/Utils.cpp',
]
yaml = dependency('yaml-cpp')
samplehive_inc = include_directories(['../HiveAPI/src', 'src'])
executable('SampleHive',
sources: samplehive_src,
include_directories : samplehive_inc,
link_with: hive_lib,
dependencies: [yaml],
install: true,
install_rpath: prefix / 'lib')
And here is the main meson.build file,
project('SampleHive-Imgui',
['c', 'cpp'],
version : 'v0.1',
license : 'GPL v3',
meson_version: '>= 0.56.0',
default_options : ['warning_level=1',
'buildtype=debug',
'cpp_std=gnu++17'])
host_sys = host_machine.system()
cc = meson.get_compiler('c')
# Save project information
meson_src_root = meson.current_source_dir()
meson_build_root = meson.current_build_dir()
# Save important directories
prefix = get_option('prefix')
bindir = prefix / get_option('bindir')
libdir = prefix / get_option('libdir')
datadir = prefix / get_option('datadir')
# Import CMake
cmake = import('cmake')
subdir('HiveAPI')
subdir('SampleHive')
include_dirs = include_directories(['HiveAPI/src', 'HiveAPI/vendor', 'SampleHive/src'])
but when I try to compile it I get error saying it can't find imgui and spdlog if I add those to dependencies in the SampleHive project then I get undefined references to function defined in the HiveAPI.
I want the HiveAPI as shared library because I want this to be used by other projects as well either by me or anyone else.
If I have understood well SampleHive need to link HiveApi as shared lib, so in SampleHive you need to add the HiveApi dependency:
meson HiveApi:
project(
'HiveApi')
# Source files to be compiled
hive_src = [
'src/HiveAPI/Core/Application.cpp',
'src/HiveAPI/Core/Window.cpp',
'src/HiveAPI/Core/Log.cpp',
'src/HiveAPI/Input/Input.cpp',
'src/HiveAPI/GLFW/GLFWLayer.cpp',
'src/HiveAPI/ImGui/ImGuiLayer.cpp',
'src/HiveAPI/OpenGL/VertexBuffer.cpp',
'src/HiveAPI/OpenGL/IndexBuffer.cpp',
'src/HiveAPI/OpenGL/VertexArray.cpp',
'src/HiveAPI/OpenGL/Shader.cpp',
'src/HiveAPI/OpenGL/Renderer.cpp',
'src/HiveAPI/OpenGL/Texture.cpp',
'src/HiveAPI/OpenGL/Framebuffer.cpp',
'src/HiveAPI/Portaudio/Audio.cpp',
'src/HiveAPI/Taglib/Tags.cpp',
'vendor/stb_image/stb_image.cpp',
]
taglib_opts = cmake.subproject_options()
taglib_opts.add_cmake_defines({'CMAKE_POSITION_INDEPENDENT_CODE': 'ON',
'CMAKE_INSTALL_PREFIX': prefix,
'CMAKE_BUILD_TYPE': 'Release',
'BUILD_SHARED_LIBS': 'ON'})
snd_opts = cmake.subproject_options()
snd_shared = ''
if host_sys == 'windows'
snd_shared = 'OFF'
else
snd_shared = 'ON'
endif
snd_opts.add_cmake_defines({'CMAKE_POSITION_INDEPENDENT_CODE': 'ON',
'CMAKE_INSTALL_PREFIX': prefix,
'CMAKE_BUILD_TYPE': 'Release',
'BUILD_SHARED_LIBS': snd_shared,
'BUILD_PROGRAMS': 'OFF',
'BUILD_EXAMPLES': 'OFF',
'BUILD_TESTING': 'OFF',
'ENABLE_EXTERNAL_LIBS': 'ON',
'ENABLE_MPEG': 'ON'})
hive_api_inc = include_directories(['src', 'vendor'])
imgui_subproject = subproject('imgui',
default_options: [
'default_library=shared',
'compile_library=true',])
imgui = imgui_subproject.get_variable('imgui_dep')
glfw = dependency('glfw3')
glew = dependency('glew')
taglib = dependency('taglib', version: '>=1.12', required: false, static: false)
if not taglib.found()
taglib_subproject = cmake.subproject('taglib', options: taglib_opts)
taglib = taglib_subproject.dependency('tag')
endif
snd_subproject = cmake.subproject('libsndfile', options: snd_opts)
snd = snd_subproject.dependency('sndfile')
spdlog = dependency('spdlog', version: '>=1.8.5', required: false, static: false)
if not spdlog.found()
spdlog_subproject = subproject('spdlog',
default_options: [
'default_library=shared',
'compile_library=true',])
spdlog = spdlog_subproject.get_variable('spdlog_dep')
endif
portaudio = dependency('portaudio-2.0', static: false)
hive_deps = [imgui, glew, glfw, spdlog, portaudio, snd, taglib]
hive_lib = shared_library(meson.project_name(),
sources: hive_src,
include_directories : hive_api_inc,
install: true,
install_rpath: prefix / 'lib')
#export the include needed
public_headers = include_directories(['HiveAPI/src'])
#declare dependency
project_dep = declare_dependency(
include_directories: public_headers)
set_variable(meson.project_name() + '_dep', project_dep)
than in the SampleHive meson use the HiveApi dependency:
# Source files to be compiled
samplehive_src = [
'src/SampleHive/GUI/Dockspace.cpp',
'src/SampleHive/GUI/DirectoryBrowser.cpp',
'src/SampleHive/GUI/MainWindow.cpp',
'src/SampleHive/GUI/SearchBar.cpp',
'src/SampleHive/GUI/SampleViewer.cpp',
'src/SampleHive/GUI/WaveformViewer.cpp',
'src/SampleHive/GUI/TransportControls.cpp',
'src/SampleHive/GUI/TabBar.cpp',
'src/SampleHive/GUI/Hives.cpp',
'src/SampleHive/GUI/Trash.cpp',
'src/SampleHive/GUI/Dialogs/ProgressDialog.cpp',
'src/SampleHive/GUI/Dialogs/SettingsDialog.cpp',
'src/SampleHive/Application.cpp',
'src/SampleHive/Utility/Serializer.cpp',
'src/SampleHive/Utility/Utils.cpp',
]
yaml = dependency('yaml-cpp')
samplehive_inc = include_directories(['src'])
executable('SampleHive',
sources: samplehive_src,
include_directories : samplehive_inc,
link_with: hive_lib,
dependencies: [yaml,
dependency('HiveApi', fallback : ['Hive-Api', 'HiveApi_dep']),],
install: true,
install_rpath: prefix / 'lib')
Related
Why Django rest framework is not saving data but returns 200 ok code
I have successfully send a post request to deployed(in Heroku) Django rest API from react axios but the data is not saved in my database. I use MongoDB(Djongo) as a databse. Let me show you the code I have used. settings.py """ Django settings for CyberMinds project. Generated by 'django-admin startproject' using Django 3.2.5. For more information on this file, see https://docs.djangoproject.com/en/3.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/3.2/ref/settings/ """ from pathlib import Path import django_heroku # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = False ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "rest_framework", "rest_framework.authtoken", "corsheaders", "accounts", "threat_catalog_models", 'django_rest_passwordreset', "threat_catalog", # "risk_model", "risk_model", "business_process", ] MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "corsheaders.middleware.CorsMiddleware", "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", ] ROOT_URLCONF = "config.urls" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ], }, }, ] WSGI_APPLICATION = "config.wsgi.application" # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases DATABASES = { "default": { "ENGINE": "djongo", "NAME": "cyberminds", } } # Password validation # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", }, { "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", }, { "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", }, { "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", }, ] # Internationalization # https://docs.djangoproject.com/en/3.2/topics/i18n/ LANGUAGE_CODE = "en-us" TIME_ZONE = "UTC" USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.2/howto/static-files/ STATIC_URL = "/static/" REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": [ "rest_framework.authentication.TokenAuthentication", ], } AUTH_USER_MODEL = "accounts.Account" CORS_ORIGIN_ALLOW_ALL = True ADMIN_SITE_HEADER = "CYBERMINDS Administration" CORS_ALLOW_HEADERS = [ "accept", "accept-encoding", "authorization", "content-type", "dnt", "origin", "user-agent", "x-csrftoken", "x-requested-with", ] # Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', ], # 'DEFAULT_PERMISSION_CLASSES': [ # 'rest_framework.permissions.IsAuthenticated', # ], # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', # 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',), # 'PAGE_SIZE': 10, } APPEND_SLASH = True django_heroku.settings(locals()) serializers.py class ExcelUploaderWithClient(serializers.Serializer): file = serializers.FileField() client = serializers.IntegerField() business_process = serializers.IntegerField() views.py class UploadBusinessImpactExcelBySuperUSer(APIView, ExcelHandlingView): permission_classes = ( IsAuthenticated, permissions.IsCybermindAdmin, ) def post(self, request): self.can_model_handle_ExcelHandlingView(models.BusinessImpact) serializer = serializers.ExcelUploaderWithClient( data=request.data) if serializer.is_valid(): data = serializer.validated_data file = data.get("file") client = data.get("client") business_process_id = data.get("business_process") try: business_process = get_business_process_by_client( client, business_process_id ) except ( models.BusinessProcess.DoesNotExist, accountModels.Client.DoesNotExist, ) as e: return Response( "business process or client does not exist", status=status.HTTP_404_NOT_FOUND, ) if ( file.content_type == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ): # self.delete_every_recore_on_that_model(models.BusinessImpact) self.delete_every_record_that_match_criteria( models.BusinessImpact, {"client": client, "business_process": business_process}, ) excel_file = pd.read_excel(file) data = pd.DataFrame( excel_file, columns=self.get_excel_fields( models.BusinessImpact.excel_titles), ) for _, row in data.iterrows(): self.create_model_object( models.BusinessImpact, row, {"client": client, "business_process": business_process.id}, ) return Response("Successfully Loaded data from excel.") else: return Response( {"file": ["File type must be excel with .xlxs extension."]}, status=status.HTTP_400_BAD_REQUEST, ) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) I used React Axios for post request and here is the code const handleUploadFile = (e) => { let myfile = file; let formData = new FormData(); formData.append("file", myfile); formData.append("client", company_name); formData.append("business_process", business); http({ url: "https://cyberminds-backend.herokuapp.com/api/business_process/upload-business-impact-excel-by-superuser", method: "POST", mode: "cors", data: formData, headers: { "Content-Type": "multipart/form-data" }, }).then( (response) => { alert("File uploaded Sesscessfullyyyyy"); }, (err) => { console.log(err); } ); }; Here is the request from chrome dev tools. How can I actually save the post data into my database? Thanks
the reason u are uploading files and not saving, is because u did not setup staticfiles in your settings. Add these in your settings underneath static url: STATIC_ROOT = os.path.join(BASE_DIR, 'static') STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'staticfiles/static/') ] and the run python manage.py collectstatics on your server
Log to file with gradle 4
Until gradle 3, I used this to write gradle's output to a logfile: def fileLogger = [ onOutput : { File logfile = new File( 'gradle.log' ) logfile << it } ] as org.gradle.api.logging.StandardOutputListener gradle.useLogger( fileLogger ) This does not work with with gradle 4.
Update for Gradle 5: It works when using logging.addStandardOutputListener instead gradle.useLogger and adding it to all tasks: // logger def fileLogger = [ onOutput: { File logfile = new File('gradle.log') logfile << it } ] as org.gradle.api.logging.StandardOutputListener // for configuration phase logging.addStandardOutputListener(fileLogger) // for execution phase gradle.taskGraph.whenReady { taskGraph -> taskGraph.allTasks.each { Task t -> t.doFirst { logging.addStandardOutputListener(fileLogger) } } }
How to override compile flags for a single package in nixos?
How can I override compile flags (as in CFLAGS) for a single package in NixOS/Nix environments? Here's what I've got by now: let optimizeForThisHost = pkg: pkgs.lib.overrideDerivation pkg (old: { exportOptimizations = '' export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -fPIC -O3 -march=native" ''; phaseNames = ["exportOptimizations"] ++ old.phaseNames; }); in muttWithoutThings = pkgs: (pkgs.mutt.override { sslSupport = false; saslSupport = false; imapSupport = false; withSidebar = false; }; }); mutt = pkgs: (optimizeForThisHost (muttWithoutThings pkgs)); in my configuration.nix, though this fails with error: attribute ‘phaseNames’ missing
Here is a working example that builds (and runs) a copy of GNU hello with custom compiler flags: nix-shell -p 'hello.overrideDerivation (old: { NIX_CFLAGS_COMPILE = "-Ofoo"; })' --run "hello --version" If you want to convince yourself whether this really works, try passing a non-existent flag to the compiler, like -Ofoo, and verify that the builds fails as expected. More information about the overrideDerivation function (and similar alternatives) can found in the Nixpkgs manual at http://nixos.org/nixpkgs/manual/index.html#sec-pkg-overrideDerivation.
I managed to write a function which I can apply to the packages I want to compile with custom flags: optimizeWithFlags = pkg: flags: pkgs.lib.overrideDerivation pkg (old: let newflags = pkgs.lib.foldl' (acc: x: "${acc} ${x}") "" flags; oldflags = if (pkgs.lib.hasAttr "NIX_CFLAGS_COMPILE" old) then "${old.NIX_CFLAGS_COMPILE}" else ""; in { NIX_CFLAGS_COMPILE = "${oldflags} ${newflags}"; }); This function takes a package and a list of strings (which are the flags) and builds a new package with the existing one, but with the additional compiler flags. For convenience, I wrote another set of helper functions: optimizeForThisHost = pkg: optimizeWithFlags pkg [ "-O3" "-march=native" "-fPIC" ]; withDebuggingCompiled = pkg: optimizeWithFlags pkg [ "-DDEBUG" ]; Now, I can override packages (here mutt and dmenu): muttWithoutThings = pkgs: (pkgs.mutt.override { sslSupport = false; saslSupport = false; imapSupport = false; withSidebar = false; }); mutt = pkgs: (utils pkgs).withoutConfigureFlag "--enable-debug" ((utils pkgs).optimizeForThisHost (muttWithoutThings pkgs) ); dmenu = pkgs: (utils pkgs).optimizeForThisHost (pkgs.dmenu.override { patches = [ ./patches/dmenu-fuzzymatch-4.6.diff ]; }); In the above utils is utils = pkgs: import ./util.nix { pkgs = pkgs; }; and the util.nix file returns a function which spits out a set of functions.
"error: expected a type" error when running "pod spec lint"
I'm attempting to convert an existing project into a cocoapod so that it will be easier to use however when I run pod spec lint --verbose I get a number of errors similar to - ERROR | [iOS] xcodebuild: CoreDataServices/CoreDataServices/Services/Count/CDSCountService.m:28:9: error: use of undeclared identifier 'NSFetchRequest' I have the following as my podspec: Pod::Spec.new do |s| s.name = "CoreDataServices" s.version = "0.2.0" s.summary = "CoreDataServices contains a set of helper classes to abstract away common core data functionality." s.homepage = "http://www.williamboles.me" s.license = { :type => 'MIT', :file => 'LICENSE.md' } s.author = "William Boles" s.platform = :ios, "8.0" s.source = { :git => "https://github.com/wibosco/CoreDataServices.git", :branch => "master", :tag => s.version } s.source_files = "CoreDataServices/**/*.{h,m}" s.public_header_files = "CoreDataServices/**/*.{h}" s.frameworks = 'UIKit', 'CoreData' s.requires_arc = true end I have cocoapod version 0.39.0 installed. Building the project using xcodebuild outside of cocoapods results in the project being built without errors.
I managed to get there in the end but it's an odd one: Pod::Spec.new do |s| s.name = "CoreDataServices" s.version = "0.2.0" s.summary = "CoreDataServices contains a set of helper classes to abstract away common core data functionality." s.homepage = "http://www.williamboles.me" s.license = { :type => 'MIT', :file => 'LICENSE.md' } s.author = "William Boles" s.platform = :ios, "8.0" s.source = { :git => "https://github.com/wibosco/CoreDataServices.git", :branch => "master", :tag => s.version } s.source_files = "CoreDataServices/**/*.{h,m}" s.public_header_files = "CoreDataServices/**/*.{h}" s.requires_arc = true s.frameworks = 'UIKit', 'CoreData' end I moved s.requires_arc = true to be above s.framework = 'UIKit', 'CoreData' and the errors went away. I also noticed that if I inverted the ordering of the framesworks so that it becomes s.frameworks = 'CoreData', 'UIKit' s.requires_arc = true that also worked
sbt multi-project war packaging
I've been trying to find the way to package a web application composed by multiple projects into a single war. The only usefull plugin I've found for sbt is xsbt-web-plugin. I'm trying to use the War plugin inside that github hosted project, but only de dependencies of the web project are included in WEB-INF/lib (not the other projects defined in the build neither their dependencies). My build file is: import sbt._ import Keys._ import com.github.siasia._ import WarPlugin.warSettings object BuildSettings { import Dependencies._ val buildOrganization = "ar.edu.itba.it" val buildVersion = "1.27" val hibernateVersion = "3.6.7.Final" val guiceVersion = "3.0" val wicketVersion = "1.5.4" val jerseyVersion = "1.12" val buildSettings = Defaults.defaultSettings ++ Seq( organization := buildOrganization, version := buildVersion, crossPaths := false, publishArtifact in (Compile, packageDoc) := false, publishArtifact in (Compile, packageSrc) := false, parallelExecution in ThisBuild := false, libraryDependencies ++= Seq(slf4j_api, slf4j_log4j12, junit, hamcrest_all, mockito_all, h2, joda_time, guava, junit_interface), javacOptions ++= Seq("-source", "1.6", "-target", "1.6"), testOptions += Tests.Argument(TestFrameworks.JUnit)) } object SgaBuild extends Build { import BuildSettings._ import Dependencies._ import com.github.siasia.WebPlugin._ val compileAndTest = "test->test;compile->compile" lazy val root = Project(id = "sga", base = file(".")) aggregate (itba_common, itba_common_wicket, itba_common_jpa, jasperreports_fonts_extensions, sga_backend, sga_rest, sga_wicket) // settings (rootSettings: _*) lazy val itba_common = Project(id = "itba-common", base = file("itba-common")) settings (buildSettings: _*) lazy val itba_common_jpa = Project(id = "itba-common-jpa", base = file("itba-common- jpa")) dependsOn (itba_common % compileAndTest) settings (buildSettings: _*) lazy val itba_common_wicket = Project(id = "itba-common-wicket", base = file("itba- common-wicket")) dependsOn (itba_common % compileAndTest, itba_common_jpa % compileAndTest) settings (buildSettings: _*) lazy val jasperreports_fonts_extensions = Project(id = "jasperreports-fonts- extensions", base = file("jasperreports-fonts-extensions")) settings (buildSettings: _*) lazy val sga_backend = Project(id = "sga-backend", base = file("sga- backend")) dependsOn (itba_common % compileAndTest, itba_common_jpa % compileAndTest) settings (buildSettings: _*) lazy val sga_rest = Project(id = "sga-rest", base = file("sga-rest")) dependsOn (sga_backend % compileAndTest) settings (buildSettings: _*) lazy val sga_wicket = Project(id = "sga-wicket", base = file("sga-wicket")) dependsOn (sga_backend % compileAndTest, sga_rest % compileAndTest, itba_common_wicket % compileAndTest) settings ((buildSettings ++ warSettings(Compile)):_*) } object Resolvers { val wicketStuff = "Wicket Stuff Repository" at "http://wicketstuff.org/maven/repository" } object Dependencies { import BuildSettings._ ... // (plenty of ModuleIDs that are refered from 7 XXX.sbt) } Looking at the plugin code it seems it copy all the files from full-classpath configuration into lib directory, but when inspecting full-configuration it doesn't include all the required jars (the ones from the other 7 projects and their dependencies). Is this the right plugin to use or there is another one?. Thanks in advance!