Merge pull request #133 from mmicko/program_prefix

Support custom PROGRAM_PREFIX
diff --git a/libtrellis/CMakeLists.txt b/libtrellis/CMakeLists.txt
index 10fd498..c519daf 100644
--- a/libtrellis/CMakeLists.txt
+++ b/libtrellis/CMakeLists.txt
@@ -5,6 +5,8 @@
 option(BUILD_SHARED "Build shared Trellis library" ON)
 option(STATIC_BUILD "Create static build of Trellis tools" OFF)
 
+set(PROGRAM_PREFIX "" CACHE STRING "Name prefix for executables")
+
 set(CMAKE_CXX_STANDARD 14)
 if (MSVC)
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -bigobj -EHsc")
@@ -116,12 +118,12 @@
     if(APPLE)
         set_target_properties(${name} PROPERTIES
                               BUILD_WITH_INSTALL_RPATH ON
-                              INSTALL_RPATH "@loader_path/${TRELLIS_RPATH_LIBDIR}/trellis"
+                              INSTALL_RPATH "@loader_path/${TRELLIS_RPATH_LIBDIR}/${PROGRAM_PREFIX}trellis"
                               INSTALL_NAME_DIR "@rpath")
     elseif(UNIX)
         set_target_properties(${name} PROPERTIES
                               BUILD_WITH_INSTALL_RPATH ON
-                              INSTALL_RPATH "\$ORIGIN/${TRELLIS_RPATH_LIBDIR}/trellis")
+                              INSTALL_RPATH "\$ORIGIN/${TRELLIS_RPATH_LIBDIR}/${PROGRAM_PREFIX}trellis")
     endif()
 endfunction()
 
@@ -144,45 +146,45 @@
 endif()
 file(WRITE "${CMAKE_BINARY_DIR}/generated/last_git_version" CURRENT_GIT_VERSION)
 
-add_executable(ecpbram ${INCLUDE_FILES} tools/ecpbram.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp")
-target_include_directories(ecpbram PRIVATE tools)
-target_compile_definitions(ecpbram PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}")
-target_link_libraries(ecpbram trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param})
-setup_rpath(ecpbram)
+add_executable(${PROGRAM_PREFIX}ecpbram ${INCLUDE_FILES} tools/ecpbram.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp")
+target_include_directories(${PROGRAM_PREFIX}ecpbram PRIVATE tools)
+target_compile_definitions(${PROGRAM_PREFIX}ecpbram PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}" TRELLIS_PROGRAM_PREFIX="${PROGRAM_PREFIX}")
+target_link_libraries(${PROGRAM_PREFIX}ecpbram trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param})
+setup_rpath(${PROGRAM_PREFIX}ecpbram)
 
-add_executable(ecppack ${INCLUDE_FILES} tools/ecppack.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp")
-target_include_directories(ecppack PRIVATE tools)
-target_compile_definitions(ecppack PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}")
-target_link_libraries(ecppack trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param})
-setup_rpath(ecppack)
+add_executable(${PROGRAM_PREFIX}ecppack ${INCLUDE_FILES} tools/ecppack.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp")
+target_include_directories(${PROGRAM_PREFIX}ecppack PRIVATE tools)
+target_compile_definitions(${PROGRAM_PREFIX}ecppack PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}" TRELLIS_PROGRAM_PREFIX="${PROGRAM_PREFIX}")
+target_link_libraries(${PROGRAM_PREFIX}ecppack trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param})
+setup_rpath(${PROGRAM_PREFIX}ecppack)
 
-add_executable(ecpunpack ${INCLUDE_FILES} tools/ecpunpack.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp")
-target_include_directories(ecpunpack PRIVATE tools)
-target_compile_definitions(ecpunpack PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}")
-target_link_libraries(ecpunpack trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param})
-setup_rpath(ecpunpack)
+add_executable(${PROGRAM_PREFIX}ecpunpack ${INCLUDE_FILES} tools/ecpunpack.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp")
+target_include_directories(${PROGRAM_PREFIX}ecpunpack PRIVATE tools)
+target_compile_definitions(${PROGRAM_PREFIX}ecpunpack PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}" TRELLIS_PROGRAM_PREFIX="${PROGRAM_PREFIX}")
+target_link_libraries(${PROGRAM_PREFIX}ecpunpack trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param})
+setup_rpath(${PROGRAM_PREFIX}ecpunpack)
 
