empty
Проверяет, считается ли переменная пустой. Переменная считается пустой, если она не существует или её значение равно false . empty() не генерирует предупреждение, если переменная не существует.
Список параметров
Если переменная не существует, предупреждение не генерируется. Это значит, что empty() фактически является точным эквивалентом конструкции !isset($var) || $var == false
Возвращаемые значения
Возвращает true , если параметр var не существует, если значение равно нулю, либо не задано, смотрите Преобразование в булев тип. В противном случае возвращает false .
Примеры
Пример #1 Простое сравнение empty() и isset() .
// Принимает значение true, потому что $var пусто
if (empty( $var )) echo ‘$var или 0, или пусто, или вообще не определена’ ;
>
// Принимает значение true, потому что $var определена
if (isset( $var )) echo ‘$var определена, даже если она пустая’ ;
>
?>
Пример #2 empty() и строковые индексы
$expected_array_got_string = ‘somestring’ ;
var_dump (empty( $expected_array_got_string [ ‘some_key’ ]));
var_dump (empty( $expected_array_got_string [ 0 ]));
var_dump (empty( $expected_array_got_string [ ‘0’ ]));
var_dump (empty( $expected_array_got_string [ 0.5 ]));
var_dump (empty( $expected_array_got_string [ ‘0.5’ ]));
var_dump (empty( $expected_array_got_string [ ‘0 Mostel’ ]));
?>?php
Результат выполнения данного примера:
bool(true) bool(false) bool(false) bool(false) bool(true) bool(true)
Примечания
Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций или именованных аргументов.
Замечание:
При использовании функции empty() на недоступных (необъявленных) свойствах объекта будет вызван встроенный метод объекта __isset(), если он определён.
Смотрите также
- isset() — Определяет, была ли установлена переменная значением, отличным от null
- __isset()
- unset() — Удаляет переменную
- array_key_exists() — Проверяет, присутствует ли в массиве указанный ключ или индекс
- count() — Подсчитывает количество элементов массива или Countable объекте
- strlen() — Возвращает длину строки
- Таблица сравнения типов
User Contributed Notes 36 notes
9 years ago
$testCase = array(
1 => » ,
2 => «» ,
3 => null ,
4 => array(),
5 => FALSE ,
6 => NULL ,
7 => ‘0’ ,
8 => 0 ,
foreach ( $testCase as $k => $v ) if (empty( $v )) echo »
$k => $v is empty» ;
>
>
/**
Output
1=> is empty
2=> is empty
3=> is empty
4=>Array is empty
5=> is empty
6=> is empty
7=>0 is empty
8=>0 is empty
**/
?>
14 years ago
Please note that results of empty() when called on non-existing / non-public variables of a class are a bit confusing if using magic method __get (as previously mentioned by nahpeps at gmx dot de). Consider this example:
class Registry
protected $_items = array();
public function __set ( $key , $value )
$this -> _items [ $key ] = $value ;
>
public function __get ( $key )
if (isset( $this -> _items [ $key ])) return $this -> _items [ $key ];
> else return null ;
>
>
>
$registry = new Registry ();
$registry -> empty = » ;
$registry -> notEmpty = ‘not empty’ ;
var_dump (empty( $registry -> notExisting )); // true, so far so good
var_dump (empty( $registry -> empty )); // true, so far so good
var_dump (empty( $registry -> notEmpty )); // true, .. say what?
$tmp = $registry -> notEmpty ;
var_dump (empty( $tmp )); // false as expected
?>
The result for empty($registry->notEmpty) is a bit unexpeced as the value is obviously set and non-empty. This is due to the fact that the empty() function uses __isset() magic functin in these cases. Although it’s noted in the documentation above, I think it’s worth mentioning in more detail as the behaviour is not straightforward. In order to achieve desired (expexted?) results, you need to add __isset() magic function to your class:
class Registry
protected $_items = array();
public function __set ( $key , $value )
$this -> _items [ $key ] = $value ;
>
public function __get ( $key )
if (isset( $this -> _items [ $key ])) return $this -> _items [ $key ];
> else return null ;
>
>
public function __isset ( $key )
if (isset( $this -> _items [ $key ])) return ( false === empty( $this -> _items [ $key ]));
> else return null ;
>
>
>
$registry = new Registry ();
$registry -> empty = » ;
$registry -> notEmpty = ‘not empty’ ;
var_dump (empty( $registry -> notExisting )); // true, so far so good
var_dump (empty( $registry -> empty )); // true, so far so good
var_dump (empty( $registry -> notEmpty )); // false, finally!
?>
It actually seems that empty() is returning negation of the __isset() magic function result, hence the negation of the empty() result in the __isset() function above.
unset
unset() удаляет перечисленные переменные.
Поведение unset() внутри пользовательской функции может отличаться, в зависимости от того, какой тип имеет переменная, которую необходимо удалить.
Если переменная, объявленная глобальной, удаляется внутри функции, то будет удалена только локальная переменная. Переменная в области видимости вызова функции сохранит то же значение, что и до вызова unset() .
$foo = ‘bar’ ;
destroy_foo ();
echo $foo ;
?>
Результат выполнения данного примера:
Если необходимо удалить глобальную переменную внутри функции, то для этого нужно использовать массив $GLOBALS :
Если переменная, которая передаётся ПО ССЫЛКЕ, удаляется внутри функции, то будет удалена только локальная переменная. Переменная в области видимости вызова функции сохранит то же значение, что и до вызова unset() .
$bar = ‘something’ ;
echo » $bar \n» ;
Результат выполнения данного примера:
something something
Если статическая переменная удаляется внутри функции, unset() удалит переменную только в контексте дальнейшего выполнения функции. При последующем вызове предыдущее значение переменной будет восстановлено.
function foo ()
static $bar ;
$bar ++;
echo «До удаления: $bar , » ;
unset( $bar );
$bar = 23 ;
echo «После удаления: $bar \n» ;
>
?php
Результат выполнения данного примера:
До удаления: 1, После удаления: 23 До удаления: 2, После удаления: 23 До удаления: 3, После удаления: 23
Список параметров
Возвращаемые значения
Функция не возвращает значения после выполнения.
Примеры
Пример #1 Пример использования unset()
// удаляем один элемент массива
unset( $bar [ ‘quux’ ]);
// удаляем несколько переменных
unset( $foo1 , $foo2 , $foo3 );
?>
Пример #2 Использование приведения типа (unset)
Приведение типа (unset) часто путают с функцией unset() . Приведение типа (unset) приводит только к значению NULL и было добавлено исключительно для полноты реализации. Оно не меняет значение приводимой переменной. С PHP 7.2.0 преобразование типа (unset) объявлено устаревшим и удалено в PHP 8.0.0.
var_dump ((unset) $name );
var_dump ( $name );
?>
Результат выполнения данного примера:
NULL string(6) "Felipe"
Примечания
Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций или именованных аргументов.
Замечание:
Существует возможность удалить даже атрибуты объекта, видимые в текущем контексте.
Замечание:
Невозможно удалить $this внутри метода объекта.
Замечание:
При использовании unset() на недоступных или необъявленных свойствах объекта, будет вызван встроенный метод объекта __unset(), если он определён.
Смотрите также
- isset() — Определяет, была ли установлена переменная значением, отличным от null
- empty() — Проверяет, пуста ли переменная
- __unset()
- array_splice() — Удаляет часть массива и заменяет её чем-нибудь ещё
- Приведение типа (unset)
User Contributed Notes 32 notes
7 years ago
This is probably trivial but there is no error for unsetting a non-existing variable.
1 year ago
Be careful!, unset() element in array advances the internal array pointer one place forward
10 years ago
You don’t need to check that a variable is set before you unset it.
unset( $a );
?>
is harmless.
if(isset( $a )) unset( $a );
>
?>
is pointless complication.
This doesn’t apply to properties of objects that have __isset() methods that visibly change object state or __unset() methods that don’t properly check their arguments or have extra side effects.
The latter case means that __unset shouldn’t do more than what it says on the tin, and also has the responsibility for checking (possibly using __isset()) that what it’s being asked to do makes sense.
The former case is just plain bad design.
15 years ago
if you try to unset an object, please be careful about references.
Objects will only free their resources and trigger their __destruct method when *all* references are unsetted.
Even when they are *in* the object. sigh!
class A function __destruct () echo «cYa later!!\n» ;
>
>
$a = new A ();
$a -> a = $a ;
#unset($a); # Just uncomment, and you’ll see
echo «No Message . hm, what now?\n» ;
unset( $a -> a );
unset( $a );
echo «Finally that thing is gone\n» ;
?>
Of course the object completely dies at the end of the script.
15 years ago
Since unset() is a language construct, it cannot be passed anything other than a variable. It’s sole purpose is to «unset» this variable, ie. to remove it from the current scope and destroy it’s associated data. This is true especially for reference variables, where not the actual value is destroyed but the reference to that value. This is why you can’t wrap ‘unset()’ in a user defined function: You would either unset a copy of the data if the parameter is passed by value, or you would just unset the reference variable within the functions scope if the parameter is passed by reference. There is no workaround for that, as you cannot pass ‘scope’ to a function in PHP. Such a function can only work for variables that exist in a common or global scope (compare ‘unset($_GLOBALS[variable])’).
I don’t know how PHP handles garbage collection internally, but I guess this behavior can result in a huge memory leak: if a value variable goes out of scope with a second variable still holding a reference to the in-memory value, then unsetting that reference would still hold the value in memory but potentially unset the last reference to that in-memory data, hence: occupied memory that is rendered useless as you cannot reference it anymore.
13 years ago
A sample how to unset array elements from an array result coming from a mysql request. In this sample it is checking if a file exists and removes the row from the array if it not exists.
$db -> set_query ( «select * from documents where document_in_user = 0» ); //1
$documents = $db -> result_to_array ( $db -> get_result ()); //1
foreach ( $documents as $key => $row ) < //2
$file = «uploads/» . rawurldecode ( $row [ ‘document_name’ ]);
if ( file_exists ( $file ) == FALSE ) unset( $documents [ $key ]); //3
>
>
$documents = array_values ( $documents ); // reindex the array (4)
?>
variables:
mysql table = documents,
array = $documents
array key (index) = $key
array row (record sort of speak) = $row
1.
it gets the array from the table (mysql)
2.
foreach goes through the array $documents
3.
unset if record does not exist
4.
the array_values($documents) reindexes the $documents array, for otherwise you might end up in trouble when your process will start expecting an array starting with key ($key) 0 (zero).
18 years ago
Here is another way to make ‘unset’ work with session variables from within a function :
function unsetSessionVariable ( $sessionVariableName ) unset( $GLOBALS [ _SESSION ][ $sessionVariableName ]);
>
?>
May it work with others than me.
F.
19 years ago
Only This works with register_globals being ‘ON’.
The above will not work with register_globals turned on (will only work outside of a function).
$variable = $_SESSION[‘variable’];
unset( $_SESSION[‘variable’], $variable );
The above will work with register_globals on & inside a function
19 years ago
Adding on to what bond at noellebond dot com said, if you want to remove an index from the end of the array, if you use unset, the next index value will still be what it would have been.
Eg you have
$x = array( 1 , 2 );
for ( $i = 0 ; $i < 5 ; $i ++)
unset( $x [( count ( $x )- 1 )]); //remove last set key in the array
$x [] = $i ;
>
?>
You would expect:
Array([0] => 1, [1] => 4)
as you want it to remove the last set key.
but you actually get
Array ( [0] => 1 [4] => 2 [5] => 3 [6] => 4 )
This is since even though the last key is removed, the auto indexing still keeps its previous value.
The only time where this would not seem right is when you remove a value off the end. I guess different people would want it different ways.
The way around this is to use array_pop() instead of unset() as array_pop() refreshes the autoindexing thing for the array.
$x = array( 1 , 2 );
for ( $i = 0 ; $i < 5 ; $i ++)
array_pop ( $x ); // removes the last item in the array
$x [] = $i ;
>
?>
This returns the expected value of x = Array([0] => 1, [1] => 4);
Hope this helps someone who may need this for some odd reason, I did.
16 years ago
To clarify what hugo dot dworak at gmail dot com said about unsetting things that aren’t already set:
unsetting a non-existent key within an array does NOT throw an error.
$array = array();
unset($array[2]);
//this does not throw an error
unset($array[$undefinedVar]);
//Throws an error because of the undefined variable, not because of a non-existent key.
?>
12 years ago
Despite much searching, I have not yet found an explanation as to how one can manually free resources from variables, not so much objects, in PHP. I have also seen many comments regarding the merits and demerits of unset() versus setting a variable to null. Thus, here are the results of some benchmarks performed comparing unset() of numerous variables to setting them to null (with regards to memory usage and processing time):
10 variables:
Unset:
Memory Usage: 296
Time Elapsed: 1.0013580322266E-5
Null set:
Memory Usage: 1736
Time Elapsed: 5.9604644775391E-6
50 variables:
Unset:
Memory Usage: 296
Time Elapsed: 3.6001205444336E-5
Null set:
Memory Usage: 8328
Time Elapsed: 3.2901763916016E-5
100 variables:
Unset:
Memory Usage: 296
Time Elapsed: 5.6982040405273E-5
Null set:
Memory Usage: 15928
Time Elapsed: 5.8174133300781E-5
1000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.00041294097900391
Null set:
Memory Usage: 168096
Time Elapsed: 0.00067591667175293
10000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.0042569637298584
Null set:
Memory Usage: 1650848
Time Elapsed: 0.0076930522918701
100000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.042603969573975
Null set:
Memory Usage: 16249080
Time Elapsed: 0.087724924087524
300000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.13177299499512
Null set:
Memory Usage: 49796320
Time Elapsed: 0.28617882728577
Perhaps my test code for the null set was flawed, but despite that possibility it is simple to see that unset() has minimal processing time impact, and no apparent memory usage impact (unless the values returned by memory_get_usage() are flawed). If you truly care about the ~4 microseconds saved over Note: Tested on PHP 5.3.8 installed via RPM on Fedora 14
18 years ago
In PHP 5.0.4, at least, one CAN unset array elements inside functions from arrays passed by reference to the function.
As implied by the manual, however, one can’t unset the entire array by passing it by reference.
$scalar = ‘Hello, there’ ;
echo ‘Value of $scalar is: ‘ ;
print_r ( $scalar ); echo ‘
‘ ;
// Value of $scalar is: Hello, there
remove_variable ( $scalar ); // try to unset the variable
echo ‘Value of $scalar is: ‘ ;
print_r ( $scalar ); echo ‘
‘ ;
// Value of $scalar is: Hello, there
$array = array( ‘one’ => 1 , ‘two’ => 2 , ‘three’ => 3 );
echo ‘Value of $array is: ‘ ;
print_r ( $array ); echo ‘
‘ ;
// Value of $array is: Array ( [one] => 1 [two] => 2 [three] => 3 )
remove_variable ( $array ); // try to unset the array
echo ‘Value of $array is: ‘ ;
print_r ( $array ); echo ‘
‘ ;
// Value of $array is: Array ( [one] => 1 [two] => 2 [three] => 3 )
remove_element ( $array , ‘two’ ); // successfully remove an element from the array
echo ‘Value of $array is: ‘ ;
print_r ( $array ); echo ‘
‘ ;
// Value of $array is: Array ( [one] => 1 [three] => 3 )
13 years ago
Note that PHP 4 will generate a warning if you try to unset an array index that doesn’t exist and whose parent doesn’t exist.
unset( $foo [ ‘Bar’ ][ ‘Baz’ ]);
?>
RESULT: «Notice: Undefined index: Bar»
On PHP5 no error is raised, which seems to me like the correct behaviour.
Note that using unset($foo[‘Bar’]) in the above example does not generate a warning in either version.
(Tested on 4.4.9 and 5.2.4)
16 years ago
Just to confirm, USING UNSET CAN DESTROY AN ENTIRE ARRAY. I couldn’t find reference to this anywhere so I decided to write this.
The difference between using unset and using $myarray=array(); to unset is that obviously the array will just be overwritten and will still exist.
$myarray =array( «Hello» , «World» );
echo $myarray [ 0 ]. $myarray [ 1 ];
unset( $myarray );
//$myarray=array();
echo $myarray [ 0 ]. $myarray [ 1 ];
echo $myarray ;
?>
Output with unset is:
HelloWorld
Notice: Undefined offset: 0 in C:\webpages\dainsider\myarray.php on line 10
Notice: Undefined offset: 1 in C:\webpages\dainsider\myarray.php on line 10
Output with $myarray=array(); is:
?>
Notice: Undefined offset: 0 in C:\webpages\dainsider\myarray.php on line 10
Notice: Undefined offset: 1 in C:\webpages\dainsider\myarray.php on line 10
18 years ago
dh at argosign dot de —
it is possible to unset globals from within functions thanks to the $GLOBALS array:
function test () // don’t need to do ‘ global $x; ‘
unset ( $GLOBALS [ ‘x’ ]);
echo ‘x: ‘ . $GLOBALS [ ‘x’ ] . ‘
‘ ;
>
15 years ago
Here’s my variation on the slightly dull unset method. It throws in a bit of 80’s Stallone action spice into the mix. Enjoy!
/**
* function rambo (first blood)
*
* Completely and utterly destroys everything, returning the kill count of victims
*
* @param It don’t matter, it’s Rambo baby
* @return Integer Body count (but any less than 500 and it’s not really worth mentioning)
*/
function rambo ()
// Get the victims and initiate that body count status
$victims = func_get_args ();
$body_count = 0 ;
// Kill those damn punks
foreach( $victims as $victim ) if( $death_and_suffering = @unset( $victim )) $body_count ++;
>
>
// How many kills did Rambo tally up on this mission?
return( $body_count );
>
?>
14 years ago
about unset for arrays
if you unset the last array member
$ar[0]==2
$ar[1]==7
$ar[2]==9
after addition a new member by $ar[]=7,
So, unset has no effect to internal array counter.
19 years ago
The documentation is not entirely clear when it comes to static variables. It says:
If a static variable is unset() inside of a function, unset() destroys the variable and all its references.
The above example would output:
And it does! But the variable is NOT deleted, that’s why the value keeps on increasing, otherwise the output would be:
The references are destroyed within the function, this handeling is the same as with global variables, the difference is a static variable is a local variable.
Be carefull using unset and static values as the output may not be what you expect it to be. It appears to be impossible to destroy a static variable. You can only destroy the references within the current executing function, a successive static statement will restore the references.
The documentation would be better if it would say:
«If a static variable is unset() inside of a function, unset() destroys all references to the variable. «
Example: (tested PHP 4.3.7)
function foo ()
static $a ;
$a ++;
echo » $a \n» ;
unset( $a );
echo » $a \n» ;
static $a ;
echo » $a \n» ;
>
13 years ago
further I realized that an object, when getting detroyed, does care about destroying variable in object space visibility but not those in local visibility, be aware of the found pattern:
class release_test <
private $buffer ;
private $other_object ;
public function __construct () <
$this -> other_object =new other_object_class ();
>
public function __destruct () <
//note that you always have to unset class objects, in order to get the resources released
unset( $this -> other_object );
>
public allocate_mem_A () <
$this -> buffer = file ( «/tmp/bigfile» );
>
public allocate_mem_B () <
$buffer = file ( «/tmp/bigfile» );
>
public allocate_mem_C () <
$buffer = file ( «/tmp/bigfile» );
unset( $buffer );
>
public allocate_mem_D () <
$this -> other_buffer = file ( «/tmp/bigfile» );
>
>
//this does not lead to a resource problem
$A =new release_test ();
$A -> allocate_mem_A ();
$A -> __destruct ();
unset( $A );
//this DOES lead to a resource problem
$B =new release_test ();
$B -> allocate_mem_B ();
$B -> __destruct ();
unset( $B );
//this does not lead to a resource problem
$C =new release_test ();
$C -> allocate_mem_C ();
$C -> __destruct ();
unset( $C );
//this does not lead to a resource problem
$D =new release_test ();
$D -> allocate_mem_D ();
$D -> __destruct ();
unset( $D );
?>
13 years ago
When unset from an array, if you unset all elements, the array is always set
17 years ago
Instead of using the unset function for unregistering your session or other array values you can also do this samll feature and get this task done with just 1 line code.
Suppose, if you like to unregister your session store values.
You can use:
Well this syntax saves lot’s of time instead of unsetting each values.
19 years ago
you may wan’t to unset all variables which are defined, here’s one way:
?>
you can also save than a serialized var of the «memory» and perhaps store this in a temporary file.. very usefull if you work with text files and/or file uploads when you’ve got very large variables.
16 years ago
In regard to some confusion earlier in these notes about what causes unset() to trigger notices when unsetting variables that don’t exist.
Unsetting variables that don’t exist, as in
unset( $undefinedVariable );
?>
does not trigger an «Undefined variable» notice. But
unset( $undefinedArray [ $undefinedKey ]);
?>
triggers two notices, because this code is for unsetting an element of an array; neither $undefinedArray nor $undefinedKey are themselves being unset, they’re merely being used to locate what should be unset. After all, if they did exist, you’d still expect them to both be around afterwards. You would NOT want your entire array to disappear just because you unset() one of its elements!
15 years ago
Sometimes you need to assigne values to an array index in some loop (if, while, foreach etc.) but you wish to set starting index key to some number greater then zero (lets say 5). One idea how to do this is:
$values = array( 5 , 10 , 15 , 100 ); //array of values that we wish to add to our new array
$myArray = array( 4 => 0 ); //sets starting key to be 4 and assigns some value (lets say 0)
unset( $myArray [ 4 ]); //delete this index key, but preserves further enumeration
foreach( $values as $value ) $myArray [] = $value ; //asign values to our array
>
Array ( [5] => 5 [6] => 10 [7] => 15 [8] => 100 )
13 years ago
You can not unset a numeric key of an array, if key is a string. See this example:
// Create a simple array with 3 different key types
$test[1] = array(
10 => array(‘apples’),
«20» => array(‘bananas’),
’30’ => array(‘peaches’)
);
$test[2] = (array) json_decode(json_encode($test[1]));
$test[3] = (array) (object) $test[1];
// array form a stdClass object
$testClass = new stdClass();
$testClass-> = array(‘apples’);
$testClass-> = array(‘bananas’);
$test[4] = (array) $testClass[6];
echo «»;
foreach($test as $testNum => $arr)
echo «\nTest: » . $testNum . » \n»;
var_dump($arr);
foreach($arr as $key => $fruit) echo «key: » . $key . «\n»;
echo «key exists: «;
var_dump(array_key_exists(strval($key), $arr));
echo «typeof key is: » . gettype($key) . «\n»;
And here is the output:
Test: 1
array(3) [10]=>
array(1) [0]=>
string(6) «apples»
>
[20]=>
array(1) [0]=>
string(7) «bananas»
>
[30]=>
array(1) [0]=>
string(7) «peaches»
>
>
key: 10
key exists: bool(true)
typeof key is: integer
key: 20
key exists: bool(true)
typeof key is: integer
key: 30
key exists: bool(true)
typeof key is: integer
array(0) >
Fix the problem with a rebuild of the array:
$oldArray = $array();
$array = array();
foreach($oldArray as $key => $item) $array[intval($key)] = $item;
>
14 years ago
Two ways of unsetting values within an array:
# remove by key:
function array_remove_key ()
$args = func_get_args ();
return array_diff_key ( $args [ 0 ], array_flip ( array_slice ( $args , 1 )));
>
# remove by value:
function array_remove_value ()
$args = func_get_args ();
return array_diff ( $args [ 0 ], array_slice ( $args , 1 ));
>
$fruit_inventory = array(
‘apples’ => 52 ,
‘bananas’ => 78 ,
‘peaches’ => ‘out of season’ ,
‘pears’ => ‘out of season’ ,
‘oranges’ => ‘no longer sold’ ,
‘carrots’ => 15 ,
‘beets’ => 15 ,
);
echo «
Original Array:\n" ,
print_r ( $fruit_inventory , TRUE ),
'
‘ ;
# For example, beets and carrots are not fruits.
$fruit_inventory = array_remove_key ( $fruit_inventory ,
«beets» ,
«carrots» );
echo «
Array after key removal:\n" ,
print_r ( $fruit_inventory , TRUE ),
'
‘ ;
# Let’s also remove ‘out of season’ and ‘no longer sold’ fruit.
$fruit_inventory = array_remove_value ( $fruit_inventory ,
«out of season» ,
«no longer sold» );
echo «
Array after value removal:\n" ,
print_r ( $fruit_inventory , TRUE ),
'
‘ ;
?>
16 years ago
It is observed on PHP 5.1.6 that inside of a method will remove the reference to $this in that method. $this isn’t considered «special» as far as unset() is concerned.?php>
11 years ago
The combination of «global» and «unset» in functions can lead to some unexpected results. This is because the «global» function creates a reference to a variable at the time it’s executed, so a variable can be deleted out from under a «global $my_variable» declaration in a function. Accessing data that’s been deleted with an obsolete reference is usually a bad thing; in some languages it can generate a machine address fault.
$my_global_var = «old data» ;
f1 ();
function f1 () // example of invalid variable reference use
global $my_global_var ; // creates reference to global variable
f2 (); // recreates global variable, so reference is now invalid
// bad.
echo $my_global_var ; // outputs «old data» (from invalid memory. )
// good.
global $my_global_var ; // reestablish reference to new global variable
echo $my_global_var ; // outputs «new data» as expected
>
function f2 () // recreate global variable
unset( $GLOBALS [ ‘my_global_var’ ]); // this syntax works with all variable types including arrays
global $my_global_var ; // must do this after unset to access new global variable
$my_global_var = «new data» ;
>
?>
18 years ago
We have experienced when we applied ‘unset’ to the overloaded properties (PHP5), consider the code below:
class TheObj public $RealVar1 , $RealVar2 , $RealVar3 , $RealVar4 ;
public $Var = array();
function __set ( $var , $val ) $this -> Var [ $var ] = $val ;
>
function __get ( $var ) if(isset( $this -> Var [ $var ])) return $this -> Var [ $var ];
else return — 1 ;
>
>
$SomeObj = new TheObj ;
// here we set for real variables
$SomeObj -> RealVar1 = ‘somevalue’ ;
$SomeObj -> < 'RealVar2' >= ‘othervalue’ ;
$SomeObj -> < 'RealVar' .( 3 )>= ‘othervaluetoo’ ;
$SomeObj -> < 'RealVar' . '4' >= ‘anothervalue’ ;
// and here we set for virtual variables
$SomeObj -> Virtual1 = ‘somevalue’ ;
$SomeObj -> < 'Virtual2' >= ‘othervalue’ ;
$SomeObj -> < 'Virtual' .( 3 )>= ‘othervaluetoo’ ;
$SomeObj -> < 'Virtual' . '4' >= ‘anothervalue’ ;
// now we will try to unset these variables
unset( $SomeObj -> RealVar1 );
unset( $SomeObj ->< 'RealVar' .( 3 )>);
//the lines below will catch by ‘__get’ magic method since these variables are unavailable anymore
print $SomeObj -> RealVar1 . «\n» ;
print $SomeObj ->< 'RealVar' .( 3 )>. «\n» ;
// now we will try to unset these variables
unset( $SomeObj -> Virtual1 );
unset( $SomeObj ->< 'Virtual' .( 3 )>);
//but, these variables are still available. eventhough they’re «unset»-ed
print $SomeObj -> Virtual1 . «\n» ;
print $SomeObj ->< 'Virtual' .( 3 )>. «\n» ;
?>
Please note that PHP doesn’t have magic callback to unset overloaded properties. This is the reason why unset($SomeObj->Virtual1) doesn’t work.
But it does work when we set ‘null’ value such as the following code:
// now we will set ‘null’ value instead of using unset statement
$SomeObj -> Virtual1 = null ;
$SomeObj -> < 'Virtual' .( 3 )>= null ;
// and now these variables are no longer available
print $SomeObj -> Virtual1 . «\n» ;
print $SomeObj ->< 'Virtual' .( 3 )>. «\n» ;
?>
Sound ugly, yeah?
This applied to the «virtual» array variable too, see more at http://bugs.php.net/bug.php?id=33513 (at feedback) about it.
PS: we used PHP version 5.1.0-dev from the CVS snapshot when we wrote the above codes.
9 years ago
You can unset superglobals like $GLOBALS, $_GET etc., but causing an unususal behavior (as of PHP 5.3.3).
1) unsetting of superglobals is done globally, i.e. unsetting inside the function affects GLOBALLY.
2) Recreation of unset’ed superglobals can be done (recreated valiables are superglobals), but original functionality (in $GLOBALS, $_SESSION . ) has lost.
function foo () unset( $GLOBALS );
>
function bar () var_dump ( $GLOBALS );
>
foo ();
bar (); //issues E_NOTICE ($GLOBALS not defined)
$GLOBALS = 3 ;
bar (); //displays int(3)
Необычное переполнение жесткого диска или как удалить миллионы файлов из одной папки
Скорей всего, матерым системным администраторам статья будет не очень интересна. В первую очередь она ориентирована на новичков, а также на людей, которые столкнулись с подобной проблемой — необходимостью удалить огромное количество файлов из одной папки в ОС Linux (Debian в моем случае), а также с закончившимся местом на диске, когда df -h выдает что почти 30% свободно.
Начало
Ничто не предвещало беды.
Сервер с сайтом работал без никаких проблем уже больше года (uptime почти 500 дней), не было никаких проблем, и я с чистой душой спокойно ушел в отпуск.
В первый же день отпуска мне звонят с жалобой — сайт недоступен. MySQL падает с ошибкой Error 28 «No space left on device».
Казалось бы, проблема банальна — кончилось место на диске. Правда, df -h показывает, что на диске имеется вполне достаточное количество свободного места, ну да я же в отпуске, разбираться лень — посоветовал им поискать на диске ненужные файлы (старые бекапы и т.д.) и их удалить. Удалили, вроде все заработало.
Прошла пара часов и проблема вернулась. Странно — свободное место на жестком диске за это время практически не уменьшилось. После беглого гугления обнаружился топик на serverfault, в котором говорится, что проблема может возникнуть также из-за того, что кончилось не место на диске, а айноды!
Ввожу в консоль df -i — и оказывается действительно, айноды у меня закончились.
Проблема
Начал искать, где же у меня находится столько файлов на жестком диске, что они сожрали все айноды (а айнодов у меня на 500-гигабайтном жестком диске больше 30 миллионов).
И нашел — оказалось, проблема была в папке с сессиями php.
Видимо, по какой-то причине сломался механизм автоочистки этой папки, что привело к тому, что в ней скопилось огромное количество файлов. Насколько огромное — сказать сложно, потому что никакие стандартные команды линукс, такие, как ls, find, rm и т.д. — с этой папкой не работают. Просто виснут, заодно подвешивая весь сервер. Могу только сказать, что сам файл директории стал весит около гигабайта, а также что файлов там точно более полумиллиона, потому что столько я оттуда уже удалил.
Решение
Решение очевидное — надо удалить все эти файлы сессий. При этом желательно, чтобы сервер продолжал работать в штатном режиме. Для начала я переименовал папку сессий, в которой лежит куча файлов, а вместо нее создал пустую — чтобы спокойно из старой (переименованной) удалять все файлы, и чтобы это не мешало созданию новых файлов сессий.
Также в крон добавил автоматическое удаление файлов сессий старше одного часа, чтобы проблема больше не повторилась.
И перешел к основной проблеме — очистке жесткого диска.
Попробовал решение «в лоб»:
rm -rf ./*
Сервер повис, ничего не удалилось
Попробовал известный способ для удаления большого числа файлов
find . -type f -exec rm -v <> \;
Ничего, сервер виснет, файлы не удаляются.
А теперь что самое интересное — файловый менеджер mc достаточно успешно справлялся с задачей удаления этих файлов! То есть, когда запускаешь удаление папки — файлы удаляются, mc не виснет. Удаление идет со скоростью примерно 5 000 файлов в минуту, правда при этом создается огромная нагрузка на жесткий диск, что приводит к неработоспособности сервера.
А хотелось бы, чтобы эти файлы постепенно удалялись в фоновом режиме, и не мешали нормальной работе сайта.
Собственно, решение опять нашлось в гугле — Olark делится способом, как он отобразил список из 8 миллионов файлов в 1 папке, используя системный вызов getdents
Здесь находится документация по функции getdents, а также пример кода, который ее использует.
Правда, этот пример мне не совсем подошел — даже если ставить большой размер буфера, как советует Olark в своем блоге, все равно сервер виснет при попытке прочитать всю папку разом.
Опытным путем подобрал размер буфера в 30 килобайт, который позволяет считать около 550 названий файлов из директории, при этом не подвешивая сервер и не создавая излишней нагрузки на диск. А также немного переписал код примера, чтобы вместо отображения имени файла он его удалял.
В итоге у меня получился такой код:
#define _GNU_SOURCE #include /* Defines DT_* constants */ #include #include #include #include #include #include #define handle_error(msg) \ do < perror(msg); exit(EXIT_FAILURE); >while (0) struct linux_dirent < long d_ino; off_t d_off; unsigned short d_reclen; char d_name[]; >; #define BUF_SIZE 1024*30 int main(int argc, char *argv[]) < int fd, nread; char buf[BUF_SIZE]; struct linux_dirent *d; int bpos; int deleted; char d_type; char temp[100]; fd = open(argc >1 ? argv[1] : ".", O_RDONLY | O_DIRECTORY); if (fd == -1) handle_error("open"); deleted = 0; nread = syscall(SYS_getdents, fd, buf, BUF_SIZE); if (nread == -1) handle_error("getdents"); if (nread != 0) < for (bpos = 0; bpos < nread;) < d = (struct linux_dirent *) (buf + bpos); d_type = *(buf + bpos + d->d_reclen - 1); if(d->d_ino && d->d_ino != 22332748 && d->d_ino != 22332761) < // тут я прописал inode самой директории и директории верхнего уровня, чтобы он не пытался удалять файлы "." и ".." - принимаю подсказки, как это сделать лучше sprintf(temp,"%s/%s", argv[1], (char *) d->d_name); remove(temp); deleted += 1; > bpos += d->d_reclen; > > printf("deleted %d\n", deleted); exit(EXIT_SUCCESS); >
Код компиллируется обычным gcc
gcc listdir.c -o listdir
И просто запускается из командной строки:
./listdir mod-tmp2
Получившийся файл я поставил в крон и теперь у меня удаляется по 547 файлов в минуту, при этом нагрузка на сервер в пределах нормы — и я надеюсь, в течение недели-другой все файлы все-таки удалятся.
Выводы
- Если df -h показывает, что на жестком диске еще есть место — его может и не быть. Надо смотреть также df -i
- Не стоит надеяться на механизмы авто-очистки таких вещей, как файлы сессий — в какой-то момент они могут не сработать, и вы окажетесь у целой горы файлов, удалить которые — задача нетривиальная
- Стандартные команды линукс, такие как ls, rm, find и т.д. могут пасовать перед нестандартными ситуациями вроде миллионов файлов в одной папке. В таком случае надо использовать низкоуровневые системные вызовы
ROSAForum
Сразу скажу, что я новичок на линукс, но читал о нем.
Идея научится собирать rpm пакеты. Почитал инструкции на этот счет тут: http://wiki.rosalab.ru/ru/index.php/%D0 . %D1%8B_RPM
попробовал на нескольких программах из репозитория, вроде собрались. Решил собрать свою с нуля из исходников и феил.
Программа: https://code.google.com/p/linuxtuner/
По инструкции надо начать с файла спецификации и он у меня получился такой:
Name: mountmanager Version: 0.2.6 Release: lop1 Summary: Manager mount devices. License: GPLv2+ Group: Archiving/Other Url: https://code.google.com/p/linuxtuner/ Source0: %-%.tar.gz BuildRequires: libqt4-devel BuildRequires: libqt4-core BuildRequires: libqt4-gui BuildRequires: libqt4-dbus BuildRequires: libqt4-xml Requires: qt4 Provides: mountmanager %description The basic functionalities of MountManager are: Mount and unmount partitions (ext3/2, ntfs, swap, fat, reiserfs, iso9660, udf, . ) Show all logical and physical disks Change config file /etc/fstab Descriptions of options and other settings of mounting Restoration system Images mounting and unmounting (Nrg, Mdf , Ccd, Bin , etc) Udev rules creation Disk wizard Etc. Plugins are supported and there is good English and Russian documentations to help develop new plugins. %prep %setup -q %build %configure %make %install %makeinstall %files
Как видите %files не заполнен. В инструкции написано чтоб его заполнить нужно сделать предварительную симуляцию установки командой: rpmbuild -bi
Но на стадии сборки мне выдаются ошибки:
[lop@host-15 SPECS]$ rpmbuild -bi mountmanager.spec Выполняется(%prep): /bin/sh -e /tmp/.private/lop/rpm-tmp.60207 + umask 022 + /bin/mkdir -p /usr/src/RPM/BUILD + cd /usr/src/RPM/BUILD + cd /usr/src/RPM/BUILD + rm -rf mountmanager-0.2.6 + echo 'Source #0 (mountmanager-0.2.6.tar.gz):' Source #0 (mountmanager-0.2.6.tar.gz): + /bin/tar -xf - + /bin/gzip -dc /usr/src/RPM/SOURCES/mountmanager-0.2.6.tar.gz + cd mountmanager-0.2.6 + /bin/chmod -c -Rf u+rwX,go-w . + exit 0 Выполняется(%build): /bin/sh -e /tmp/.private/lop/rpm-tmp.20374 + umask 022 + /bin/mkdir -p /usr/src/RPM/BUILD + cd /usr/src/RPM/BUILD + cd mountmanager-0.2.6 + CFLAGS='-pipe -Wall -g -O2' + export CFLAGS + CXXFLAGS='-pipe -Wall -g -O2' + export CXXFLAGS + FFLAGS='-pipe -Wall -g -O2' + export FFLAGS + '[' -n '' ']' ++ printf %s '-pipe -Wall -g -O2' ++ sed -r 's/(^|[[:space:]]+)-[^m][^[:space:]]*//g' + ASFLAGS= + export ASFLAGS + export lt_cv_deplibs_check_method=pass_all + lt_cv_deplibs_check_method=pass_all + xargs -rn1 install -pm755 -- /usr/share/gnu-config/config.sub /usr/share/gnu-config/config.guess + sort -u + xargs -ri find '<>' -type f '(' -name config.sub -or -name config.guess ')' -printf '%h/\n' + xargs -ri dirname -- '<>' + readlink -e -- ./configure + ./configure --build= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/lib --localstatedir=/var/lib --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --disable-dependency-tracking --without-included-gettext !---------------------------------------------------------! ! Thank you for installing of MountManager program! ! ! Mounting in Linux is easy! ! !---------------------------------------------------------! Unrecognized option: --build=x86_64-ros-linux Usage: ./configure [options] Available options: --help Print this message --clean Clean results of configuring and quit --prefix= Set prefix (default: /usr) --datadir= Set data dir (default: /usr/share --qmake= Set qmake executable --include_path= Set include path (default: /usr/include) --lib_path= Set lib path (default: /usr/lib) ошибка: Неверный код возврата из /tmp/.private/lop/rpm-tmp.20374 (%build) Ошибки сборки пакетов: Неверный код возврата из /tmp/.private/lop/rpm-tmp.20374 (%build) [lop@host-15 SPECS]$
Unrecognized option: —build=x86_64-ros-linux
Не понимаю почему ему не нравится моя архитектура. Проц. Интел х64 и ос х64.
Думал может программа только на 32х, выставлял сборку в i586 и в файле спец., прописывал, но результат тот же.
Ошибки сборки пакетов:
Неверный код возврата из /tmp/.private/lop/rpm-tmp.20374 (%build)
Тут вообще безобразие. В инете много информации о такой ошибке, но найденное не помогло. Я не знаю точно, но догадываюсь, что нужно прописать путь. Пробовал делать это в спец., с помощью BuildRoot , результат не менялся. Может нужны еще какие-то пути задать?
Последний раз редактировалось blua 25 дек 2014, 22:18, всего редактировалось 1 раз.
blua
ДроноваЮ Сообщения: 2636 Зарегистрирован: 01 июн 2011, 13:11 Operating system: Ubuntu/ROSA Откуда: Москва
Re: Сборка RPM
Сообщение ДроноваЮ » 25 дек 2014, 21:14
Только RPM, а не pmr. Поправила заголовок.
ДроноваЮ
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 26 дек 2014, 08:42
blua писал(а): Unrecognized option: —build=x86_64-ros-linux
Не понимаю почему ему не нравится моя архитектура. Проц. Интел х64 и ос х64.
А, ну тут дело не в архитектуре, а в опции —build=. Дело в том, что макрос %configure предназначен для использования с проектами на autotools, а в данном случае используется самописный скрипт (обёртка вокруг qmake) с именем configure, который по опциям лишь частично совместим с autotools. А на несовместимые опции ругается вместо того, чтобы просто проигнорировать.
Так что %configure надо заменить на ./configure (т.е. вместо макроса оставить просто команду). И возможно, что ещё надо указать значение —lib_path, чтобы учитывалась архитектура системы.
./configure --lib_path=%
Остальные значения сборки вроде и по умолчанию правильные.
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
blua Сообщения: 23 Зарегистрирован: 24 дек 2014, 22:19 Operating system: ROSA Desktop Fresh
Re: Сборка RPM
Сообщение blua » 26 дек 2014, 11:15
ДроноваЮ писал(а): Только RPM, а не pmr. Поправила заголовок.
Да, извиняюсь.
Pulfer писал(а):
blua писал(а): Unrecognized option: —build=x86_64-ros-linux
Не понимаю почему ему не нравится моя архитектура. Проц. Интел х64 и ос х64.
А, ну тут дело не в архитектуре, а в опции —build=. Дело в том, что макрос %configure предназначен для использования с проектами на autotools, а в данном случае используется самописный скрипт (обёртка вокруг qmake) с именем configure, который по опциям лишь частично совместим с autotools. А на несовместимые опции ругается вместо того, чтобы просто проигнорировать.
Так что %configure надо заменить на ./configure (т.е. вместо макроса оставить просто команду). И возможно, что ещё надо указать значение —lib_path, чтобы учитывалась архитектура системы.
./configure --lib_path=%
Остальные значения сборки вроде и по умолчанию правильные.
Так ./configure я пробовал, все равно ругается, но со значением —lib_path=% <_libdir>ошибка пропала.
Но осталась:
Неверный код возврата из /tmp/.private/lop/rpm-tmp.20374 (%build)
Что такое код возврата?
blua
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 26 дек 2014, 11:28
blua писал(а): Так ./configure я пробовал, все равно ругается, но со значением —lib_path=% <_libdir>ошибка пропала.
Но осталась:
Неверный код возврата из /tmp/.private/lop/rpm-tmp.20374 (%build)
Что такое код возврата?
Хмм, думаю, что в данном случае лучше даже не вникать в то, что такое код возврата в теории. На практике сообщение означает, что в блоке %build какая-то из команд завершилась с ошибкой. В прошлый раз ошибкой было «Unrecognized option», а сейчас надо снова смотреть на лог сборки, чтобы понять, что именно не так.
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
blua Сообщения: 23 Зарегистрирован: 24 дек 2014, 22:19 Operating system: ROSA Desktop Fresh
Re: Сборка RPM
Сообщение blua » 26 дек 2014, 12:57
Pulfer писал(а):
blua писал(а): Так ./configure я пробовал, все равно ругается, но со значением —lib_path=% <_libdir>ошибка пропала.
Но осталась:
Неверный код возврата из /tmp/.private/lop/rpm-tmp.20374 (%build)
Что такое код возврата?
Хмм, думаю, что в данном случае лучше даже не вникать в то, что такое код возврата в теории. На практике сообщение означает, что в блоке %build какая-то из команд завершилась с ошибкой. В прошлый раз ошибкой было «Unrecognized option», а сейчас надо снова смотреть на лог сборки, чтобы понять, что именно не так.
Оказалось неверный адрес пакета cmd.
urpmf нашел его в составе другого пакета. Потом исправил адрес в файле конфига в архиве с программой и все собралось. Щас список для %files делаю, если все получится спецификацию с поправками выложу. Мне в принципе эта программа не нужна, просто для эксперимента взял. Но она вроде не плохая, вдруг кому понадобится.
Вы не сердитесь, но я задам тупой вопрос.
хотел справку посмотреть ./configure, а мне в ответ:
[lop@lop-pookT rpm]$ man ./configure
man: ./configure: Нет такого файла или каталога
Нет справочной страницы для ./configure
Команда: ./configure —help
Вообще не найдена. Где и как можно посмотреть описание ./configure?
blua
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 26 дек 2014, 14:31
blua писал(а): Вы не сердитесь, но я задам тупой вопрос.
хотел справку посмотреть ./configure, а мне в ответ:
Да не, вопрос не тупой, нормальный.
Команда man работает только для части команд/программ. Для некоторых программ авторы не потрудились написать man-страницу, поэтому документацию по ним надо искать в и-нете, на странице разработчиков программы. Либо попробовать запустить команду с опцией —help. Хотя и в этих случаях может не быть документации, тут всё зависит от конкретной программы.
В данном случае configure — это просто скрипт сборки, man-страницы для него не предусмотрено, да и просто нет смысла. Команда ./configure —help должна вывести справку, но есть нюанс — запускать её надо в том же каталоге, где лежит скрипт configure. Либо вместо ./ указать полный путь к скрипту (./ — означает текущий каталог).
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
blua Сообщения: 23 Зарегистрирован: 24 дек 2014, 22:19 Operating system: ROSA Desktop Fresh
Re: Сборка RPM
Сообщение blua » 31 дек 2014, 17:54
Добавил патч и исходник, немного переделал spec, он у меня теперь такой:
Name: mountmanager Version: 0.2.6 Release: lop1 Summary: Manager mount devices License: GPLv2+ Group: Archiving/Other Url: https://code.google.com/p/linuxtuner/ Source0: http://linuxtuner.googlecode.com/files/mountmanager-0.2.6.tar.gz Source1: mountmanager.desktop Patch0: %name-config-destination.patc Requires: hal BuildRequires: libqt4-devel BuildRequires: libqt4-core BuildRequires: libqt4-gui BuildRequires: libqt4-dbus BuildRequires: libqt4-xml BuildRequires: gcc-c++ BuildRequires: qt4-devel %description The basic functionalities of MountManager are: Mount and unmount partitions (ext3/2, ntfs, swap, fat, reiserfs, iso9660, udf, . ) Show all logical and physical disks Change config file /etc/fstab Descriptions of options and other settings of mounting Restoration system Images mounting and unmounting (Nrg, Mdf , Ccd, Bin , etc) Udev rules creation Disk wizard Etc. Plugins are supported and there is good English and Russian documentations to help develop new plugins. %prep %setup %patch0 -p1 %build ./configure --lib_path=%_libdir --prefix=/usr/src/RPM/tmp/ %make %install %makeinstall_std %files %defattr %doc license readme.en readme.ru %doc %_datadir/doc/MountManager/* %_bindir/mmanager %_bindir/mm %_libdir/mountmanager/plugins/libdocumentationpanel.so %_libdir/mountmanager/plugins/libfstabpreview.so %_libdir/mountmanager/plugins/libimagesmounting.so %_libdir/mountmanager/plugins/libsharesmount.so %_libdir/mountmanager/plugins/libtips.so %_libdir/mountmanager/trans/br.qm %_libdir/mountmanager/trans/docpanel_ru.qm %_libdir/mountmanager/trans/es.qm %_libdir/mountmanager/trans/imagesmount_ru.qm %_libdir/mountmanager/trans/pl.qm %_libdir/mountmanager/trans/previewpanel_ru.qm %_libdir/mountmanager/trans/pt.qm %_libdir/mountmanager/trans/ru.qm %_libdir/mountmanager/trans/sharesmount_ru.qm %_libdir/mountmanager/trans/tips_ru.qm %_libdir/mountmanager/trans/tr.qm %_datadir/applications/mountmanager-kde.desktop %_datadir/applications/mountmanager-gtk.desktop %_datadir/icons/mm.png %_mandir/man1/mm.1* %_mandir/man1/%name.1* %_datadir/%name/*
Запускаю rpmbuild -ba mountmanager.spec и прерывает говоря что:
+---------------------------------------------------------------------+ | OK. Type make install to install. | +---------------------------------------------------------------------+ make: Leaving directory `/usr/src/RPM/BUILD/mountmanager-0.2.6' + exit 0 Выполняется(%install): /bin/sh -e /tmp/.private/lop/rpm-tmp.70578 + umask 022 + /bin/mkdir -p /usr/src/RPM/BUILD + cd /usr/src/RPM/BUILD + /bin/chmod -Rf u+rwX -- /tmp/.private/lop/mountmanager-buildroot + : + /bin/rm -rf -- /tmp/.private/lop/mountmanager-buildroot + cd mountmanager-0.2.6 + make 'INSTALL=/bin/install -p' install DESTDIR=/tmp/.private/lop/mountmanager-buildroot make: Entering directory `/usr/src/RPM/BUILD/mountmanager-0.2.6' install -d /usr/src/RPM/tmp//share/mountmanager install -d /usr/src/RPM/tmp//share/mountmanager/options install -d /usr/src/RPM/tmp//share/mountmanager/icons install -d /usr/src/RPM/tmp//share/mountmanager/images install -d /usr/src/RPM/tmp//share/doc/MountManager install -d /usr/src/RPM/tmp//bin install -d /usr/src/RPM/tmp//lib/mountmanager/trans install -d /usr/src/RPM/tmp//share/man/man1 install -d /usr/src/RPM/tmp//lib/mountmanager/plugins install -m 755 mm /usr/src/RPM/tmp//bin/mmanager install -m 644 options/* /usr/src/RPM/tmp//share/mountmanager/options/ install -m 644 resources/icons/* /usr/src/RPM/tmp//share/mountmanager/icons/ install -m 644 resources/images/* /usr/src/RPM/tmp//share/mountmanager/images/ install -m 644 trans/*.qm /usr/src/RPM/tmp//lib/mountmanager/trans/ cp -R doc/* /usr/src/RPM/tmp//share/doc/MountManager/ cp -R mans/* /usr/src/RPM/tmp//share/man/man1/ for dir in "ImagesMounting" "FstabPreview" "DocumentationPanel" "Tips" "SharesMount"; do \ cd plugins/$dir; \ cp -f translations/*.qm /usr/src/RPM/tmp//lib/mountmanager/trans/; \ for file in `ls *.so`; do \ cp $file /usr/src/RPM/tmp//lib/mountmanager/plugins/; \ done; \ cd ../../; \ done install -m 755 mountmanager /usr/src/RPM/tmp//bin/ install -d /usr/src/RPM/tmp//share/icons install -d /usr/src/RPM/tmp//share/applications install -m 644 resources/desktop/mm.png /usr/src/RPM/tmp//share/icons install -m 644 resources/desktop/mountmanager-gtk.desktop /usr/src/RPM/tmp//share/applications/ install -m 644 resources/desktop/mountmanager-kde.desktop /usr/src/RPM/tmp//share/applications/ +---------------------------------------------------------------------+ | OK. Start the program by typing mm | +---------------------------------------------------------------------+ make: Leaving directory `/usr/src/RPM/BUILD/mountmanager-0.2.6' line 26: cd: /tmp/.private/lop/mountmanager-buildroot: No such file or directory ошибка: Неверный код возврата из /tmp/.private/lop/rpm-tmp.70578 (%install) Ошибки сборки пакетов: Неверный код возврата из /tmp/.private/lop/rpm-tmp.70578 (%install)
cd: /tmp/.private/lop/mountmanager-buildroot: No such file or directory
Да такой папки нет и он должен ее создавать, но. Я пробовал сам ее делать, но она удаляется вовремя сборки.
Пробовал в спец файле прописывать buildroot, почему-то игнорирует путь.
Вот там повыше:
install DESTDIR=/tmp/.private/lop/mountmanager-buildroot
Такое чувство, что если этот путь изменить проблема решится ( наверное ). Поскольку это для меня первый опыт я не знаю где поменять.
================
Всех с наступающим 2015
blua
VictorR2007 Сообщения: 7139 Зарегистрирован: 12 сен 2011, 13:00 Operating system: ROSA 2023.1 Откуда: Северодвинск
Re: Сборка RPM
Сообщение VictorR2007 » 18 апр 2015, 19:47
Пробовал собирать пакет cantanta на qt5.
Если просто установит значение
%define with_qt5 1
то ошибка сборки.
VictorR2007
VictorR2007 Сообщения: 7139 Зарегистрирован: 12 сен 2011, 13:00 Operating system: ROSA 2023.1 Откуда: Северодвинск
Re: Сборка RPM
Сообщение VictorR2007 » 19 апр 2015, 12:01
VictorR2007 писал(а): Пробовал собирать пакет cantanta на qt5.
Если просто установит значение
%define with_qt5 1
то ошибка сборки.
Разобрался.
Всё нормально собирается.
VictorR2007
Ukropchik Сообщения: 127 Зарегистрирован: 07 авг 2014, 01:12 Operating system: Rosa and Elementary
Re: Сборка RPM
Сообщение Ukropchik » 28 июн 2015, 17:54
Всем привет. Написал игру на Python и выложил исходники (https://github.com/RastaDill/Logika/tree/master/Source) в группу Росы. Далее мне предложили собрать rpm пакет что-бы проще было другим посмотреть. В ходе сборки возникли некоторые вопросы. Вот мой spec файл:
Summary: Logic game Name: Logika Version: 1.0.0 Release: 1 License: GNU/GPL v.3 URL: https://github.com/RastaDill/Logika Group: Games/Puzzles Source0: logika.py Source1: game.py Source2: basic.py Requires: python Requires: pygame %description This is logical game written on python and pygame %prep %setup -q %build %configure %make %install %makeinstall %files %doc README(RUS) README(ENG) COPYING %/Logika/font %/Logika/image %/Logika/sound
Правильно ли я добавил исходники или их нужно было в архивировать в tar? Правильно ли указал соответсвующие данные в разделе %<_datadir>?
Ukropchik
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 28 июн 2015, 18:20
Ukropchik писал(а): Правильно ли я добавил исходники или их нужно было в архивировать в tar?
Лучше всего на гитхабе делать тэги для версий, а в спеке указывать исходники в виде tar-файла. Но в текущем виде в качестве исключения можно делать, если файлов с исходными текстами очень мало, а никакого апстрима для них нет.
Ukropchik писал(а): Правильно ли указал соответсвующие данные в разделе %<_datadir>?
Можно пару мест чуть улучшить. В поле License прописать GPLv3+, т.к. этот вариант используется наиболее часто для обозначения 3-й версии GPL в спеках. И в секции %files указать, что сам каталог %<_datadir>/Logika/ принадлежит данному пакету со всем его содержимым:
License: GPLv3+ . %dir %/Logika/ %/Logika/*
Но это скорее эстетические мелочи.
Важно тут другое.
%configure используется для запуска скрипта configure из дерева исходников. В данном случае такого скрипта нет, так что и макрос в спеке указывать не надо.
%make используется для запуска команды make. В данном случае нет файла Makefile, так что этот макрос тоже не нужен. Как и %makeinstall.
Скорее надо сделать так:
%build # nothing to build %install mkdir -p %%/Logika cp * %%/Logika/
Но т.к. игра запускается файлом logika.py из каталога /usr/share/Logika, надо ещё создать для него в %install-секции wrapper-скрипт, который устанавливать в /usr/bin. Что-то типа
cat%%/logika #!/bin/bash cd %/Logika python logika.py EOF chmod 0755 %%/logika
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
Ukropchik Сообщения: 127 Зарегистрирован: 07 авг 2014, 01:12 Operating system: Rosa and Elementary
Re: Сборка RPM
Сообщение Ukropchik » 29 июн 2015, 14:50
Так, spec файл немного переписал:
Summary: Logic game Name: Logika Version: 1.0.0 Release: 1 License: GPLv3+ URL: https://github.com/RastaDill/Logika Group: Games/Puzzles Source0: logika.py Source1: game.py Source2: basic.py Requires: python Requires: pygame %description This is logical game written on python and pygame %prep %setup -q %build %install mkdir -p %%/Logika cp * %%/Logika/ %files %doc README(RUS) README(ENG) COPYING %/Logika/*
Pulfer писал(а): Но т.к. игра запускается файлом logika.py из каталога /usr/share/Logika, надо ещё создать для него в %install-секции wrapper-скрипт, который устанавливать в /usr/bin.
Здесь я немного не понял что за wrapper-скрипт и куда его вставлять? Я так понимаю что в программе playonlinux такой скрипт есть:
#!/bin/sh exec /usr/share/playonlinux/playonlinux "$@" exit 0
Ukropchik
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 29 июн 2015, 16:42
Ukropchik писал(а): Здесь я немного не понял что за wrapper-скрипт и куда его вставлять?
Summary: Logic game Name: Logika Version: 1.0.0 Release: 1 License: GPLv3+ URL: https://github.com/RastaDill/Logika Group: Games/Puzzles Source0: logika.py Source1: game.py Source2: basic.py Requires: python Requires: pygame %description This is logical game written on python and pygame. %prep %setup -q %build %install mkdir -p %%/Logika cp * %%/Logika/ cat%%/logika #!/bin/bash cd %/Logika python logika.py EOF chmod 0755 %%/logika %files %doc README(RUS) README(ENG) COPYING %/logika %dir %/Logika/ %/Logika/*
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
VictorR2007 Сообщения: 7139 Зарегистрирован: 12 сен 2011, 13:00 Operating system: ROSA 2023.1 Откуда: Северодвинск
Re: Сборка RPM
Сообщение VictorR2007 » 29 июн 2015, 19:33
Столкнулся с проблемой.
У нас в репах есть программа ultracopier,
но собрана без дополнительных локалей.
Чтобы работали дополнительные локали (на фотке),
я пробовал добавить в спек строку
install -D src/lang/* %%/%/lang/*
Но она ломает упаковку остальных файлов,
и не видит файлы в src/lang
P.S.
Разобрался как это обойти.
VictorR2007
Ukropchik Сообщения: 127 Зарегистрирован: 07 авг 2014, 01:12 Operating system: Rosa and Elementary
Re: Сборка RPM
Сообщение Ukropchik » 30 июн 2015, 18:47
Pulfer, спасибо за помощь. Подправил spec-файл. Но собрать всё равно не удаётся. Вот такая ошибка появляется.
rpmbuild -ba logika.spec Выполняется(%prep): /bin/sh -e /var/tmp/rpm-tmp.44355 + umask 022 + cd /home/weedman/rpmbuild/BUILD + '[' 1 -eq 1 ']' + '[' 1 -eq 1 ']' + '[' 1 -eq 1 ']' + cd /home/weedman/rpmbuild/BUILD + rm -rf Logika-1.0.0 + /bin/tar -xf /home/weedman/rpmbuild/SOURCES/logika.py /bin/tar: This does not look like a tar archive /bin/tar: Skipping to next header /bin/tar: Exiting with failure status due to previous errors error: Неверный код возврата из /var/tmp/rpm-tmp.44355 (%prep) Ошибки сборки пакетов: Неверный код возврата из /var/tmp/rpm-tmp.44355 (%prep)
Ukropchik
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 30 июн 2015, 19:32
Ukropchik писал(а): Pulfer, спасибо за помощь. Подправил spec-файл. Но собрать всё равно не удаётся. Вот такая ошибка появляется.
А, ну да, там же всё ещё не файловый архив указан в качестве Source0. «%setup -q» распаковывает Source0, а в данном случае распаковывать нечего.
Тогда вот так надо:
Summary: Logic game Name: Logika Version: 1.0.0 Release: 1 License: GPLv3+ URL: https://github.com/RastaDill/Logika Group: Games/Puzzles Source0: logika.py Source1: game.py Source2: basic.py Requires: python Requires: pygame %description This is logical game written on python and pygame. %prep %build %install mkdir -p %%/Logika install -m 0644 % %%/Logika/logika.py install -m 0644 % %%/Logika/game.py install -m 0644 % %%/Logika/basic.py cat%%/logika #!/bin/bash cd %/Logika python logika.py EOF chmod 0755 %%/logika %files %doc README(RUS) README(ENG) COPYING %/logika %dir %/Logika/ %/Logika/*
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
Ukropchik Сообщения: 127 Зарегистрирован: 07 авг 2014, 01:12 Operating system: Rosa and Elementary
Re: Сборка RPM
Сообщение Ukropchik » 01 июл 2015, 00:34
И снова ошибка:
+ cat /var/tmp/rpm-tmp.24020: line 33: /home/weedman/rpmbuild/BUILDROOT/Logika-1.0.0-1-rosa2014.1.x86_64-buildroot/usr/bin/logika: No such file or directory error: Неверный код возврата из /var/tmp/rpm-tmp.24020 (%install)
Не могу понять из-за чего такое. По идеи cat <должна создать файл если его нет.
Ukropchik
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 01 июл 2015, 02:23
Ukropchik писал(а): Не могу понять из-за чего такое. По идеи cat <должна создать файл если его нет.
А, ну надо предварительно каталог создать ещё:
mkdir -p %%
А потом cat сделать.
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
Ukropchik Сообщения: 127 Зарегистрирован: 07 авг 2014, 01:12 Operating system: Rosa and Elementary
Re: Сборка RPM
Сообщение Ukropchik » 02 июл 2015, 19:36
Итак, теперь удалось собрать пакет. Сначала была ошибка что файлы README и другие не найдены, но это было из-за того что они были не каталоге BUILD. Теперь, когда я всё собрал по какой-то причине не скопировался сам контент (звук, спрайты и т.д.) Может их необходимо в какой-то другой каталог перенести? Имеется три папки font, image, sound. Необходимо что-бы они были вместе с исходниками в /usr/share/Logika.
И ещё один вопрос. Обязательно выполнять сборку пакета из /bin/sh или всё же достаточно /bin/bash?
Ukropchik
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 03 июл 2015, 01:59
Ukropchik писал(а): Теперь, когда я всё собрал по какой-то причине не скопировался сам контент (звук, спрайты и т.д.) Может их необходимо в какой-то другой каталог перенести? Имеется три папки font, image, sound. Необходимо что-бы они были вместе с исходниками в /usr/share/Logika.
Они не указаны среди исходников:
Source0: logika.py Source1: game.py Source2: basic.py
Поэтому всё же лучше не перечислять каждый файл отдельно, а упаковать всё в тарбол logika-1.0.0.tar.xz (или gz/bz2), включая контент.
А потом в %install-секции:
cp -r font image sound %%/Logika/
Ukropchik писал(а): И ещё один вопрос. Обязательно выполнять сборку пакета из /bin/sh или всё же достаточно /bin/bash?
Достаточно, конечно.
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
Ukropchik Сообщения: 127 Зарегистрирован: 07 авг 2014, 01:12 Operating system: Rosa and Elementary
Re: Сборка RPM
Сообщение Ukropchik » 04 июл 2015, 11:21
Упаковал необходимые файлы в tar.gz.
Теперь spec-файл такой:
Summary: Logic game Name: Logika Version: 1.0.0 Release: 1 License: GPLv3+ URL: https://github.com/RastaDill/Logika Group: Games/Puzzles Source0: %-%.tar.gz Requires: python Requires: pygame %description This is logical game written on python and pygame. %prep %setup -q %build %install mkdir -p %%/Logika cp * %%/Logika/ mkdir -p %% cat%%/logika #!/bin/bash cd %/Logika/ python logika.py EOF chmod 0755 %%/logika %files %doc README_RUS README_ENG COPYING %/logika %dir %/Logika/ %/Logika/*
Ошибка вылетает на моменте %prep.
$ rpmbuild -ba logika.spec Выполняется(%prep): /bin/sh -e /var/tmp/rpm-tmp.77188 + umask 022 + cd /home/weedman/rpmbuild/BUILD + '[' 1 -eq 1 ']' + '[' 1 -eq 1 ']' + '[' 1 -eq 1 ']' + cd /home/weedman/rpmbuild/BUILD + rm -rf Logika-1.0.0 + /bin/gzip -dc /home/weedman/rpmbuild/SOURCES/Logika-1.0.0.tar.gz + /bin/tar -xf - + STATUS=0 + '[' 0 -ne 0 ']' + cd Logika-1.0.0 /var/tmp/rpm-tmp.77188: line 35: cd: Logika-1.0.0: No such file or directory error: Неверный код возврата из /var/tmp/rpm-tmp.77188 (%prep) Ошибки сборки пакетов: Неверный код возврата из /var/tmp/rpm-tmp.77188 (%prep)
Во время сборки я так понимаю происходит переход в каталог Logika-1.0.0 которого соответственно нет. Выставлял параметр -n %
Ukropchik
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 05 июл 2015, 15:45
Ukropchik писал(а): Name: Logika
Лучше всё же маленькие буквы использовать в названии пакетов. Не принципиально, просто предпочтительнее, «так принято».
Ukropchik писал(а): Во время сборки я так понимаю происходит переход в каталог Logika-1.0.0 которого соответственно нет. Выставлял параметр -n %
Надо указать тот каталог, который получается после распаковки тарбола.
Скажем, если после распаковки Logika-1.0.0.tar.gz получаем каталог Logika, внутри которого лежат все файлы, то указываем:
%setup -qn Ligika
Здесь q — это quiet, то есть не выводить в лог сборки информацию о распакованных файлах. А n — это аргумент для команды cd после распаковки тарбола. По умолчанию значение n — %
Если же файлы распаковываются не в подкаталог, то надо указать:
%setup -qc
Здесь c — это указание создать подкаталог, в который распаковать тарбол. Создастся rpmbuild/BUILD/Logika-1.0.0. Можно также указать другое значение n, но смысла в этом нет.
В общем, надо просто исходить из структуры тарбола.
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
Ukropchik Сообщения: 127 Зарегистрирован: 07 авг 2014, 01:12 Operating system: Rosa and Elementary
Re: Сборка RPM
Сообщение Ukropchik » 07 июл 2015, 17:42
Почти получилось. Собирается пакет но в конце появляется ошибка в сборке.
Вот мой текущий spec-файл:
Summary: Logic game Name: logika Version: 1.0.0 Release: 1 License: GPLv3+ URL: https://github.com/RastaDill/Logika Group: Games/Puzzles Source0: %-%.tar.gz Requires: python Requires: pygame %description This is logical game written on python and pygame. %prep %setup -qn logika %build %install mkdir -p %%/logika cp *.py %%/logika/ cp -r font image sound %%/logika/ mkdir -p %% cat%%/logika #!/bin/bash cd %/logika/ python logika.py EOF chmod 0755 %%/logika %files %doc README_RUS README_ENG COPYING %/logika %dir %/logika/ %/logika/*
Далее после сборки выдаётс следующее сообщение:
Ошибки сборки пакетов: Package check "/usr/bin/rpmlint -T -f /home/weedman/rpmbuild/SOURCES/logika.rpmlintrc /home/weedman/rpmbuild/RPMS/x86_64/logika-1.0.0-1-rosa2014.1.x86_64.rpm /home/weedman/rpmbuild/RPMS/x86_64/logika-debuginfo-1.0.0-1-rosa2014.1.x86_64.rpm" failed.
Весь процесс сборки:
$ rpmbuild -ba logika.spec
Выполняется(%prep): /bin/sh -e /var/tmp/rpm-tmp.64865
+ umask 022
+ cd /home/weedman/rpmbuild/BUILD
+ ‘[‘ 1 -eq 1 ‘]’
+ ‘[‘ 1 -eq 1 ‘]’
+ ‘[‘ 1 -eq 1 ‘]’
+ cd /home/weedman/rpmbuild/BUILD
+ rm -rf logika
+ /bin/gzip -dc /home/weedman/rpmbuild/SOURCES/logika-1.0.0.tar.gz
+ /bin/tar -xf —
+ STATUS=0
+ ‘[‘ 0 -ne 0 ‘]’
+ cd logika
+ exit 0
Выполняется(%build): /bin/sh -e /var/tmp/rpm-tmp.64865
+ umask 022
+ cd /home/weedman/rpmbuild/BUILD
+ cd logika
+ ‘[‘ 1 -eq 1 ‘]’
+ ‘[‘ 1 -eq 1 ‘]’
+ exit 0
Выполняется(%install): /bin/sh -e /var/tmp/rpm-tmp.64865
+ umask 022
+ cd /home/weedman/rpmbuild/BUILD
+ /bin/rm -rf /home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot
+ /bin/mkdir -p /home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot
+ cd logika
+ ‘[‘ 1 -eq 1 ‘]’
+ mkdir -p /home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot/usr/share/logika
+ cp basic.py game.py logika.py /home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot/usr/share/logika/
+ cp -r font image sound /home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot/usr/share/logika/
+ mkdir -p /home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot/usr/bin
+ cat
+ chmod 0755 /home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot/usr/bin/logika
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/clean_files
+ ‘[‘ -n » ‘]’
+ COMPRESS=’xz -0f —text’
+ COMPRESS_EXT=.xz
+ /usr/lib/rpm/brp-compress
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/relink_symlinks
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/clean_perl
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/lib_symlinks
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/gprintify
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/fix_mo
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/fix_xdg
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/fix_file_permissions
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/fix_pamd
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/remove_info_dir
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/remove_libtool_files
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/fix_eol
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/check_elf_files
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/remove_rpath
+ /usr/lib/rpm/find-debuginfo.sh -r /home/weedman/rpmbuild/BUILD/logika
Обрабатываются файлы: logika-1.0.0-1.x86_64
Выполняется(%doc): /bin/sh -e /var/tmp/rpm-tmp.57238
+ umask 022
+ cd /home/weedman/rpmbuild/BUILD
+ cd logika
+ DOCDIR=/home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot/usr/share/doc/logika
+ export DOCDIR
+ /bin/mkdir -p /home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot/usr/share/doc/logika
+ cp -pr README_RUS README_ENG COPYING /home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot/usr/share/doc/logika
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/fix_eol /home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot/usr/share/doc/logika
+ ‘[‘ -n » ‘]’
+ /usr/share/spec-helper/clean_files /home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot/usr/share/doc/logika
Requires: python(abi)
Обрабатываются файлы: logika-debuginfo-1.0.0-1.x86_64
Проверка на неупакованный(е) файл(ы): /usr/lib/rpm/check-files /home/weedman/rpmbuild/BUILDROOT/logika-1.0.0-1-rosa2014.1.x86_64-buildroot
Записан: /home/weedman/rpmbuild/SRPMS/logika-1.0.0-1.src.rpm
Executing «/usr/bin/rpmlint -T -f /home/weedman/rpmbuild/SOURCES/logika.rpmlintrc /home/weedman/rpmbuild/SRPMS/logika-1.0.0-1.src.rpm»:
1 packages and 0 specfiles checked; 0 errors, 0 warnings.
Записан: /home/weedman/rpmbuild/RPMS/x86_64/logika-1.0.0-1-rosa2014.1.x86_64.rpm
Записан: /home/weedman/rpmbuild/RPMS/x86_64/logika-debuginfo-1.0.0-1-rosa2014.1.x86_64.rpm
Executing «/usr/bin/rpmlint -T -f /home/weedman/rpmbuild/SOURCES/logika.rpmlintrc /home/weedman/rpmbuild/RPMS/x86_64/logika-1.0.0-1-rosa2014.1.x86_64.rpm /home/weedman/rpmbuild/RPMS/x86_64/logika-debuginfo-1.0.0-1-rosa2014.1.x86_64.rpm»:
logika.x86_64: E: non-standard-executable-perm (Badness: 1) /usr/share/logika/logika.py 0700
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/board/.directory 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/.directory 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/door/.directory 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/drop point/.directory 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/menu/.directory 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/blocks/.directory 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/logika.py 0700
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/pipe/pipe_up.png 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/tumbler/.directory 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/game.py 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/background/.directory 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/pipe/.directory 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/basic.py 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/pipe/pipe_down.png 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/pictograms/.directory 0600
logika.x86_64: E: non-readable (Badness: 1) /usr/share/logika/image/button/.directory 0600
logika.x86_64: W: non-executable-script /usr/share/logika/game.py 0600 /usr/bin/env
logika.x86_64: W: non-executable-script /usr/share/logika/basic.py 0600 /usr/bin/env
logika.x86_64: E: no-binary (Badness: 1)
logika.x86_64: W: hidden-file-or-dir /usr/share/logika/image/board/.directory
logika.x86_64: W: hidden-file-or-dir /usr/share/logika/image/.directory
logika.x86_64: W: hidden-file-or-dir /usr/share/logika/image/door/.directory
logika.x86_64: W: hidden-file-or-dir /usr/share/logika/image/drop point/.directory
logika.x86_64: W: hidden-file-or-dir /usr/share/logika/image/menu/.directory
logika.x86_64: W: hidden-file-or-dir /usr/share/logika/image/blocks/.directory
logika.x86_64: W: hidden-file-or-dir /usr/share/logika/image/tumbler/.directory
logika.x86_64: W: hidden-file-or-dir /usr/share/logika/image/background/.directory
logika.x86_64: W: hidden-file-or-dir /usr/share/logika/image/pipe/.directory
logika.x86_64: W: hidden-file-or-dir /usr/share/logika/image/pictograms/.directory
logika.x86_64: W: hidden-file-or-dir /usr/share/logika/image/button/.directory
logika-debuginfo.x86_64: E: empty-debuginfo-package (Badness: 50)
2 packages and 0 specfiles checked; 19 errors, 13 warnings.
(none): E: badness 68 exceeds threshold 49.
error: Package check «/usr/bin/rpmlint -T -f /home/weedman/rpmbuild/SOURCES/logika.rpmlintrc /home/weedman/rpmbuild/RPMS/x86_64/logika-1.0.0-1-rosa2014.1.x86_64.rpm /home/weedman/rpmbuild/RPMS/x86_64/logika-debuginfo-1.0.0-1-rosa2014.1.x86_64.rpm» failed.
Ошибки сборки пакетов:
Package check «/usr/bin/rpmlint -T -f /home/weedman/rpmbuild/SOURCES/logika.rpmlintrc /home/weedman/rpmbuild/RPMS/x86_64/logika-1.0.0-1-rosa2014.1.x86_64.rpm /home/weedman/rpmbuild/RPMS/x86_64/logika-debuginfo-1.0.0-1-rosa2014.1.x86_64.rpm» failed.
Ukropchik
VictorR2007 Сообщения: 7139 Зарегистрирован: 12 сен 2011, 13:00 Operating system: ROSA 2023.1 Откуда: Северодвинск
Re: Сборка RPM
Сообщение VictorR2007 » 07 июл 2015, 17:55
Наверное к строке
chmod 0755 %%/logika
нужно добавить
chmod -R 755 %%/logika/*
VictorR2007
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 07 июл 2015, 19:24
VictorR2007 писал(а): Наверное к строке
chmod 0755 %%/logika
нужно добавить
chmod -R 755 %%/logika/*
Лучше в изначальном тарболе права поправить, чтобы вместо 0600 было 0644, а вместо 0700 было 0755.
А что касается вот этой ошибки:
logika-debuginfo.x86_64: E: empty-debuginfo-package (Badness: 50)
То надо в спеке прописать тэг (рядом с другими тэгами — Requires: и т.п.):
BuildArch: noarch
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
Ukropchik Сообщения: 127 Зарегистрирован: 07 авг 2014, 01:12 Operating system: Rosa and Elementary
Re: Сборка RPM
Сообщение Ukropchik » 09 июл 2015, 12:39
Ура . Большое спасибо за помощь. Пакет собран и работает. Вот такой конечный получился spec-файл:
Summary: Logic game Name: logika Version: 1.0.0 Release: 1 License: GPLv3+ URL: https://github.com/RastaDill/Logika Group: Games/Puzzles Source0: %-%.tar.gz Requires: python Requires: pygame BuildArch: noarch %description This is logical game written on python and pygame. %prep %setup -qn logika %build %install mkdir -p %%/logika cp *.py %%/logika/ cp -r font image sound %%/logika/ mkdir -p %% cat%%/logika #!/bin/bash cd %/logika/ python logika.py EOF chmod 0755 %%/logika mkdir -p %%/applications/ cat%%/applications/logika.desktop [Desktop Entry] Version=1.0.0 Name=Logika Comment=Logic game Type=Application Exec=logika Icon=%/logika/image/icon.png Categories=Game;PuzzleGame; EOF chmod 0755 %%/applications/logika.desktop %files %doc README_RUS README_ENG COPYING %/logika %/applications/logika.desktop %dir %/logika/ %/logika/*
Ukropchik
tverskoy Сообщения: 1145 Зарегистрирован: 12 сен 2011, 13:30 Operating system: Rosa 2016.1 Fresh Откуда: Тверь
Re: Сборка RPM
Сообщение tverskoy » 13 ноя 2015, 20:11
Помогите разобраться, учусь работать с abf, ковыряю cinnamon. Недостающие пакеты при сборке смотреть в rpm-build.log ?
+ /usr/share/spec-helper/clean_files /builddir/build/BUILDROOT/cinnamon-desktop-2.8.0-1-rosa2014.1.i586-buildroot/usr/share/doc/cinnamon-desktop Requires: libX11.so.6 libXrandr.so.2 libc.so.6 libc.so.6(GLIBC_2.0) libcinnamon-desktop.so.4 libgdk-3.so.0 libglib-2.0.so.0 libgobject-2.0.so.0 libgtk-3.so.0 libpthread.so.0 Processing files: libcinnamon-desktop4-2.8.0-1.i586 Processing files: libcinnamon-desktop-gir1.0-2.8.0-1.i586 error: File not found by glob: /builddir/build/BUILDROOT/cinnamon-desktop-2.8.0-1-rosa2014.1.i586-buildroot/usr/lib/libcinnamon-desktop*.so.4 ERROR: Failed to load typelib 'CDesktopEnums' ERROR: Failed to load typelib 'CinnamonDesktop' Provides: typelib(CDesktopEnums) = 3.0 typelib(CinnamonDesktop) = 3.0 Processing files: libcinnamon-desktop-devel-2.8.0-1.i586 Provides: devel(libcinnamon-desktop) pkgconfig(cinnamon-desktop) = 2.8.0 Requires: devel(libX11) devel(libXext) devel(libXrandr) devel(libcairo) devel(libgdk-3) devel(libgdk_pixbuf-2.0) devel(libgio-2.0) devel(libglib-2.0) devel(libgobject-2.0) devel(libgtk-3) devel(libxkbfile) pkgconfig(gtk+-3.0) Processing files: cinnamon-desktop-debuginfo-2.8.0-1.i586 Checking for unpackaged file(s): /usr/lib/rpm/check-files /builddir/build/BUILDROOT/cinnamon-desktop-2.8.0-1-rosa2014.1.i586-buildroot error: Installed (but unpackaged) file(s) found: /usr/lib/libcinnamon-desktop.so.4 /usr/lib/libcinnamon-desktop.so.4.0.0 RPM build errors: File not found by glob: /builddir/build/BUILDROOT/cinnamon-desktop-2.8.0-1-rosa2014.1.i586-buildroot/usr/lib/libcinnamon-desktop*.so.4 Installed (but unpackaged) file(s) found: /usr/lib/libcinnamon-desktop.so.4 /usr/lib/libcinnamon-desktop.so.4.0.0 Child returncode was: 1 EXCEPTION: Command failed. See logs for output. # ['bash', '--login', '-c', 'rpmbuild -bb --target i586 --nodeps builddir/build/SPECS/cinnamon-desktop.spec'] Traceback (most recent call last): File "/usr/lib/python2.7/site-packages/mock_urpm/trace_decorator.py", line 70, in trace result = func(*args, **kw) File "/usr/lib/python2.7/site-packages/mock_urpm/util.py", line 377, in do raise mock_urpm.exception.Error, ("Command failed. See logs for output.\n # %s" % (command,), child.returncode) Error: Command failed. See logs for output. # ['bash', '--login', '-c', 'rpmbuild -bb --target i586 --nodeps builddir/build/SPECS/cinnamon-desktop.spec'] LEAVE do --> EXCEPTION RAISED
почему-то не упаковывается уже собранный файл, помогите разобраться
в спеке заменил BuildRequires: gobject-introspection-devel на girepository-devel
оригинальный спек
%global _internal_version fcbafe3 %global gtk3_version 3.10.0 %global glib2_version 2.33.3 %global startup_notification_version 0.5 %global gtk_doc_version 1.9 %global po_package cinnamon-desktop-3.0 %global date 20151020 %define major 4 %define girmajor 1.0 %define libname %mklibname % % %define libdev %mklibname % -d %define girlib %mklibname %-gir % Summary: Shared code among cinnamon-session, nemo, etc Name: cinnamon-desktop Version: 2.8.0 Release: %mkrel 1 License: GPLv2+ and LGPLv2+ add MIT Group: Graphical desktop/Cinnamon URL: http://cinnamon.linuxmint.com Source0: cinnamon-desktop-%.tar.gz #SourceGet0: https://github.com/linuxmint/cinnamon-desktop/archive/%.tar.gz #Source0: cinnamon-desktop-%.git%.tar.gz ##SourceGet0: https://github.com/linuxmint/cinnamon-desktop/tarball/% # Make sure that gnome-themes-standard gets pulled in for upgrades Requires: gnome-themes-standard BuildRequires: gnome-common BuildRequires: pkgconfig(gtk+-3.0) >= % BuildRequires: gobject-introspection-devel BuildRequires: pkgconfig(glib-2.0) >= % BuildRequires: startup-notification-devel >= % BuildRequires: pkgconfig(xkbfile) BuildRequires: pkgconfig(xkeyboard-config) BuildRequires: gtk-doc >= % BuildRequires: intltool BuildRequires: itstool %description The cinnamon-desktop package contains an internal library (libcinnamondesktop) used to implement some portions of the CINNAMON desktop, and also some data files and other shared components of the CINNAMON user environment. #-------------------------------------------------------------------- %package -n %libname Summary: Libraries for %name License: LGPLv2+ Group: System/Libraries %description -n %libname Libraries for %name #-------------------------------------------------------------------- %package -n % Summary: GObject introspection interface library for % Group: System/Libraries Requires: % = %-% %description -n % GObject introspection interface library for %. #-------------------------------------------------------------------- %package -n %libdev Summary: Libraries and headers for libcinnamon-desktop License: LGPLv2+ Group: Development/C Requires: % = %-% Requires: % = %-% Requires: gtk3-devel >= % Requires: glib2-devel >= % Requires: startup-notification-devel >= % %description -n %libdev Libraries and header files for the CINNAMON-internal private library libcinnamondesktop. %prep %setup -q sed -i -e 's!subdir-objects!!g' configure.ac NOCONFIGURE=1 ./autogen.sh %build %configure --with-pnp-ids-path="%/misc/pnp.ids" sed -i -e 's! -shared ! -Wl,--as-needed\0!g' libtool %make V=1 %install % # stuff we don't want rm -f $RPM_BUILD_ROOT%/*.la rm -f $RPM_BUILD_ROOT%/*.a %find_lang % --all-name --with-gnome %files -f %.lang %doc AUTHORS COPYING COPYING.LIB README %/glib-2.0/schemas/org.cinnamon.*.xml %/cinnamon-rr-debug %/cinnamon-desktop-migrate-mediakeys %files -n %libname %/libcinnamon-desktop*.so.% %files -n % %/girepository-1.0/C*-3.0.typelib %files -n %libdev %/libcinnamon-desktop.so %/pkgconfig/cinnamon-desktop.pc %/cinnamon-desktop/ %/gir-1.0/C*-3.0.gir %changelog * Wed Oct 21 2015 joequant 2.8.0-1.mga6 + Revision: 893688 - upgrade to 2.8.0 * Sun Jun 28 2015 wally 2.6.5-2.mga6 + Revision: 847157 - add requires for gir pkg to devel pkg * Fri Jun 26 2015 joequant 2.6.5-1.mga6 + Revision: 844285 - upgrade to 2.6 * Thu Nov 27 2014 joequant 2.4.2-1.mga5 + Revision: 799543 - 2.4.2 * Sun Nov 23 2014 joequant 2.4.1-1.mga5 + Revision: 798406 - upgrade to 2.4 * Wed Oct 15 2014 umeabot 2.2.3-5.mga5 + Revision: 745259 - Second Mageia 5 Mass Rebuild * Sun Sep 28 2014 tv 2.2.3-4.mga5 + Revision: 731111 - rebuild so that it picks typelib() requires * Thu Sep 18 2014 umeabot 2.2.3-3.mga5 + Revision: 693609 - Rebuild to fix library dependencies * Tue Sep 16 2014 umeabot 2.2.3-2.mga5 + Revision: 678397 - Mageia 5 Mass Rebuild * Tue Jun 10 2014 joequant 2.2.3-1.mga5 + Revision: 635329 - upgrade to 2.2.3 * Thu May 15 2014 joequant 2.2.2-1.mga5 + Revision: 622879 - upgrade to 2.2.2 * Fri Apr 18 2014 joequant 2.2.0-1.mga5 + Revision: 616819 - upgrade to 2.2 * Wed Jan 08 2014 joequant 2.0.4-3.mga4 + Revision: 565561 - push to core/release * Wed Jan 01 2014 joequant 2.0.4-2.mga4 + Revision: 563806 - upgrade to 2.0.4 * Tue Oct 22 2013 umeabot 2.0.1-2.mga4 + Revision: 542039 - Mageia 4 Mass Rebuild * Mon Oct 14 2013 joequant 2.0.1-1.mga4 + Revision: 496762 - update to 2.0.1 * Mon Oct 07 2013 joequant 2.0.0-1.mga4 + Revision: 492506 - packaged wrong source - update to 2.0.0 * Tue Oct 01 2013 joequant 1.9.1-1.mga4 + Revision: 490048 - upgrade to 1.9.1 * Thu Sep 19 2013 joequant 1.0.0-0.20130905git37ca83b.1.mga4 + Revision: 481370 - sync with git * Mon Sep 02 2013 neoclust 1.0.0-0.1.gitea72b22.1.mga4 + Revision: 474292 - Libify * Mon Sep 02 2013 joequant 1.0.0-0.1.gitea72b22.mga4 + Revision: 474250 - update to latest git version - imported package cinnamon-desktop
Вложения abfworker__rpm-worker-2597562.log (363.2 КБ) 954 скачивания rpm-build.log (157.58 КБ) 1100 скачиваний
tverskoy
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 13 ноя 2015, 20:26
tverskoy писал(а): File not found by glob: /builddir/build/BUILDROOT/cinnamon-desktop-2.8.0-1-rosa2014.1.i586-buildroot/usr/lib/libcinnamon-desktop*.so.4<,.*>
Installed (but unpackaged) file(s) found:
/usr/lib/libcinnamon-desktop.so.4
/usr/lib/libcinnamon-desktop.so.4.0.0,.*>
Надо в спеке заменить
%/libcinnamon-desktop*.so.%
%/libcinnamon-desktop.so.%*
Этого достаточно, чтобы описать /usr/lib/libcinnamon-desktop.so.4 и /usr/lib/libcinnamon-desktop.so.4.0.0. Видимо, в Магее регулярные выражение в RPM-спеках немного по-другому работают, если их вариант у них нормально собирается.
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
tverskoy Сообщения: 1145 Зарегистрирован: 12 сен 2011, 13:30 Operating system: Rosa 2016.1 Fresh Откуда: Тверь
Re: Сборка RPM
Сообщение tverskoy » 13 ноя 2015, 21:00
Мог бы разницу объяснить? А то я до таких тонкостей недошёл
tverskoy
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 13 ноя 2015, 21:48
tverskoy писал(а): Мог бы разницу объяснить? А то я до таких тонкостей недошёл
У нас есть файлы
/usr/lib/ (и /usr/lib64/ для 64-битной сборки) описывается макросом %/
Далее идёт общая для двух файлов часть libcinnamon-desktop.so, указываем её как есть. В Магее зачем-то * вставили туда, а * означает любой символ. Хотя у нас только libcinnamon-desktop.so, а никаких libcinnamon-desktop-ui.so, libcinnamon-desktop-widgets.so и т.п. файлов нет. Совершенно лишнее усложнение маски получается.
И в конце идёт разная для двух файлов часть 4 и 4.0.0. Где 4 — это так называемая major-версия библиотеки. Т.е. по зависимостям она будет потом запрашиваться как libcinnamon-desktop.so.4. А пакет согласно политикам сборки библиотек будет иметь вид libcinnamon-desktop4 (и lib64cinnamon-desktop4 для 64-бит). 4.0.0 — это полная версия библиотеки, файл /usr/lib/libcinnamon-desktop.so.4 — это симлинк на /usr/lib/libcinnamon-desktop.so.4.0.0.
В спеке выше мы задаём макросы:
%define major 4
%define libname %mklibname % %
И потом используем %* для описания последней части имен файлов:
Макрос %* раскрывается в 4*, т.е. 4 и все символы, которые идут после него.
Макросы тут нужны для того, чтобы если в следующей версии из апстрима библиотека не будет обратно совместимой с данной версией и её major-версия станет 5 (/usr/lib/libcinnamon-desktop.so.5), то нам достаточно будет поменять в спеке %define major 4 на %define major 5, чтобы получить пакет libcinnamon-desktop5.
А если бы мы использовали в описании файлов какой-нибудь совсем общий вариант вроде %/lib*.so.*, то был бы риск получить в будущем пакет libcinnamon-desktop4 с файлами /usr/lib/libcinnamon-desktop.so.5, затем /usr/lib/libcinnamon-desktop.so.6 и далее. Что в этом плохого — отдельная тема, наверное.
Возвращаясь к регулярным выражениям, то магеевское , видимо, должно было охватывать случаи «» (ничего) и «.*» (точка, а затем любые символы). Зачем такое усложнение — я не знаю. Единственную пользу вижу в том, чтобы отличать /usr/lib/libcinnamon-desktop.so.1.0.0 от /usr/lib/libcinnamon-desktop.so.10.0.0, тогда как для %* разницы между 1* и 10* нет. Но можно для этого случая сделать так:
Надеюсь, понятно объяснил, а то как-то многословно вышло.
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
tverskoy Сообщения: 1145 Зарегистрирован: 12 сен 2011, 13:30 Operating system: Rosa 2016.1 Fresh Откуда: Тверь
Re: Сборка RPM
Сообщение tverskoy » 13 ноя 2015, 22:04
спасибо, буду разбираться
tverskoy
notauser Сообщения: 1254 Зарегистрирован: 06 май 2012, 21:00
Re: Сборка RPM
Сообщение notauser » 15 ноя 2015, 03:18
<, вроде как целое десятичное число, потом символ . и всё что угодно*. Но это, видимо, то что хотели, а получили как всегда, то что просили.
ibcinnamon-desktop*.so.4. <,.*>не пробовали?,>
notauser
Алзим Сообщения: 4522 Зарегистрирован: 18 июн 2015, 11:57 Operating system: ROSA Desktop Fresh R11 Откуда: Интернет
Re: Сборка RPM
Сообщение Алзим » 15 ноя 2015, 07:54
notauser писал(а): <, вроде как целое десятичное число, потом символ . и всё что угодно*. Но это, видимо, то что хотели, а получили как всегда, то что просили.
ibcinnamon-desktop*.so.4. <,.*>не пробовали?,>
А почему бы вам самому не попробовать собрать пакеты?
Алзим
tverskoy Сообщения: 1145 Зарегистрирован: 12 сен 2011, 13:30 Operating system: Rosa 2016.1 Fresh Откуда: Тверь
Re: Сборка RPM
Сообщение tverskoy » 17 ноя 2015, 14:43
Эх, сложно на ABF собирать, тесты не проходят, базовую библиотеку собрал, с остальным сложно все где вобще про abf можно почитать?
Последний раз редактировалось tverskoy 17 ноя 2015, 14:46, всего редактировалось 1 раз.
tverskoy
keleg Сообщения: 5504 Зарегистрирован: 15 сен 2011, 01:58
Re: Сборка RPM
Сообщение keleg » 17 ноя 2015, 14:45
tverskoy писал(а): Эх, сложно на ABF собирать, тесты не проходят
Версию не подняли? Там, в логах, для тестов обычно понятно, что к чему.
keleg
tverskoy Сообщения: 1145 Зарегистрирован: 12 сен 2011, 13:30 Operating system: Rosa 2016.1 Fresh Откуда: Тверь
Re: Сборка RPM
Сообщение tverskoy » 17 ноя 2015, 14:51
==> See: 'https://abf.io/build_lists/2597681' Executing "/usr/bin/rpmlint -T -f /builddir/build/SOURCES/cinnamon-menus.rpmlintrc /builddir/build/SRPMS/cinnamon-menus-2.8.0-1.src.rpm": cinnamon-menus.src:13: W: macro-in-comment % cinnamon-menus.src:13: W: macro-in-comment % cinnamon-menus.src:13: W: macro-in-comment % cinnamon-menus.src:13: W: macro-in-comment % cinnamon-menus.src:15: W: macro-in-comment % cinnamon-menus.src:15: W: macro-in-comment % 1 packages and 0 specfiles checked; 0 errors, 6 warnings. Executing "/usr/bin/rpmlint -T -f /builddir/build/SOURCES/cinnamon-menus.rpmlintrc /builddir/build/RPMS/cinnamon-menus-2.8.0-1-rosa2014.1.x86_64.rpm /builddir/build/RPMS/cinnamon-menus-devel-2.8.0-1-rosa2014.1.x86_64.rpm /builddir/build/RPMS/cinnamon-menus-debuginfo-2.8.0-1-rosa2014.1.x86_64.rpm": cinnamon-menus-devel.x86_64: W: no-major-in-name cinnamon-menus-devel cinnamon-menus-devel.x86_64: W: no-documentation cinnamon-menus-devel.x86_64: W: no-dependency-on cinnamon-menus/cinnamon-menus-libs/libcinnamon-menus cinnamon-menus.x86_64: E: incoherent-version-in-name (Badness: 50) 3 3 packages and 0 specfiles checked; 1 errors, 3 warnings.
И что интересно этот же пакет собрался для 2012.1, случайно галочку не туда поставил
Вобщем учусь
tverskoy
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 17 ноя 2015, 15:17
tverskoy писал(а): cinnamon-menus.x86_64: E: incoherent-version-in-name (Badness: 50) 3
Это значит, что имя пакета не соответствует политике сборки библиотек: http://wiki.rosalab.com/ru/index.php/Libraries_policy
Судя по спеку, в Магею его импортировали из Федоры и не стали адаптировать под свою политику сборки (она в целом такая же, как и у Росы, т.к. идёт ещё от Мандривы).
Вот этот кусок, кстати, можно вообще убрать:
%post -p /sbin/ldconfig %postun -p /sbin/ldconfig
В Росе ldconfig вызывается автоматически (где он нужен после установки пакетов).
Что касается самой библиотеки libcinnamon-menu-3.so.0, то
%define api 3
%define major 0
%define libname cinnamon-menu % %
%define devname cinnamon-menu % -d
(в devel-пакете % указывается опционально — если видно, что в именах файлов он тоже фигурирует, то указать его желательно).
А т.к. они фигурируют:
/usr/include/cinnamon-menus-3.0
/usr/lib64/libcinnamon-menu-3.so
/usr/lib64/pkgconfig/libcinnamon-menu-3.0.pc
То лучше указать.
Ну и далее согласно политике сборки описать в спеке пакеты
Для официального пакета ещё typelib и gir файлы надо было бы правильно упаковать, но мне кажется, что пока что с ними и так сойдёт, пусть typelib будет в пакете с библиотекой. Или если с библиотеками всё уже понятно, могу дальше про typelib рассказать.
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
tverskoy Сообщения: 1145 Зарегистрирован: 12 сен 2011, 13:30 Operating system: Rosa 2016.1 Fresh Откуда: Тверь
Re: Сборка RPM
Сообщение tverskoy » 17 ноя 2015, 18:10
Линт ругается
==> See: 'https://abf.io/build_lists/2598836' Executing "/usr/bin/rpmlint -T -f /builddir/build/SOURCES/cinnamon-menus.rpmlintrc /builddir/build/SRPMS/cinnamon-menus-2.8.0-1.src.rpm": cinnamon-menus.src: E: specfile-error (Badness: 1) error: Bad package specification: %package -n cinnamon-menus 3 -d cinnamon-menus.src:18: W: macro-in-comment % cinnamon-menus.src:18: W: macro-in-comment % cinnamon-menus.src:18: W: macro-in-comment % cinnamon-menus.src:18: W: macro-in-comment % cinnamon-menus.src:20: W: macro-in-comment % cinnamon-menus.src:20: W: macro-in-comment % 1 packages and 0 specfiles checked; 1 errors, 6 warnings.
Получилось так
%global enable_debugging 0 #global _internal_version f22e07d %define api 3 %define major 0 %define libname % % % %define devname % % -d Summary: A menu system for the Cinnamon project Name: cinnamon-menus Version: 2.8.0 Release: %mkrel 1 License: LGPLv2+ Group: Graphical desktop/Cinnamon URL: http://cinnamon.linuxmint.com # for git # wget https://github.com/linuxmint/cinnamon-menus/tarball/%% -O cinnamon-menus-%%.git%%.tar.gz #Source0: http://leigh123linux.fedorapeople.org/pub/%/source/%-%.git%.tar.gz Source0: %-%.tar.gz #SourceGet0: https://github.com/linuxmint/%/archive/%.tar.gz BuildRequires: glib2-devel BuildRequires: pkgconfig BuildRequires: python-devel BuildRequires: intltool BuildRequires: girepository-devel BuildRequires: gnome-common %description cinnamon-menus is an implementation of the draft "Desktop Menu Specification" from freedesktop.org. This package also contains the Cinnamon menu layout configuration files, .directory files and assorted menu related utility programs, Python bindings, and a simple menu editor. %package -n % Summary: Libraries and include files for the Cinnamon menu system Group: Development/C Requires: %% = %-% %description devel This package provides the necessary development libraries for writing applications that use the Cinnamon menu system. %prep %setup -q NOCONFIGURE=1 ./autogen.sh %build %configure --disable-static \ --enable-introspection \ %if % --enable-debug=yes %else --enable-debug=no %endif %make V=1 %install % find $RPM_BUILD_ROOT -name '*.la' -exec rm -f <> ';' %files %doc AUTHORS NEWS COPYING.LIB %/lib*.so.* %/girepository-1.0/C*-3.0.typelib %files devel %/lib*.so %/pkgconfig/* %/cinnamon-menus-3.0 %/gir-1.0/C*-3.0.gir %changelog * Wed Oct 21 2015 joequant 2.8.0-1.mga6 + Revision: 893697 - upgrade to 2.8.0 * Fri Jun 26 2015 joequant 2.6.0-1.mga6 + Revision: 844318 - add gnome common - upgrade to 2.6 * Wed Dec 03 2014 tmb 2.4.0-2.mga5 + Revision: 800483 - bump rel past testing * Sun Nov 23 2014 joequant 2.4.0-1.mga5 + Revision: 798405 - upgrade to 2.4 * Wed Oct 15 2014 umeabot 2.2.0-5.mga5 + Revision: 742819 - Second Mageia 5 Mass Rebuild * Thu Sep 18 2014 umeabot 2.2.0-4.mga5 + Revision: 693610 - Rebuild to fix library dependencies * Tue Sep 16 2014 umeabot 2.2.0-3.mga5 + Revision: 678398 - Mageia 5 Mass Rebuild * Wed May 14 2014 joequant 2.2.0-2.mga5 + Revision: 622768 - rebuild for cauldron * Sat Apr 19 2014 joequant 2.2.0-1.mga5 + Revision: 616949 - imported package cinnamon-menus * Sat Apr 12 2014 Leigh Scott - 2.2.0-1 - update to 2.2.0 * Sat Mar 22 2014 Leigh Scott - 2.1-0.1.gitc740513 - inital release
Или %define devname %
?
Пробовал api убрать, тоже не нравится
tverskoy
Алзим Сообщения: 4522 Зарегистрирован: 18 июн 2015, 11:57 Operating system: ROSA Desktop Fresh R11 Откуда: Интернет
Re: Сборка RPM
Сообщение Алзим » 17 ноя 2015, 18:25
Собрал пакет https://abf.io/build_lists/2598817
Установил себе. Всё работает вроде. Разницы с тем, что было в репозитории не заметил.
Основной цели не добился. Хотел чтобы Вайбер был на русском, но не знаю как это сделать. Но, в процессе установки, в логе видел, что русская локаль есть. А вот как её поставить?
Алзим
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 17 ноя 2015, 18:34
tverskoy писал(а): Линт ругается
Упс, моя вина. Забыл макрос %mklibname вставить в определение:
%define libname %mklibname cinnamon-menu % % %define devname %mklibname cinnamon-menu % -d
Этот макрос делает вот что. На 32-битной системе libname получит значение libcinnamon-menu3_0, а на 64-битной lib64cinnamon-menu3_0. А devname — libcinnamon-menu3-devel и lib64cinnamon-menu3-devel соответственно.
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
tverskoy Сообщения: 1145 Зарегистрирован: 12 сен 2011, 13:30 Operating system: Rosa 2016.1 Fresh Откуда: Тверь
Re: Сборка RPM
Сообщение tverskoy » 17 ноя 2015, 19:37
Я правильно понял что в спеке cinnamon desktop (он собран уже)
%define major 4 %define girmajor 1.0 %define libname %mklibname % % %define devname %mklibname % -d %define girlib %mklibname %-gir %
%
tverskoy
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 17 ноя 2015, 20:00
tverskoy писал(а): Я правильно понял что в спеке cinnamon desktop (он собран уже)
%define major 4 %define girmajor 1.0 %define libname %mklibname % % %define devname %mklibname % -d %define girlib %mklibname %-gir %
%
%
Макросы бывают нескольких видов.
1. Пользовательские — это всё, что указывается в спеке через %define. Например, если сделать «%define XXX Test», то дальше в спеке вместо % будет подставляться Test.
2. Автоматические — это то, что автоматически определяется при сборке пакета. В частности, тэгу Name соответствует макрос %, Version — % и т.п. Самый частый пример их использования — в тэге Source.
3. Системные — это то, что прописано в macros-файлах из /etc/rpm/macros.d/ и /usr/lib/rpm/macros.d/
В строке «%define libname %mklibname % %» определяется пользовательский макрос libname через системный макрос %mklibname (из /usr/lib/rpm/macros.d/mandriva), вызываемый с параметрами: автоматческий макрос % и пользовательский макрос %.
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
tverskoy Сообщения: 1145 Зарегистрирован: 12 сен 2011, 13:30 Operating system: Rosa 2016.1 Fresh Откуда: Тверь
Re: Сборка RPM
Сообщение tverskoy » 17 ноя 2015, 22:56
==> See: 'https://abf.io/build_lists/2598994' Executing "/usr/bin/rpmlint -T -f /builddir/build/SOURCES/cinnamon-menus.rpmlintrc /builddir/build/SRPMS/cinnamon-menus-2.8.0-1.src.rpm": cinnamon-menus.src:18: W: macro-in-comment % cinnamon-menus.src:18: W: macro-in-comment % cinnamon-menus.src:18: W: macro-in-comment % cinnamon-menus.src:18: W: macro-in-comment % cinnamon-menus.src:20: W: macro-in-comment % cinnamon-menus.src:20: W: macro-in-comment % 1 packages and 0 specfiles checked; 0 errors, 6 warnings. Executing "/usr/bin/rpmlint -T -f /builddir/build/SOURCES/cinnamon-menus.rpmlintrc /builddir/build/RPMS/cinnamon-menus-2.8.0-1-rosa2014.1.i586.rpm /builddir/build/RPMS/libcinnamon-menu-devel-2.8.0-1-rosa2014.1.i586.rpm /builddir/build/RPMS/cinnamon-menus-debuginfo-2.8.0-1-rosa2014.1.i586.rpm": libcinnamon-menu-devel.i586: E: zero-length (Badness: 1) /usr/lib/pkgconfig/libcinnamon-menu-3.0.pc libcinnamon-menu-devel.i586: W: no-documentation libcinnamon-menu-devel.i586: W: no-dependency-on libcinnamon-menu/libcinnamon-menu-libs/liblibcinnamon-menu cinnamon-menus.i586: E: incoherent-version-in-name (Badness: 50) 3 3 packages and 0 specfiles checked; 2 errors, 2 warnings.
В общем добился что src.rpm проходит. теперь вопросы badness 1 это что?
«no-dependency-on libcinnamon-menu/libcinnamon-menu-libs/liblibcinnamon-menu» — это я так понимаю нужно альтернативные имена зависимостей задать?
спек:
%global enable_debugging 0 #global _internal_version f22e07d %define api 3 %define major 0 %define libname %mklibname cinnamon-menu % % %define devname %mklibname cinnamon-menu -d Summary: A menu system for the Cinnamon project Name: cinnamon-menus Version: 2.8.0 Release: %mkrel 1 License: LGPLv2+ Group: Graphical desktop/Cinnamon URL: http://cinnamon.linuxmint.com # for git # wget https://github.com/linuxmint/cinnamon-menus/tarball/%% -O cinnamon-menus-%%.git%%.tar.gz #Source0: http://leigh123linux.fedorapeople.org/pub/%/source/%-%.git%.tar.gz Source0: %-%.tar.gz #SourceGet0: https://github.com/linuxmint/%/archive/%.tar.gz BuildRequires: glib2-devel BuildRequires: pkgconfig BuildRequires: python-devel BuildRequires: intltool BuildRequires: girepository-devel BuildRequires: gnome-common %description cinnamon-menus is an implementation of the draft "Desktop Menu Specification" from freedesktop.org. This package also contains the Cinnamon menu layout configuration files, .directory files and assorted menu related utility programs, Python bindings, and a simple menu editor. %package -n % Summary: Libraries and include files for the Cinnamon menu system Group: Development/C Requires: % = %-% %description -n % This package provides the necessary development libraries for writing applications that use the Cinnamon menu system. %prep %setup -q NOCONFIGURE=1 ./autogen.sh %build %configure --disable-static \ --enable-introspection \ %if % --enable-debug=yes %else --enable-debug=no %endif %make V=1 %install % find $RPM_BUILD_ROOT -name '*.la' -exec rm -f <> ';' %files %doc AUTHORS NEWS COPYING.LIB %/lib*.so.* %/girepository-1.0/C*-3.0.typelib %files -n % %/*.so %/pkgconfig/* %/cinnamon-menus-3.0 %/gir-1.0/C*-3.0.gir %changelog * Wed Oct 21 2015 joequant 2.8.0-1.mga6 + Revision: 893697 - upgrade to 2.8.0 * Fri Jun 26 2015 joequant 2.6.0-1.mga6 + Revision: 844318 - add gnome common - upgrade to 2.6 * Wed Dec 03 2014 tmb 2.4.0-2.mga5 + Revision: 800483 - bump rel past testing * Sun Nov 23 2014 joequant 2.4.0-1.mga5 + Revision: 798405 - upgrade to 2.4 * Wed Oct 15 2014 umeabot 2.2.0-5.mga5 + Revision: 742819 - Second Mageia 5 Mass Rebuild * Thu Sep 18 2014 umeabot 2.2.0-4.mga5 + Revision: 693610 - Rebuild to fix library dependencies * Tue Sep 16 2014 umeabot 2.2.0-3.mga5 + Revision: 678398 - Mageia 5 Mass Rebuild * Wed May 14 2014 joequant 2.2.0-2.mga5 + Revision: 622768 - rebuild for cauldron * Sat Apr 19 2014 joequant 2.2.0-1.mga5 + Revision: 616949 - imported package cinnamon-menus * Sat Apr 12 2014 Leigh Scott - 2.2.0-1 - update to 2.2.0 * Sat Mar 22 2014 Leigh Scott - 2.1-0.1.gitc740513 - inital release ROSA Лаб. © 2015 · flag · О компании · Контакты · Условия использования · Служба поддержки · API для разработчиков · Идеи для ABF · Блог ABF
вот здесь поменял %name на %libname и добавил -n %
%package -n % Summary: Libraries and include files for the Cinnamon menu system Group: Development/C Requires: % = %-%
чем отличается %devname от %
tverskoy
tverskoy Сообщения: 1145 Зарегистрирован: 12 сен 2011, 13:30 Operating system: Rosa 2016.1 Fresh Откуда: Тверь
Re: Сборка RPM
Сообщение tverskoy » 17 ноя 2015, 23:20
Добавил в %files
%/lib*%.so.%*
Всераано ошибки лезут
tverskoy
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 18 ноя 2015, 04:00
tverskoy писал(а): libcinnamon-menu-devel.i586: E: zero-length (Badness: 1) /usr/lib/pkgconfig/libcinnamon-menu-3.0.pc?
В общем добился что src.rpm проходит. теперь вопросы badness 1 это что?
Тут пишет, что файл libcinnamon-menu-3.0.pc пустой. И вес этой ошибки 1. Если общий вес ошибок 50 и более, то сборка считается совсем некачественной и получает статус «ошибка сборки». Пока что с этой ошибкой ничего не надо делать
tverskoy писал(а): «no-dependency-on libcinnamon-menu/libcinnamon-menu-libs/liblibcinnamon-menu» — это я так понимаю нужно альтернативные имена зависимостей задать?
Это можно игнорировать.
tverskoy писал(а): вот здесь поменял %name на %libname и добавил -n %
Ага. Но в спеке не хватает определения пакета %
%package -n % Summary: Shared library for the Cinnamon menu system Group: System/Libraries %description -n % This package provides shared library for the Cinnamon menu system. . %files -n % %doc AUTHORS NEWS COPYING.LIB %/libcinnamon-menu*%.so.* %/girepository-1.0/C*-3.0.typelib
tverskoy писал(а): чем отличается %devname от %
Функционально ничем. Но у нас так сложилось, что в скобки берутся макросы-переменные (например, %
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
tverskoy Сообщения: 1145 Зарегистрирован: 12 сен 2011, 13:30 Operating system: Rosa 2016.1 Fresh Откуда: Тверь
Re: Сборка RPM
Сообщение tverskoy » 20 ноя 2015, 10:41
Что-то странное на ABF у меня твориться, для i586 ошибка сборки, а для x86_64 больше 9 часов собирается
tverskoy
keleg Сообщения: 5504 Зарегистрирован: 15 сен 2011, 01:58
Re: Сборка RPM
Сообщение keleg » 20 ноя 2015, 10:58
Попробуйте еще раз. Ночью были проблемы, когда добавляли несколько новых сборочных воркеров.
keleg
fedan Сообщения: 23 Зарегистрирован: 28 ноя 2015, 19:21 Operating system: ROSA FRESH R10 Plasma x86_64
Calculate Linux x86_64
Windows 7 Ultimate x86_64
Re: Сборка RPM
Сообщение fedan » 28 ноя 2015, 20:05
Всем Добрый вечер! Хочу задать вопрос такой: Читал что %define можно задавать только в начале .spec файла. Его можно определить в произвольном месте?
Например, недавно вышел fpc 3.0.0 , у них политика такая, что после релиза компилятора, идут fixes в branches текущего релиза из trunk. Они выкладывают их в ftp://ftp.freepascal.org/pub/fpc/snapsh . ce/fpc.zip. (копия после внесения исправлений). Версия свежесобранного компилятора определяется так: fpc -iV. Хочется в buildroot определить версию % и уже её подставлять в %/lib/fpc/%.
fedan
Pulfer Сообщения: 3358 Зарегистрирован: 15 фев 2012, 01:57 Operating system: ROSA Desktop Fresh 2016.1 i586 Откуда: Vladivostok, Russia
Re: Сборка RPM
Сообщение Pulfer » 28 ноя 2015, 21:10
fedan писал(а): Всем Добрый вечер! Хочу задать вопрос такой: Читал что %define можно задавать только в начале .spec файла. Его можно определить в произвольном месте?
В произвольном месте, но до первого использования макроса.
%define oname FPC Summary: % is a free Pascal compiler
Неправильно:
Summary: % is a free Pascal compiler %define oname FPC
fedan писал(а): Например, недавно вышел fpc 3.0.0 , у них политика такая, что после релиза компилятора, идут fixes в branches текущего релиза из trunk. Они выкладывают их в ftp://ftp.freepascal.org/pub/fpc/snapsh . ce/fpc.zip. (копия после внесения исправлений). Версия свежесобранного компилятора определяется так: fpc -iV. Хочется в buildroot определить версию % и уже её подставлять в %/lib/fpc/%.
Проблема в том, что значение макросов вычисляется до начала сборки пакета. Так что мы не можем сделать вот так, потому что до начала сборки файла fpc по указанному пути ещё не будет существовать:
%define fpc_version %(%%/fpc -iV)
Хотя версию текущего установленного fpc определить можем, т.к. файл уже будет существовать до начала сборки:
%define fpc_version %(fpc -iV)
Intel Core i7-6700 / 8 Gb RAM / GeForce GTX 750 Ti / Rosa 2016.1 i586
Pulfer
fedan Сообщения: 23 Зарегистрирован: 28 ноя 2015, 19:21 Operating system: ROSA FRESH R10 Plasma x86_64
Calculate Linux x86_64
Windows 7 Ultimate x86_64
Re: Сборка RPM
Сообщение fedan » 28 ноя 2015, 21:28
Благодарю за разъяснение.
fedan
GiuX Сообщения: 68 Зарегистрирован: 29 окт 2012, 01:31 Operating system: RM2012.0lts
Re: Сборка RPM
Сообщение GiuX » 05 дек 2015, 18:04
Hi at all,
I’m sorry for the intrusion but I would like to build some package for Rosa that I need for my degree but I’m a newbee about rpm packaging.
Someone could help me to end this spec file?
%define major XX %define libname %mklibname % % %define develname %mklibname -d % %global commit0 fd5de11497edd7cdb28e7eef60fa998a2ebd7f84 %global gittag0 HEAD %global shortcommit0 %(c=%; echo $) Name: ndn-cxx Summary: NDN C++ library with eXperimental eXtensions Version: 0.4.0 Release: 1 License: LGPLv3 Group: System/Libraries Url: http://named-data.net/doc/%/current/index.html Source0: https://github.com/named-data/%/archive/%.tar.gz#/%-%.tar.gz BuildRequires: git BuildRequires: pkgconfig(sqlite3) BuildRequires: pkgconfig(cryptopp) BuildRequires: boost-devel # BReqs for documentation BuildRequires: doxygen BuildRequires: graphviz BuildRequires: python-sphinx BuildRequires: python-pip # Requires: python # Requires: sqlite3 # Requires: cryptopp # Requires: pkgconfig # Requires(post): ldconfig # Requires(postun): ldconfig %description ndn-cxx is a C++ library, implementing Named Data Networking (NDN) primitives that can be used to implement various NDN applications. The library is currently being used as part of the following projects: * [NFD - NDN Forwarding Daemon] * [NLSR - Named-data Link-State Routing protocol] * [repo-ng - Next generation of NDN repository] * [ChronoChat - Multi-user NDN chat application] * [ChronoSync - Sync library for multiuser realtime applications for NDN] * [ndn-tlv-ping - Ping Application For NDN] * [ndn-traffic-generator - Traffic Generator For NDN]. #----------------------------------------------------------------------------- %package -n % Summary: Shared libraries for % Group: System/Libraries %description -n % Shared libraries for %. %files -n % %/lib%.so.0.3.92 #----------------------------------------------------------------------------- %package -n % %description -n % This package contains the development library and header files for the % library. %files -n % %dir %/% %/%/common-pch.hpp %/%/common.hpp %/%/data.hpp %/%/encoding/block-helpers.hpp %/%/encoding/block.hpp %/%/encoding/buffer-stream.hpp %/%/encoding/buffer.hpp %/%/encoding/cryptopp/asn_ext.hpp %/%/encoding/encoder.hpp %/%/encoding/encoding-buffer-fwd.hpp %/%/encoding/encoding-buffer.hpp %/%/encoding/endian.hpp %/%/encoding/estimator.hpp %/%/encoding/nfd-constants.hpp %/%/encoding/oid.hpp %/%/encoding/tlv-nfd.hpp %/%/encoding/tlv-security.hpp %/%/encoding/tlv.hpp %/%/exclude.hpp %/%/face.hpp %/%/interest-filter.hpp %/%/interest.hpp %/%/key-locator.hpp %/%/link.hpp %/%/lp/cache-policy.hpp %/%/lp/detail/field-decl.hpp %/%/lp/detail/field-info.hpp %/%/lp/field.hpp %/%/lp/fields.hpp %/%/lp/nack-header.hpp %/%/lp/nack.hpp %/%/lp/packet.hpp %/%/lp/sequence.hpp %/%/lp/tlv.hpp %/%/management/nfd-channel-status.hpp %/%/management/nfd-command-options.hpp %/%/management/nfd-control-command.hpp %/%/management/nfd-control-parameters.hpp %/%/management/nfd-control-response.hpp %/%/management/nfd-controller.hpp %/%/management/nfd-face-event-notification.hpp %/%/management/nfd-face-monitor.hpp %/%/management/nfd-face-query-filter.hpp %/%/management/nfd-face-status.hpp %/%/management/nfd-face-traits.hpp %/%/management/nfd-fib-entry.hpp %/%/management/nfd-forwarder-status.hpp %/%/management/nfd-local-control-header.hpp %/%/management/nfd-rib-entry.hpp %/%/management/nfd-rib-flags.hpp %/%/management/nfd-strategy-choice.hpp %/%/meta-info.hpp %/%/mgmt/control-parameters.hpp %/%/mgmt/control-response.hpp %/%/mgmt/dispatcher.hpp %/%/mgmt/status-dataset-context.hpp %/%/name-component.hpp %/%/name.hpp %/%/%-config.hpp %/%/security/additional-description.hpp %/%/security/certificate-cache-ttl.hpp %/%/security/certificate-cache.hpp %/%/security/certificate-container.hpp %/%/security/certificate-extension.hpp %/%/security/certificate-subject-description.hpp %/%/security/certificate.hpp %/%/security/conf/checker.hpp %/%/security/conf/common.hpp %/%/security/conf/filter.hpp %/%/security/conf/key-locator-checker.hpp %/%/security/conf/rule.hpp %/%/security/cryptopp.hpp %/%/security/digest-sha256.hpp %/%/security/identity-certificate.hpp %/%/security/identity-container.hpp %/%/security/identity.hpp %/%/security/key-chain.hpp %/%/security/key-container.hpp %/%/security/key-params.hpp %/%/security/key.hpp %/%/security/openssl.hpp %/%/security/pib-impl.hpp %/%/security/pib-memory.hpp %/%/security/pib-sqlite3.hpp %/%/security/pib.hpp %/%/security/public-key.hpp %/%/security/sec-public-info-sqlite3.hpp %/%/security/sec-public-info.hpp %/%/security/sec-rule-relative.hpp %/%/security/sec-rule-specific.hpp %/%/security/sec-rule.hpp %/%/security/sec-tpm-file.hpp %/%/security/sec-tpm.hpp %/%/security/secured-bag.hpp %/%/security/security-common.hpp %/%/security/signature-sha256-with-ecdsa.hpp %/%/security/signature-sha256-with-rsa.hpp %/%/security/signing-helpers.hpp %/%/security/signing-info.hpp %/%/security/validation-request.hpp %/%/security/validator-config.hpp %/%/security/validator-null.hpp %/%/security/validator-regex.hpp %/%/security/validator.hpp %/%/security/validity-period.hpp %/%/selectors.hpp %/%/signature-info.hpp %/%/signature.hpp %/%/tag-host.hpp %/%/tag.hpp %/%/transport/stream-transport.hpp %/%/transport/tcp-transport.hpp %/%/transport/transport.hpp %/%/transport/unix-transport.hpp %/%/util/backports.hpp %/%/util/command-interest-generator.hpp %/%/util/command-interest-validator.hpp %/%/util/concepts.hpp %/%/util/config-file.hpp %/%/util/crypto.hpp %/%/util/digest.hpp %/%/util/dns.hpp %/%/util/dummy-client-face.hpp %/%/util/ethernet.hpp %/%/util/face-uri.hpp %/%/util/in-memory-storage-entry.hpp %/%/util/in-memory-storage-fifo.hpp %/%/util/in-memory-storage-lfu.hpp %/%/util/in-memory-storage-lru.hpp %/%/util/in-memory-storage-persistent.hpp %/%/util/in-memory-storage.hpp %/%/util/indented-stream.hpp %/%/util/io.hpp %/%/util/monotonic_deadline_timer.hpp %/%/util/network-monitor.hpp %/%/util/notification-stream.hpp %/%/util/notification-subscriber.hpp %/%/util/random.hpp %/%/util/regex.hpp %/%/util/regex/regex-backref-manager.hpp %/%/util/regex/regex-backref-matcher.hpp %/%/util/regex/regex-component-matcher.hpp %/%/util/regex/regex-component-set-matcher.hpp %/%/util/regex/regex-matcher.hpp %/%/util/regex/regex-pattern-list-matcher.hpp %/%/util/regex/regex-pseudo-matcher.hpp %/%/util/regex/regex-repeat-matcher.hpp %/%/util/regex/regex-top-matcher.hpp %/%/util/scheduler-scoped-event-id.hpp %/%/util/scheduler.hpp %/%/util/segment-fetcher.hpp %/%/util/signal-connection.hpp %/%/util/signal-emit.hpp %/%/util/signal-scoped-connection.hpp %/%/util/signal-signal.hpp %/%/util/signal.hpp %/%/util/sqlite3-statement.hpp %/%/util/string-helper.hpp %/%/util/time-custom-clock.hpp %/%/util/time-unit-test-clock.hpp %/%/util/time.hpp %/%/version.hpp %/lib%.so %/pkgconfig/lib%.pc #----------------------------------------------------------------------------- %package -n %-tools %files -n %-tools %dir %/ndn %/ndn/client.conf.sample %/ndncatchunks3 %/ndnputchunks3 %/ndnsec %/ndnsec-cert-dump %/ndnsec-cert-gen %/ndnsec-cert-install %/ndnsec-cert-revoke %/ndnsec-certgen %/ndnsec-delete %/ndnsec-dsk-gen %/ndnsec-dskgen %/ndnsec-dump-certificate %/ndnsec-export %/ndnsec-get-default %/ndnsec-import %/ndnsec-install-cert %/ndnsec-key-gen %/ndnsec-keygen %/ndnsec-list %/ndnsec-ls-identity %/ndnsec-op-tool %/ndnsec-operator-tool %/ndnsec-set-acl %/ndnsec-set-default %/ndnsec-sig-verify %/ndnsec-sign-req %/ndnsec-unlock-tpm %/tlvdump %/man1/ndnsec-cert-dump.1.xz %/man1/ndnsec-cert-gen.1.xz %/man1/ndnsec-cert-instal.1.xz %/man1/ndnsec-cert-revoke.1.xz %/man1/ndnsec-delete.1.xz %/man1/ndnsec-export.1.xz %/man1/ndnsec-get-default.1.xz %/man1/ndnsec-import.1.xz %/man1/ndnsec-key-gen.1.xz %/man1/ndnsec-list.1.xz %/man1/ndnsec-set-acl.1.xz %/man1/ndnsec-set-default.1.xz %/man1/ndnsec-sign-req.1.xz %/man1/ndnsec-unlock-tpm.1.xz %/man1/ndnsec.1.xz %/man1/tlvdump.1.xz %/man5/ndn-client.conf.5.xz %/man5/ndnsec-validator.conf.5.xz %prep %setup -qn %-% %build CXXFLAGS="-O2" ./waf configure --prefix=%% \ --destdir=% \ --exec-prefix=%% \ --sysconfdir=%% \ --localstatedir=%% \ --with-examples \ --disable-static \ --enable-shared # # Full set of documentation (tutorials + API) in build/docs # ./waf docs # # # Only tutorials in `build/docs` # ./waf sphinx # # # Only API docs in `build/docs/doxygen` # ./waf doxygen ./waf %install ./waf install #%%pre -p ldconfig #%%post -p /sbin/ldconfig #%%postun -p /sbin/ldconfig