-add_executable(ecppll ${INCLUDE_FILES} tools/ecppll.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp")
-target_include_directories(ecppll PRIVATE tools)
-target_compile_definitions(ecppll PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}")
-target_link_libraries(ecppll trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param})
-setup_rpath(ecppll)
+add_executable(${PROGRAM_PREFIX}ecppll ${INCLUDE_FILES} tools/ecppll.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp")
+target_include_directories(${PROGRAM_PREFIX}ecppll PRIVATE tools)
+target_compile_definitions(${PROGRAM_PREFIX}ecppll PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}" TRELLIS_PROGRAM_PREFIX="${PROGRAM_PREFIX}")
+target_link_libraries(${PROGRAM_PREFIX}ecppll trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param})
+setup_rpath(${PROGRAM_PREFIX}ecppll)
 
-add_executable(ecpmulti ${INCLUDE_FILES} tools/ecpmulti.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp")
-target_include_directories(ecpmulti PRIVATE tools)
-target_compile_definitions(ecpmulti PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}")
-target_link_libraries(ecpmulti trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param})
-setup_rpath(ecpmulti)
+add_executable(${PROGRAM_PREFIX}ecpmulti ${INCLUDE_FILES} tools/ecpmulti.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp")
+target_include_directories(${PROGRAM_PREFIX}ecpmulti PRIVATE tools)
+target_compile_definitions(${PROGRAM_PREFIX}ecpmulti PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}" TRELLIS_PROGRAM_PREFIX="${PROGRAM_PREFIX}")
+target_link_libraries(${PROGRAM_PREFIX}ecpmulti trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param})
+setup_rpath(${PROGRAM_PREFIX}ecpmulti)
 
 if (BUILD_SHARED)
-    install(TARGETS trellis ecpbram ecppack ecppll ecpunpack ecpmulti ${PythonInstallTarget}
-            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/trellis
+    install(TARGETS trellis ${PROGRAM_PREFIX}ecpbram ${PROGRAM_PREFIX}ecppack ${PROGRAM_PREFIX}ecppll ${PROGRAM_PREFIX}ecpunpack ${PROGRAM_PREFIX}ecpmulti ${PythonInstallTarget}
+            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROGRAM_PREFIX}trellis
             RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
 else()
-    install(TARGETS ecpbram ecppack ecpunpack ecppll ecpmulti
+    install(TARGETS ${PROGRAM_PREFIX}ecpbram ${PROGRAM_PREFIX}ecppack ${PROGRAM_PREFIX}ecpunpack ${PROGRAM_PREFIX}ecppll ${PROGRAM_PREFIX}ecpmulti
             RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
 endif()
-install(DIRECTORY ../database DESTINATION ${CMAKE_INSTALL_DATADIR}/trellis PATTERN ".git" EXCLUDE)
-install(DIRECTORY ../misc DESTINATION ${CMAKE_INSTALL_DATADIR}/trellis)
-install(DIRECTORY ../util/common DESTINATION ${CMAKE_INSTALL_DATADIR}/trellis/util)
-install(DIRECTORY ../timing/util DESTINATION ${CMAKE_INSTALL_DATADIR}/trellis/timing USE_SOURCE_PERMISSIONS)
+install(DIRECTORY ../database DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROGRAM_PREFIX}trellis PATTERN ".git" EXCLUDE)
+install(DIRECTORY ../misc DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROGRAM_PREFIX}trellis)
+install(DIRECTORY ../util/common DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROGRAM_PREFIX}trellis/util)
+install(DIRECTORY ../timing/util DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROGRAM_PREFIX}trellis/timing USE_SOURCE_PERMISSIONS)
diff --git a/libtrellis/include/DatabasePath.hpp b/libtrellis/include/DatabasePath.hpp
index 4063802..cab8a29 100644
--- a/libtrellis/include/DatabasePath.hpp
+++ b/libtrellis/include/DatabasePath.hpp
@@ -11,7 +11,7 @@
 std::string get_database_path()
 {
     boost::filesystem::path executable_path = boost::dll::program_location().parent_path();
-    boost::filesystem::path database_datadir_relative(TRELLIS_RPATH_DATADIR "/trellis/database");
+    boost::filesystem::path database_datadir_relative(TRELLIS_RPATH_DATADIR "/" TRELLIS_PROGRAM_PREFIX "trellis/database");
     std::string database_folder = (executable_path /= database_datadir_relative).string();
     return database_folder;
 }
diff --git a/libtrellis/tools/ecpbram.cpp b/libtrellis/tools/ecpbram.cpp
index 4c872fb..275a10d 100644
--- a/libtrellis/tools/ecpbram.cpp
+++ b/libtrellis/tools/ecpbram.cpp
@@ -146,7 +146,7 @@
     if (vm.count("help")) {
     help:
         cerr << "Project Trellis - Open Source Tools for ECP5 FPGAs" << endl;
-        cerr << "ecpbram: ECP5 BRAM content initialization tool" << endl;
+        cerr << argv[0] << ": ECP5 BRAM content initialization tool" << endl;
         cerr << endl;
         cerr << "Copyright (C) 2019  Sylvain Munaut <tnt@246tNt.com>" << endl;
         cerr << "Copyright (C) 2016  Clifford Wolf <clifford@clifford.at>" << endl;
diff --git a/libtrellis/tools/ecpmulti.cpp b/libtrellis/tools/ecpmulti.cpp
index 16d6675..83232e1 100644
--- a/libtrellis/tools/ecpmulti.cpp
+++ b/libtrellis/tools/ecpmulti.cpp
@@ -82,7 +82,7 @@
         help:
         cerr << "Project Trellis - Open Source Tools for ECP5 FPGAs" << endl;
         cerr << "Version " << git_describe_str << endl;
-        cerr << "ecpmulti: ECP5 multiboot bitstream assembler" << endl;
+        cerr << argv[0] << ": ECP5 multiboot bitstream assembler" << endl;
         cerr << endl;
         cerr << "Copyright (C) 2019 Jens Andersen <jens.andersen@gmail.com>" << endl;
         cerr << endl;
diff --git a/libtrellis/tools/ecppack.cpp b/libtrellis/tools/ecppack.cpp
index f060468..d6aea40 100644
--- a/libtrellis/tools/ecppack.cpp
+++ b/libtrellis/tools/ecppack.cpp
@@ -75,11 +75,11 @@
 help:
         cerr << "Project Trellis - Open Source Tools for ECP5 FPGAs" << endl;
         cerr << "Version " << git_describe_str << endl;
-        cerr << "ecppack: ECP5 bitstream packer" << endl;
+        cerr << argv[0] << ": ECP5 bitstream packer" << endl;
         cerr << endl;
         cerr << "Copyright (C) 2018 David Shah <david@symbioticeda.com>" << endl;
         cerr << endl;
-        cerr << "Usage: ecppack input.config [output.bit] [options]" << endl;
+        cerr << "Usage: " << argv[0] << " input.config [output.bit] [options]" << endl;
         cerr << options << endl;
         return vm.count("help") ? 0 : 1;
     }
diff --git a/libtrellis/tools/ecppll.cpp b/libtrellis/tools/ecppll.cpp
index f7b01d3..13e6b26 100644
--- a/libtrellis/tools/ecppll.cpp
+++ b/libtrellis/tools/ecppll.cpp
@@ -124,7 +124,7 @@
 
   if(vm.count("help")){
     cerr << "Project Trellis - Open Source Tools for ECP5 FPGAs" << endl;
-    cerr << "ecppll: ECP5 PLL Configuration Calculator" << endl;
+    cerr << argv[0] << ": ECP5 PLL Configuration Calculator" << endl;
     cerr << "Version " << git_describe_str << endl;
     cerr << endl;
     cerr << "This tool is experimental! Use at your own risk!" << endl;
diff --git a/libtrellis/tools/ecpunpack.cpp b/libtrellis/tools/ecpunpack.cpp
index 77e2276..a5752a8 100644
--- a/libtrellis/tools/ecpunpack.cpp
+++ b/libtrellis/tools/ecpunpack.cpp
@@ -51,11 +51,11 @@
 help:
         cerr << "Project Trellis - Open Source Tools for ECP5 FPGAs" << endl;
         cerr << "Version " << git_describe_str << endl;
-        cerr << "ecpunpack: ECP5 bitstream to text config converter" << endl;
+        cerr << argv[0] << ": ECP5 bitstream to text config converter" << endl;
         cerr << endl;
         cerr << "Copyright (C) 2018 David Shah <david@symbioticeda.com>" << endl;
         cerr << endl;
-        cerr << "Usage: ecpunpack input.bit [output.config] [options]" << endl;
+        cerr << "Usage: " << argv[0] << " input.bit [output.config] [options]" << endl;
         cerr << options << endl;
         return vm.count("help") ? 0 : 1;
     }